EEPROM에 데이터를 저장하고 껏다가 키면 데이터 값이 2씩 증가해 있는데
이 문제에 대해 경험하시거나 아시는 분 계시나요... 도와주세요...
https://wiki.kldp.org/wiki.php/DocbookSgml/Beginner_QA-KLDP#AEN70
세벌 https://sebuls.blogspot.kr/
EEPROM에 데이터 값을 저장하여 껏다 켜면 그 저장된 값을 그대로 불러와야하는데 그러지 못합니다.
데이터 시트를 참고하여 작성하였는데도 이러한 문제가 발생하여 질문합니다.
int main(void) { DDRC = 0XFF; DDRA = 0xFF; DDRG = 0xFF; MCUCR = 0X80; XMCRA = 0XC1; XMCRB = 0X80;
Count = CT_Read(addr); while(1) { for(i; i<10; i++) { Count++; CT_Write(addr, Count); } } }
unsigned char CT_Read(unsigned int u16addr) { while(EECR & 0x02); EEAR = u16addr;
EECR |= 0x01; return EEDR; } void CT_Write(unsigned int u16addr, unsigned char u8Count) { while(EECR & 0x02); EEAR = u16addr; EEDR = u8Count; EECR |= 0x04; EECR |= 0x02; }
EEPROM에 값이 잘저장되는지 확인하기위해 이와같이 작성하여 실험하는데도 값이 제대로 저장이 안됩니다..
혹시 while문에 넣으면 안되거나 for문에서 저장하면 안되는 조건들이 있나요?
코드 상의 문제점 - 변수 addr의 초기 값이 없습니다 - for문 안의 변수 i의 선언문/초기값이 없습니다
header파일 있을 듯한데... 그리고 code을 보기 좋게 올리는 방법이 있으니 찾아서 적용하시면 좀 더 댓글이 많아 지겠지요
껏다 켜면 값이 증가해 있다는 것이 맞나요? 끄기전에 다시 읽어보면 증가해 있지 않은것이 확인 되었습니까? 예를 들어주신 코드를 보면 같은 하나의 주소에 값을 쓰는동작을 쉬지도 않고 무한반복하고 있네요.(물론 for문이 동작안하고 있을 수도 있겠지만) eeprom 수명이 다 되었을수도 있으니 확인하셔야 겠습니다.
코멘트를 드리자면
addr 값이 정해진 바가 없음 write 할 때 addr이 변경되지 않음.. 즉 0..9까지 한 주소에 쭉 써짐.
그리고 추가적으로 EERPOM은 상대적으로 느린 장치이기 때문에 delay() 처럼 약간의 딜레이를 쓰기, 읽기 사이에 넣어주어야 할 수도 있습니다. EEPROM 스펙 문서를 보세요. write에 최소한 몇 us가 걸리는지...
CPU는 생각외로 빨라서 몇 us 동안에 수백번도 쓸수 있어요.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
https://wiki.kldp.org/wiki
https://wiki.kldp.org/wiki.php/DocbookSgml/Beginner_QA-KLDP#AEN70
세벌 https://sebuls.blogspot.kr/
죄송합니다.
EEPROM에 데이터 값을 저장하여 껏다 켜면 그 저장된 값을 그대로 불러와야하는데 그러지 못합니다.
데이터 시트를 참고하여 작성하였는데도 이러한 문제가 발생하여 질문합니다.
int main(void)
{
DDRC = 0XFF;
DDRA = 0xFF;
DDRG = 0xFF;
MCUCR = 0X80;
XMCRA = 0XC1;
XMCRB = 0X80;
Count = CT_Read(addr);
while(1)
{
for(i; i<10; i++)
{
Count++;
CT_Write(addr, Count);
}
}
}
unsigned char CT_Read(unsigned int u16addr)
{
while(EECR & 0x02);
EEAR = u16addr;
EECR |= 0x01;
return EEDR;
}
void CT_Write(unsigned int u16addr, unsigned char u8Count)
{
while(EECR & 0x02);
EEAR = u16addr;
EEDR = u8Count;
EECR |= 0x04;
EECR |= 0x02;
}
EEPROM에 값이 잘저장되는지 확인하기위해 이와같이 작성하여 실험하는데도 값이 제대로 저장이 안됩니다..
혹시 while문에 넣으면 안되거나 for문에서 저장하면 안되는 조건들이 있나요?
뭐든 처음에는 힘들지요
코드 상의 문제점
- 변수 addr의 초기 값이 없습니다
- for문 안의 변수 i의 선언문/초기값이 없습니다
header파일 있을 듯한데...
그리고 code을 보기 좋게 올리는 방법이 있으니 찾아서 적용하시면 좀 더 댓글이 많아 지겠지요
껏다 켜면 값이 증가해 있다는 것이 맞나요?
껏다 켜면 값이 증가해 있다는 것이 맞나요?
끄기전에 다시 읽어보면 증가해 있지 않은것이 확인 되었습니까?
예를 들어주신 코드를 보면 같은 하나의 주소에 값을 쓰는동작을 쉬지도 않고 무한반복하고 있네요.(물론 for문이 동작안하고 있을 수도 있겠지만)
eeprom 수명이 다 되었을수도 있으니 확인하셔야 겠습니다.
코멘트를 드리자면
코멘트를 드리자면
addr 값이 정해진 바가 없음
write 할 때 addr이 변경되지 않음.. 즉 0..9까지 한 주소에 쭉 써짐.
그리고 추가적으로 EERPOM은 상대적으로 느린 장치이기 때문에 delay() 처럼 약간의 딜레이를 쓰기, 읽기 사이에 넣어주어야 할 수도 있습니다. EEPROM 스펙 문서를 보세요. write에 최소한 몇 us가 걸리는지...
CPU는 생각외로 빨라서 몇 us 동안에 수백번도 쓸수 있어요.
댓글 달기