Trwałość pamięci EEPROM

Oct 15, 2005 20 Replies

Witam



Ostatnio sporo bawię się uC, i odkryłem jak zachowywać dane po wyłączeniu zasilania. Kluczem do zagadni jest słówko eeprom. Wyczytałem ostatnio w Bardzo Mądrej Księdze, że tego typu pamięci mają ograniczoną żywotność (coś z kilkoma zerami liczby zapisów). Teraz pytanie zasadnicze: czy technika eepromów się już udoskonaliła, a jeśli nie to jak sobie poradzić jeśli uC ma przeżyć parę lat kiedy np co sekunda zapisuje wartość do eepromu?


scx napisał(a):

Ta trwałość sie tyczy zapisu do pojedynczej komórki ( albo czasem strony ) pamięci. Jeśli zapisujesz jakieś dane co sek. do kolejnych adresów to trwałośc pamięci nie będzie ograniczeniem.

Trudno powiedzieć, bo nie napisałeś ile tam było zer. W każdym razie wciąż jest to ilość skończona. Jeśli to Ci przeszkadza to musisz poznać nowe słowo kluczowe FRAM.

formatting link

"Miłosz K." się wziął i wyklepał:

Zapisuję właśnie do pojedyńczej komórki - powiedzmy że jest to licznik "ostatniej pozycji" Po prostu cyklicznie zapisuję sobie wartość do komórki, także w momencie kiedy zasilanie padnie na pewno mam zapisaną właściwą liczbę. Wtedy podczas rozruchu i pierwszego odczytu kontynuujemy od miejsca w którym skończyliśmy

mokule się wziął i wyklepał:

Coś mi się kojarzy że 3, ale może 4

Hmmm, no fajnie, wszystko super, ale: Zamiast prostej definicji zmiennej jako eeprom mam teraz troszkę roboty z

2wire, no i 4k pamięci kosztuje 10zł Mi się nie da dogodzić :P

To przemyśl algorytm zapisywania tak aby rozłożyć zużycie pamięci równomiernie po całym dostępnym obszarze. Czyli jeżeli potrzebujesz zapamiętać tylko jeden bajt a pamięć ma 1 kilobajt, zapisuj swoją daną najpierw w komórce o adresie 0, potem pod adresem 1, potem pod adresem 2 itd. Skomplikuje się conajwyżej algorytm wyszukiwania ostatnio używanej komórki - ale to nie problem jeżeli zapisujesz licznik, który rośnie monotonicznie. W innym przypadku też da się zrobić zapisując oprócz właściwej danej również np. licznik kolejnych zapisów (1,2,3 itd).

Tak że jeżeli masz np. pamięć, którą można programować wg producenta 10 tys razy - to zapisując bajt w kolejnych komórkach zamiast ciągle w tej samej, dostajesz 10 mln dopuszczalnych zapisów.

Dobry przykład tej metody podaje w nocie aplikacyjnej Atmel: "AVR101: High Endurance EEPROM Storage"

formatting link

Adam Dybkowski się wziął i wyklepał:

Co daje mi 4 miesiące pracy... Zresztą EOT, urządzenie pozostaje w sferze "byćmożekiedyś" a pytanie było w sumie teoretyczne :) W każdym razie dzięki za oświetlenie tematu

W takim razie musisz zastosować inny rodzaj pamięci nieulotnej. NVRAM albo FRAM. Niestety zewnętrznej, zatem dodatkowy scalak i troszkę kodu do obsługi, ale problem rozwiązany na długi czas (życie bateryjki w NVRAM albo 10^10 zapisów we FRAM)

TP.

Tomasz Piasecki napisał(a):

Albo najzwyklejszy ram i jakiś MAX695 + bateria. Tak się to robiło jak nie było NVRAM'ów z bateryjkami w środku albo FRAM'ów.

Dokladnie. Np. drukarki Epsona FX1050 i DFX8000 mialy w srodku 6264LP i baterie litowa rozmiaru ciut wiekszego, niz AA.

Adam Dybkowski napisał(a):

no nie da rady tak, nie można robić licznika bo ta komórka się zużyje. jedynie powiedzmy zapis po kolei i sprawdzanie np. ostatniej zajętej pozycji oczywiście przyjmując jakiś stan za zerowy. Po przekroczeniu tablicy zerowanie komórek i zapis w pierwszej

jedna komórka eeprom o wytrzymałości 10mln zapis/kasowanie da możliwość zapisu co sekundę przez 115 dni mniej więcej.

Witam.. A nie lepiej dorobic uklad z wiekszym kondensatorem na zasilaniu procesora i dioda wykrywajaca zanik napiecia na jakies przerwanie,a na przerwaniu zrobic zapis do pamieci - energii w kondensatorze wystarczy procesorowi na zapis do eeproma i wtedy masz po klopocie. Ewentualnie w drugiej komorce robisz jakis zapis kontrolny co 100/1000 przekrecen licznika - napisz czego to ma byc licznik - tzn. jaki jest czas impulsu itp. bo jak to bedzie licznik otwarc drzwi albo impulsow w KHz to beda to roznice - chodzi mi o to czy faktycznie apis co sekunde jest potrzebny i bardzo krytyczna jest zapisana tam wartosc Pozdr ART

No to doczep dowolny RTC z pamięcią RAM (taki jak np. DS1306). Dostaniesz 96 bajtów pamięci RAM podtrzymywanej baterią (np. CR2032) a do tego gratis RTC ;-) który też się może przydać. Czas podtrzymania: kilka lat. Dłużej przy zastosowaniu większej baterii litowej, np. SAFT rozmiaru R12 (kilkanaście Ah).

Użytkownik "scx" snipped-for-privacy@wp.pl napisał w wiadomości news:dirrtv$nhh$ snipped-for-privacy@news.onet.pl...

Jesteś tak całkiem pewien, że wszystkie bity zdążyły się zapisać gdy zanikało zasilanie (proces zapisu EEPROMu trochę jednak trwa i mogło w niego trafić). Jeśli licznik jest więcej niż jednobajtowy to: jesteś całkiem pewien, że zapis nie został przerwany między bajtami. Miałeś stan hi=1, lo=255, zapisujesz hi=2, lo=0. Zależnie od kolejności zapisu przy zaniku zasilania może się okazać, że zapisane zostało 1,0, albo

2,255 P.G.

BTW: co sie dzieje ze zuzytym flashem? Jest tu jakas regula?

hej

Ja kiedyś spotkałem taki, w którym kasowanie działało nie do końca. Czyli po skasowaniu prawie wszystkie bajty miały wartość 0xff ale kilkanaście bitów pozostawało zerowych.

Użytkownik "Lukasz Spychalski":

Czy moze ktos podac kawalek przykladowego (sprawdzonego!) schematu z pamiecia RAM podtrzymywana bateryjnie, ale w taki sposob, ze nie wystepuja losowe zapisy w momencie wlaczania\wylaczania (stany nieustalone na magistralach danych, adresowych i sterujacych) ?

Pozd Albatros

Użytkownik "Albatros" snipped-for-privacy@wolny.ptak.w.pl> napisał w wiadomości news:dj3oae$bf8$ snipped-for-privacy@atlantis.news.tpi.pl

Własnie MAX691 itp.

formatting link
Oprócz tego, że nadzorują napięcie zasilania i generują RESEST to jeszcze, wstawione między uP a RAM, odcinają sygnał CE\.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required