Witam mam następujący kawałek kodu:
Po uruchomieniu go zawartosc pamieci EEPROM wyglada tak:
002000: FF 61 62 64 FF 65 66 67 czyli :
. a b d . e f g
Jak to się dzieje - że nie można nadpisać lokacji 0x0006 w EEPROMIE ( powinna tam się znaleźć litera 'z'), natomiast można nadpisać lokację 0x0003 (najpierw wpisuje 'c' a potem nadpisuje i jest 'd'), jak zauważyłem dzieje się to dopiero po kilku wywołaniach funkcji zapisu do EEPROMU. Zaznaczam że próbowałem wielu sposobów - tzn napisałem własną funkcję do zapisu, wziętą z datasheeta atmegi - dzieje się to samo, próbowałem wprowadzać opóźnienia po zapisie (przy pomocy funkcji eeprom_busy_wait() z eeprom.h) - to samo. Uruchomienie Brown-out Detector'a również nic nie dało. Kolejnym - choć nie największym problemem jest moja funkcja :
Linia EECR |= (1<<EEWE) nie działa, tzn. w rejestrze EECR nie jest ustawianay bit EEWE - tak pokazuje symulator Avr Studio, ani też po wrzuceniu do mikroprocesora w EEPROMIE nic nie jest zapisywane, dopiero po zmianie tej linii na : program zapisuje do EEPROMU (choć oczywiście pozostaje problem z nadpisywaniem).
Nie mam pojęcia w czym problem. Używam Atmega8 zegar 1MHz, Avr Studio v 4.12 build 490 z Service Pack 3, WinAVR wersja 20060421, a do programowania PonyProga 2000. Podejrzewam że nie jest to wina np za niskiego napięcia, lub czegoś podobnego, bo EEPROM jest zapisywany i po wyłączeniu zasilania jego zawartość jest zachowana, natomiast niemożliwość ponownego zapisania raz już zapisanej komórki pamięci, po zapisaniu kilku bajtów doprowadza mnie do szału. Bardzo prosze o sugestie i porady dotyczące mojego przypadku
int main()
{
eeprom_write_byte ((char*)0x0001,'a');
eeprom_write_byte ((char*)0x0002,'b');
eeprom_write_byte ((char*)0x0003,'c');
eeprom_write_byte ((char*)0x0003,'d');
eeprom_write_byte ((char*)0x0005,'e');
eeprom_write_byte ((char*)0x0006,'f');
eeprom_write_byte ((char*)0x0006,'v');
eeprom_write_byte ((char*)0x0007,'g');
eeprom_write_byte ((char*)0x0006,'z');
}Po uruchomieniu go zawartosc pamieci EEPROM wyglada tak:
002000: FF 61 62 64 FF 65 66 67 czyli :
. a b d . e f g
Jak to się dzieje - że nie można nadpisać lokacji 0x0006 w EEPROMIE ( powinna tam się znaleźć litera 'z'), natomiast można nadpisać lokację 0x0003 (najpierw wpisuje 'c' a potem nadpisuje i jest 'd'), jak zauważyłem dzieje się to dopiero po kilku wywołaniach funkcji zapisu do EEPROMU. Zaznaczam że próbowałem wielu sposobów - tzn napisałem własną funkcję do zapisu, wziętą z datasheeta atmegi - dzieje się to samo, próbowałem wprowadzać opóźnienia po zapisie (przy pomocy funkcji eeprom_busy_wait() z eeprom.h) - to samo. Uruchomienie Brown-out Detector'a również nic nie dało. Kolejnym - choć nie największym problemem jest moja funkcja :
void write_EEPROM(unsigned int addr, unsigned char dane)
{
while (EECR & (1<<EEWE));
cli();
EEAR = addr;
EEDR = dane;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
sei();
}Linia EECR |= (1<<EEWE) nie działa, tzn. w rejestrze EECR nie jest ustawianay bit EEWE - tak pokazuje symulator Avr Studio, ani też po wrzuceniu do mikroprocesora w EEPROMIE nic nie jest zapisywane, dopiero po zmianie tej linii na :
EECR = (1<<EEWE);Nie mam pojęcia w czym problem. Używam Atmega8 zegar 1MHz, Avr Studio v 4.12 build 490 z Service Pack 3, WinAVR wersja 20060421, a do programowania PonyProga 2000. Podejrzewam że nie jest to wina np za niskiego napięcia, lub czegoś podobnego, bo EEPROM jest zapisywany i po wyłączeniu zasilania jego zawartość jest zachowana, natomiast niemożliwość ponownego zapisania raz już zapisanej komórki pamięci, po zapisaniu kilku bajtów doprowadza mnie do szału. Bardzo prosze o sugestie i porady dotyczące mojego przypadku