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

Utrata danych w eepromie [M32]

figa_miga 21 Sie 2011 19:30 1361 6
REKLAMA
  • #1 9848127
    figa_miga
    Poziom 19  
    Zastanawiam się czemu co jakiś czas zaskakują mnie dziwne wartości.

    Procedury wyglądają tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Przed zapisem/odczytem sprawdzam flage zajętości, urządzenie zasilane cały czas więc jakieś zaniki przy zapisie raczej wykluczam. Obstawiam bubla w sofcie, mam rację?
  • REKLAMA
  • #2 9848175
    snnaap
    Poziom 25  
    Wywłaszcza przerwania przed SAVE_RAM(void) ?

    Pomiędzy poszczególnymi liniami
    EEPROM_write(adr++, sun_lvl), suma=sun_lvl;
    EEPROM_write(adr++, pmp_min), suma=+ pmp_min;
    EEPROM_write(adr++, pmp_max), suma=+pmp_max;
    EEPROM_write(adr++, suma);
    zastosuj opóźnienia ok. 10ms.
  • REKLAMA
  • #3 9848515
    figa_miga
    Poziom 19  
    Nie blokuje przerwań, LOAD i SAVE jest tylko z poziomu programu głównego, po co 10ms skoro przed każdą operacją sprawdzana jest flaga zajętości?
  • REKLAMA
  • #4 9848575
    snnaap
    Poziom 25  
    figa_miga napisał:
    Nie blokuje przerwań, LOAD i SAVE jest tylko z poziomu programu głównego, po co 10ms skoro przed każdą operacją sprawdzana jest flaga zajętości?


    Sorki nie przyuważyłem pierwszej linii.
    Używasz przerwań czy nie?
    Pomiędzy liniami
    EECR |= (1<<EEMWE);
    EECR |= (1<<EEWE);
    nie może wystąpić żadne przerwanie. Tak wiec zalecane jest wyłanianie przerwań na czas wykonywania tych instrukcji.
  • #5 9848651
    figa_miga
    Poziom 19  
    Faktycznie, zapomniałem że nie może minąć więcej jak 4 cykle. Poprawie i zobaczymy.
  • REKLAMA
  • #6 9848928
    mirekk36
    Poziom 42  
    A tak z ciekawości zapytam - po co wyważasz tzw głową mur albo otwarte drzwi , pisząc własną obsługę zapisu do EEPROM z jakimiś tam oczekiwaniami itp itd itp

    Skoro w AVR GCC masz gotowe, wbudowane i porządnie działające funkcje do tego celu, gdzie nie trzeba żadnych takich cyrkowych sztuczek robić. Chyba że czegoś nie zrozumiałem.
  • #7 9865330
    percol
    Poziom 12  
    Utrata danych w EEPROMie może zdarzyć się w wyniku problemów z napięciem zasilania (chwilowe zaniki lub wyłączenie urządzenia) podczas gdy uC korzysta akurat z EEPROMa (tego zwykle nie przewidzisz). Dotyczy to zarówno zapisu jak i odczytu.
    Zwykle utracie ulega zawartość komórki o adresie 0 (read/write), rzadziej inne komórki (przy write).
    Dlatego rozsądnym jest użycie wbudowanego systemu detekcji spadku napięcia zasilania poniżej krytycznego (dla wbudowanego EEPROMu jest to zwykle 1,9..2,1V - szukaj w erracie, przeczytaj też "preventing EEPROM corruption" w datasheet swojego uC), tj. Brown-out Detector (więcej w opisie fuse bytes - BOD Level itd).
    Powodzenia!


    P.
REKLAMA