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

ATmega32 i problem przy zapisie do eepromu

ksarim 17 Mar 2009 20:17 1223 7
REKLAMA
  • #1 6295685
    ksarim
    Poziom 15  
    Witam

    Mam problem przy zapisie do eepromu wewnętrznego ATmegi32. Problem jest w tym, że podczas zapisu do eepromu uC się "gubi" a dokładnie "gubi" się przerwanie do obsługi klawiatury PC co praktycznie uniemożliwia poprawne odczytanie wciskanych na klawiaturze klawiszy. Jest to prawdopodobnie spowodowany dość długim czasem zapisu gdyż przy zapisie 5 bajtów nie ma żadnego problemu i klawiatura działa poprawnie. Natomiast przy zapisie już 20 bajtów uC przestaje poprawnie reagować na klawiaturę chociaż sam zapis do eepromu odbywa się prawidłowo.

    Zapis do eepromu odbywa się w następujący sposób:
    for(zp1=1;zp1<20;zp1++)
    eeprom_write_byte ((unsigned char *)zp1, dane[zp1]);

    Próbowałem blokować przerwania na czas wykonywania zapisu do eepromu ale to nic nie daje. Próbowałem już na wiele sposobów i cały czas to samo i nie bardzo wiem czego mogę jeszcze spróbować. Za wszelkie sugestie z góry dziękuje.
  • REKLAMA
  • #2 6295874
    krzemowy
    Poziom 19  
    Zrób sam zapis do EEPROMu na przerwaniu :) Miałem podobny problem tyle że u mnie był zapisywany segment 128 bajtów, włączanie zapisu zamrażało procesor na wyraźnie zauważalny czas(chyba rzędu sekundy jeżeli mnie pamięć nie myli). Rozwiązałem to następująco:
    - przygotowywana jest tablica z danymi do zapisu
    - funkcja wyzwalająca zapis inicjuje wskaźnik do tablicy, włącza przerwanie od gotowości EEPROMu i wrzuca do pamięci pierwszy bajt nie czekając na nic
    - funkcja obsługująca przerwanie od EEPROMu wsuwa do pamięci po kolei następne bajty z tablicy, jak już wszystko zapisze to wyłącza przerwanie od EEPROMu i gotowe :)
  • REKLAMA
  • #3 6295960
    ksarim
    Poziom 15  
    Ciekawe rozwiązanie tylko nie bardzo wiem o jakim przerwaniu od EEPROMu mówisz? Tak jak napisałem wcześniej wykorzystuje wewnętrzny EEPROM Atmegi32 i pierwszy raz słyszę o czymś takim.
  • #4 6295993
    dawid512
    Poziom 32  
    A czy musisz zapisywać wszystkie te dane za jednym razem? Wg mnie można zrobić sobie jakąś flagę która informuje że dane przerwanie się zakończyło i dopiero wtedy robić zapis.
  • #5 6296050
    ksarim
    Poziom 15  
    Niestety te dane najlepiej byłoby zapisać za jednym razem lub w bardzo krótkim odstępie czasu. Taką flagę już robiłem zarówno dla samego przerwania jak i dla zapisu i nic to nie zmieniło.
  • REKLAMA
  • Pomocny post
    #6 6296496
    krzemowy
    Poziom 19  
    RTFM, pdf nt. ATMega32, strona 19:
    Cytat:

    Bit 3 – EERIE: EEPROM Ready Interrupt Enable
    Writing EERIE to one enables the EEPROM Ready Interrupt if the I bit in SREG is set.
    Writing EERIE to zero disables the interrupt. The EEPROM Ready interrupt generates a
    constant interrupt when EEWE is cleared.


    Gdyby się nie dało zrobić jak pisałem tobym Ci głowy głupotami nie zawracał :)
  • REKLAMA
  • #7 6296548
    kaktus_c++
    Poziom 18  
    ja bym proponował spróbować tak:
    for(zp1=1;zp1<20;zp1++)
    {
    cli();
    eeprom_busy_wait();
    eeprom_write_byte ((unsigned char *)zp1, dane[zp1]);
    eeprom_busy_wait();
    sei();
    }
  • #8 6298136
    ksarim
    Poziom 15  
    Krzemowy WIELKIE DZIĘKI. Wykorzystałem przerwanie o którym pisałeś i teraz wszystko pięknie śmiga :D Nawet nie widać, że się coś zapisuje a wcześniej taka operacja była widoczna bo powodowała chwilowe "zamrożenie" uC.

    Kaktus Twoją propozycję już wcześniej sam sprawdzałem i niestety to nie pomagało.

    Wszystkim dziękuje za pomoc.
REKLAMA