logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

EEPROM i Atmega8 - problem z nadpisywaniem danych w lokacji 0x0006

venom23 07 Sie 2006 16:49 2696 5
REKLAMA
  • #1 2889687
    venom23
    Poziom 11  
    Posty: 7
    Witam mam następujący kawałek kodu:
    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);
    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 ;)
  • REKLAMA
  • #2 2889775
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 51
    A co na to symulator , czy też nie chce nadpisać eepromu :?:

    Piotrek
  • REKLAMA
  • #3 2889780
    romario4
    Poziom 16  
    Posty: 138
    Pomógł: 17
    Ocena: 3
    Witam!
    Kiedyś miałem podobny problem z pamięcią EEPROM w atmega168, polegający na uszkodzonych kilkunastu początkowych komórek pamięci i jedynym wyjściem było przerzucić się na wyższe adresy. Pamiętam że przenosiłem pewien projekt z atmegi8 na atmegę168 w którym to dosyć intensywnie wykorzystywałem pamięć EEPROM, w związku z czym dodatkowo miałem niemało zabawy.
    Pozdrawiam.
  • REKLAMA
  • #4 2889826
    venom23
    Poziom 11  
    Posty: 7
    Próbowałem przenieść dane na koniec EEPROMu, ale dzieje się dokładnie to samo, a w symulatorze wszystko wygląda tak jak powinno.
  • REKLAMA
  • Pomocny post
    #5 2892391
    Smoczy
    Poziom 20  
    Posty: 434
    Pomógł: 26
    Ocena: 67
    a czy odczekujesz, aż pamięć zdąży wykonać operację zapisu? Potrzeba jej na to ok 10ms. Byćmoże symulator to tego nie uwzględnia. Wstaw delay między poszczególne operacje zapisu do pamięci, lub testuj flage zakończenia zapisu do pamięci.
  • #6 2892973
    venom23
    Poziom 11  
    Posty: 7
    RACJA !! wprowadziłem opoźnienie przy pomocy funkcji eeprom_busy_wait() i rzeczywiście zapisuje tak jak powinien, wcześniej musiałem po prostu źle używac funkcji eeprom_is_ready() i dlatego opoźnienia przeze mnie wprowadzane nic nie dawały, dzieki za rozwiazanie problemu
REKLAMA