Trwałość EEPROM w AVR

Nov 16, 2008 33 Replies

Witam Robię projekt w którym pamięć EEPROM będzie narażona na częste przepisywanie. Ogólnie trwałość jest określona jako 10.000 - to niedużo jak na moje zastosowanie.



Pomijając techniki zwiększania ilości zapisów stosując kolejne komórki do zapisu mam pewne pytanie. Potrzbuję zapisać do 8 stanów w jednej komórce. Czy zamiast zapisywać jako kolejną liczbę, będę stosował zapis typu b'11111110' b'11111101' tzn, zawsze będzie tylko jedno zero w bajcie, zwiększę ilość możliwych zapisów? Wydaje mi się, że komórka się zużywa zapisując 0 na danej pozycji. Czy dobrze myślę? Może ktoś to potwierdzić?


EM pisze:

Czy chcesz się zabezpieczyć przed utratą prądu?

Dnia Sun, 16 Nov 2008 14:11:49 +0100, EM napisał(a):

10 tysiecy cykli jest dla pamieci programu. EEPROM ma np. w atmegach na pewno 100 tys cykli - nie wiem czy to cos dla Ciebie zmienia, ale jednak to 10 razy wiecej.

m.

Madz pisze:

No racja, 100tyś. Ale to i tak nie za dużo. Dla porównania w PICach jest

1 milion, co prawda jest jeszcze kwestia co to oznacza. Tak czy inaczej pozostaje kwestia pytania:

Po prostu nie zapisuj, jeśli dana do zapisania się nie zmieniła. Nie wiem co robisz, ale jeżeli potrzebujesz pamiętać szybko zmieniający się parametr na wypadek zaniku zasilania, to albo weź większą pamięć (np.24c512) i zapisuj kolejne komórki, albo zasilaj AVR-a z małego akumulatorka (goldcap-a?) i zapisuj dopiero po wykryciu zaniku tego głównego zasilania. Osobiście miałem do czynienia z padniętą pamięcią w telewizorze, ale nie miało to raczej znaczenia, która komórka ile razy była zapisywana - co prawda najpierw nie dało się zapisać 1 programu, ale w krótkim czasie nie dało się już żadnego.

Mirek.

irek pisze: > EM wrote: >

Nie chciałby podawać szczegółów projektu, ale jest kilka kryteriów.

  1. Zapisywane jest za każdym razem co innego - sprawa oszczędzania zapisuje, jeśli byłoby to samo do zapisania jest oczywista.
  2. Nie ma miejsca na podtrzymanie zasilania, ani na zewnętrzną pamięć. Na procek jest mało miejsca :). Oczywiście technika wykorzystywania kolejnych komórek pamięci wydaje się odpowiednia. Po prostu w jednej komórce zapiszę adres komórki z daną. Jeśli w trakcie weryfikacji otrzymam błąd więcej niż 1 raz, to inkrementuję adres i po sprawie. Poza implementacją kwestia jeszcze sprawdzenia takiego algorytmu.

Pozdr EM

Koniecznie. Trzeba więc "zamordować" jedną komórkę eeproma i sprawdzić, czy nie ma to wpływu na następne.

Mirek.

Troche powatpiewam. Zuzywa sie chyba tez w czasie kasowania.

W starej technice UV EPROM moglbys cos pokombinowac zeby do komorki skasowanej [FF] wpisac jedno zero [FE], nastepnie bez kasowania zaprogramowac kolejne zero [FD] - odczytaja sie juz dwa [FC]. I dopiero za 8-mym razem skasowac calosc.

Ale przeciez w AVR nie masz dostepu na takim poziomie..

J.

Mozesz miec problem ze weryfikacja przechodzi poprawnie, a pozniejszy odczyt przy innym napieciu, temperaturze itp juz nie.

Raczej od poczatku bym rozrzucal zapisy .. tylko ze wtedy nie mozna w jednej komorce zapisywac ktory jest dobry :-)

J.

Pan J.F napisał:

W praktyce rozwiązuje się to w ten sposób, że w komórkach tablicy przeznaczonej do tego zapisu, jeden bit przeznacza się na wskaźnik ważności danych. Komórka "dobra" to ta, która ma ten bit taki sam jak w komórce pierwszej (zerowej) i jednocześnie najwyższy indeks w tablicy. Rezerwując na przykład tablicę o rozmiarze 32, otrzymamy

32-krotny wzrost żywotności ustrojstwa. Kosztem wydłużenia dostępu do danych w niekturych sytuacjach. Średnio 16 razy i maksymalnie 32 razy.

Dawno temu, z dziesięć lat albo i więcej, miałem do czynienia z jakimiś pierwszymi wersjami procesorów z nieulotną pamięcią. Ile cykli miały wytrzymywać, to nie było istotne, chodziło o zapis danych kalibracyjnych urządzenia. Tyle że sam zapis im średnio wychodził, bo raz na ileś przypadków dane były przekłamane. Stanęło na tym, że ważność danych zostanie rozstrzygnięta demokratycnie przez głosowanie. Koder dostał wytyczne, że ma zapisywać stałe w kilku komórkach, a przy odczycie porównywać je ze sobą i brać ten odczyt, który przeważa. Urządzenia działają do dzisiaj.

Ten myk dziala w AVR rowniez. Kolejne zerowania bitow bez kasowania w miedzyczasie komorki traktowane sa jako jeden zapis.

In the darkest hour on Sun, 16 Nov 2008 14:37:19 +0100, EM snipped-for-privacy@poczta.onet.pl> screamed:

Zawsze możesz użyć FRAM. 10^12 cykli.

EM wrote: ........

W ten sposob ubijesz najszybciej ta komorke co pamieta adres. Ja bym po prostu zapisywal kazdy nowy bajt do nastepnej komorki, przy czytaniu czytalbym az do FF i wtedy wiadomo ze w poprzedniej byl najbardziej aktualnuy bajt. Jak dojdziesz do konca to kasujesz calego EEPROMA i zaczynasz od poczatku.

Tomek

Pomyśl... komórka "z adresem poprawnej danej" nie będzie zapamiętywana CO CHWILĘ, tylko w momencie zmiany starej komórki na nową... jak stara komórka "padnie", to wybierana jest nowa i adres tej nowej jest zapisywany... przykładowo, dla pamięci o pojemności 256 bajtów pierwsza komórka będzie zapisana 256 razy :)... a właściwie 255 (bo tyle jest komórek przeznaczonych na dane)

Pozdrawiam Konop

Ale uwzględniając to, że problem można rozwiązać tak, że w EEPROMie tworzona jest tylko "kopia zapasowa" jakiś danych, to właściwą daną trzymamy w RAMie i nie musimy nic z EEPROMa odczytywać!! Liczymy sobie adres, inkrementujemy po każdym zapisie, a zapisujemy po jednym bajcie :)... i tyle :)... po restarcie faktycznie trzeba sięgnąć do EEPROMa, ale skoro tylko po restarcie, to chyba nieco wydłużony czas nie gra roli :)...

Pozdrawiam Konop

To ja tak powiem o jednym problemie... kiedyś pisali w notach katalogowych o pewnym problemie, który występował przy zapisie do EEPROMu... otóż zdarzało się, że w jeśli w czasie zapisu był problemy z zasilaniem, to uszkadzana była zawartość komórki o adresie 0... sprawdź, czy dalej coś takiego piszą, jeśli tak - to unikaj jak ognia tej komórki :)...

Pozdrawiam Konop

Konop napisał:

A niby dlaczego napisałem o "niektórych sytuacjach"? Te niektóre, to na pewno restart. Ale inne, mniej oczywiste, też mogą się trafić. A tak w ogóle, to problem czasu odczytu nie powinien być dokuczliwy.

Nie, Ty pisałeś o niekturych sytuacjach ;););)...

EM pisze:

Użyj zewnętrznej kostki pamięci NVRAM albo ferrytowej. Wystarczyłaby jedna z tych:

formatting link
Ceny są całkiem przystępne. Pamięć FRAM 4kb 3V w obudowie SO8 kosztuje około 3zł. Ilość zapisów praktycznie nieograniczona, zawartość nie znika po wyłączeniu zasilania:
formatting link

Dnia Mon, 17 Nov 2008 00:33:24 +0100, Adam Dybkowski napisał(a):

na ekstra kosci.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required