Micom_Electric 2012. 3. 11. 14:34
일단 퍼옴

http://xenostudy.tistory.com/129 

AVR / 예제소스 / EEPROM 기본개념

Xeno's Study Blog (http://XenoStudy.tistory.com) 
- 글쓴이 : xeno 
- 출처 : 나 , 인터넷에 널린 AVR코딩한 소스분석함.. 
- 기타사항 : winAVR기준 / 틀린사항이나 오류발생시 댓글 부탁드립니다.

대부분의 경우 eeprom에는 파라미터 같은 정보... 
(껐다 켜지더라도 계속 유지되어야 하는값과 비슷한것들..)을 넣는 역할을 하게된다.

이때는 내부 Flash Rom 과는 약간 다른역할을 하는듯하다. 추후 스터디하여 새로포스팅예정..;;;

기본적으로 read 함수구현 .. 

  1. int8_t read_eeprom(u16 adr)   
  2. {  
  3.     return (int8_t)eeprom_read_byte ((const uint8_t *)adr);   
  4. }  

==> AVR의 경우 메모리맵 IO로 되어있다. 즉 EEPROM은 메모리의 어딘가에 할당이 되어있으며 해당 메모리 주소를 바로 접근하는 방식으로 EEPROM에 접근가능하다. eeprom_read_byte() 는  winavr에서 eeprom.h 로 api 제공된다.

기본적으로 writing 함수구현..

  1. u08 write_eeprom(u16 adr, BYTE dd)   
  2. {  
  3.    u08 rd = dd^0xff; //단순히 입력과 다르게 하려고...   
  4.    while(rd != dd)  
  5.    {  
  6.        eeprom_write_byte ((uint8_t *)adr, dd); // eeprom.h  
  7.        Delay_us(50);  
  8.        rd = eeprom_read_byte ((const uint8_t *)adr); // eeprom.h  
  9.        Delay_us(50);  
  10.    }  
  11.    return (u08) rd;  
  12. }  

==> 기본적으로... eeprom에 쓴다음... 약간의 딜레이후에 다시 읽어서 리턴값으로 잘써졌는지 확인한다. eeprom의 경우 미스나서 잘 안써질수도있으니 주의할것! (그래서 피드백방식으로 코딩한듯..) eeprom_write_byte 는 winavr 컴파일러에서 eeprom.h 에서 제공해주는 api

eeprom에 대량으로 데이터 저장하는 함수구현...

대부분의 경우 eeprom에는 코딩시... 특정 파라미터 같은 정보... (껐다 켜지더라도 계속 유지되어야 하는값과 비슷한것들..)을 넣는 경우가 많다. 그러므로 각각의 파라미터들은 구조체한번에 관리하는것이 편하다. 이때 eeprom에 접근할때는 그 구조체의 길이 주소값을 가감산해주면서 접근해야 제대로된 값을 얻을수가 있다.

  1. u08 SaveEEPData(void)  
  2. {  
  3.  . . . .   
  4.     for(i=0; i<len; i++)  
  5.     {  
  6.         aa = read_eeprom((u16)(addr_a+i));  
  7.         bb = read_eeprom((u16)(addr_b+i));  
  8.         cc = read_eeprom((u16)(addr_c+i));  
  9.         dd = ped[i];  
  10.         if(aa!=dd)   write_eeprom((u16)(addr_a+i), dd);  
  11.         if(bb!=dd)   write_eeprom((u16)(addr_b+i), dd);  
  12.         if(cc!=dd)   write_eeprom((u16)(addr_c+i), dd);  
  13.     }  
  14.     return 0;  
  15. }  


==> 위의 소스에서는 aa bb cc에 각각의 데이터가 들어가게 된다. 이때 주소값의 연산으로 해서 다른데이터들까지 검사.... 대량으로 Read 하는경우도 위의 함수를 적절히 수정하면 간단하게 해결될듯하다




posted by 털보네i
: