Forum: Mikrocontroller und Digitale Elektronik EEPROM Schreibzyklen


von hawky (Gast)


Lesenswert?

Hallo

bzgl. Schreibzyklen-Anzahl erhöhen habe ich schon mehrmals einen 
Kommentar wie siehe unten gelesen.

Doch wie soll das gehen? Leuchtet mir gerade nicht ein.

Die Adresse/Position des Wertes müsste man ja auch im Eeprom 
reinschreiben und inkrementieren... somit geht zwar nicht die 
Speicherstelle des Wertes defekt aber irgendwann die Speicherstelle für 
die Adresse/Position.., weil die ist ja dann immer an der gleichen 
Stelle.....

Danke

> Wenn man z.b. nur 10% eines EEPROMS nutzt könnte man das Programm
> so
> schreiben das diese 10% bei jedem Neustart 10% nach untengeschoben
> werden.

Beitrag #7070159 wurde von einem Moderator gelöscht.
von EAF (Gast)


Lesenswert?

hawky schrieb:
> Doch wie soll das gehen? Leuchtet mir gerade nicht ein.

"Wear Leveling" heißt das Zauberwort eigentlich.
Von Atmel gabs gar ein AN dazu
http://ww1.microchip.com/downloads/en/appnotes/doc2526.pdf

von hawky (Gast)


Lesenswert?

GayWin schrieb im Beitrag #7070159:
> 10000 Zyklen.
> Physiopaten gibts....

Attiny Mikrocontroller (Atmel) => 100'000 Zyklen

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

hawky schrieb:
> Attiny Mikrocontroller (Atmel) => 100'000 Zyklen

Und diverse externe EEPROMs bis 1.000.000 Zyklen, z.B. 24Cxx oder 93C46.

von hawky (Gast)


Lesenswert?

EAF schrieb:
> "Wear Leveling" heißt das Zauberwort eigentlich.
> Von Atmel gabs gar ein AN dazu
> http://ww1.microchip.com/downloads/en/appnotes/doc2526.pdf

ok, ich glaube verstehe es, man muss quasi dem Wert noch irgendein 
Erkennungswert/byte/bit mitgeben, und zählt solange hoch bis man es 
gefunden hat.

Danke

von Uwe (de0508)


Lesenswert?

Hallo,

ich hatte das Problem der "max. Schreibzykeln" eines EEPromdatum anders 
gelöst.

Man definiert die Größe des benötigten Speicherbereichs für seine Daten.
Z.B. 250 Byte, dazu kommt noch eine 3 Byte unsigned int Zähler für die 
Anzahl der geschriebenen Seitenupdates.

D.h. die Page - Seite ist dann 256 Byte groß.

D.h. man schreibt und liest in seinem Programm die Daten nur über einen 
gespiegelten RAM Bereich.

Mit einem Update RAM-->EEprom wir dann diese 256 Byte Page ins EEprom 
übertragen.
An EEprom-Adresse 0 liegt dann z.B. der Page-Zähler, der je nach Anzahl 
der Pages in ein 8 Byte oder 16 Byte Datum passt.

Ist die maximale Anzahl der Page Schreibvorgänge erreicht, wählt man 
einfach die nächste Page aus, speichert diese im 8 Byte oder 16 Byte 
Datum und schreibt dort seine gespiegelten RAM Bereich hinein.

Bei booten / starten des AVR, werden einfach die Daten der aktuellen 
Page aus dem EEprom in den gespiegelten RAM Bereich kopiert.

In seinem Programm muss man dann noch die maximale Anzahl der Pages 
beachten und hierzu einen Fehlfall ausdenken!

Fertig.

Bsp.:
EEprom 2048 Byte, Page 256 Byte ==> 1-7 Page
Einfach formuliert: in Page 0 liegt der Pagezähler.
Hier könnte man auch noch die 3 Byte (4 Byte) Schreibzähler für jede 
Page ablegen.

Die erste Page für Daten ist die Page 1, die Letzte ist 7.

Wichtig ist dabei man schreibt nie direkt ins Eprom nur über das 
gespiegelte  RAM!

: Bearbeitet durch User
von W.S. (Gast)


Lesenswert?

hawky schrieb:
> Die Adresse/Position des Wertes müsste man ja auch im Eeprom
> reinschreiben und inkrementieren...

Tja, ohne ein bissel nachzudenken geht es eben nicht. Man muß eben den 
aktuellen Satz an Merkwerten am Speicherinhalt erkennen und nicht an 
irgend einer Zahl, die auf selbigen hinweist. Ich hatte das (allerdings 
für einen seriellen Flash) so gemacht, daß immer die nächste zur 
Verfügung stehende Seite gelöscht war und somit der Datensatz, der 
direkt davor steht, der aktuelle ist. OK, bei einem seriellen Flash kann 
man nur seitenweise löschen, da bot sich das an.

Bei jedem Update des Datensatzes wird er dabei in die nächste Seite 
geschrieben und die auf diesen folgende Seite gelöscht. Damit braucht 
man beim Start bloß einmal die Seite zu suchen, die vor einer gelöschten 
Seite steht - und wenn so eine nicht gefunden wird (also bei der 
Inbetriebnahme), dann wird der Datensatz mit Defaultwerten gefüllt und 
in die erstbeste Seite geschrieben.

W.S.

von Thosch (Gast)


Lesenswert?

Einfach ein FRAM nehmen, dann spart man sich sowohl das Theater mit 
wear-leveling als auch die elendige Warterei aufs BUSY-Bit beim 
Schreiben.

von Harald A. (embedded)


Lesenswert?

Thosch schrieb:
> Einfach ein FRAM nehmen, dann spart man sich sowohl das Theater
> mit
> wear-leveling als auch die elendige Warterei aufs BUSY-Bit beim
> Schreiben.

Ich finde FRAM prinzipiell auch gut, allerdings nervt die Abkünderitis 
in diesem Produktbereich doch sehr.

Ansonsten verwende ich auch einen ähnlichen Ansatz wie von W.S. 
beschrieben. Man kann es so hinbekommen, dass es immer bullet-proof ist, 
d.h. ein abgebrochener Schreibvorgang erkannt und anhand des vorherigen 
Datensatzes restauriert wird. Dafür ist allerdings eine genaue Planung 
der Schreib- und Löschfeihenfolge erforderlich. Und dann testen, testen, 
testen, in dem man Szenarien bewusst provoziert. Man glaubt garnicht, 
was für Fehler einem da noch über den Weg laufen.

von Georg (Gast)


Lesenswert?

W.S. schrieb:
> Man muß eben den
> aktuellen Satz an Merkwerten am Speicherinhalt erkennen und nicht an
> irgend einer Zahl, die auf selbigen hinweist.

Wieso eigentlich nicht? Man teilt den Speicher in Blöcke für die Daten 
und speichert die Nummer des Blocks - da man diese nur erhöhen muss wenn 
man die Schreibzyklen des aktuellen Blocks erreicht hat wird für die 
Blocknummer niemals die Grenze erreicht - jedenfalls nicht zu deinen 
Lebzeiten. Ich würde sicherheitshalber die Blocknummer 2mal speichern.

Georg

von LostInMusic (Gast)


Lesenswert?

>man muss quasi dem Wert noch irgendein Erkennungswert/byte/bit mitgeben,

Richtig. Ein Bit reicht dazu. Man nennt es "sentinel bit" (engl. 
"Wächter"). In den restlichen 7 Bits kann man sogar Nutzdaten speichern.

>und zählt solange hoch bis man es gefunden hat.

Ja. Irgendwo im EEPROM-Speicher gibt es bzgl. des Sentinel-Bits eine 
0-1-Grenze und eine 1-0-Grenze. Die erste dieser Grenzen muss man finden 
und gibt dann die gesuchte Adresse des letztmalig gespeicherten Wertes 
an. Dazu muss man im ungünstigsten Fall den gesamten EEPROM-Speicher 
auslesen, aber das ist kein Problem, weil Lesen ja schnell geht und die 
Zellen nicht abnutzt.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> ein abgebrochener Schreibvorgang erkannt und anhand
> des vorherigen Datensatzes restauriert wird.
Kann man ja per CRC machen. Wenn der beim höchsten Datensatz nicht 
korrekt ist, nimmt man den zweithöchsten Datensatz.

von NichtWichtig (Gast)


Lesenswert?

Je nach Datensatz läßt sich auch auf irgendwelche Bits oder Kennung 
verzichten.
Der leere Speicher enthält 0xffffffff (z.B. beim meinem STM32F103)
Eine Page hat 1K und wird Wortweise beschrieben solange noch Platz ist.
Wenn voll wird in 2. 1K Page weiter gemacht und die erste Page wird 
gelöscht.
Macht 256 Schreibvorgänge für einmal Löschen.

Der zweite Fall schreibt 2 32Bit Worte in den gelöschten Speicher, auch 
2 1K Pages.

Beim Starten wird aus dem Speicher solange gelesen bis 0xffffffff 
gefunden wird, der letzte Wert davor ist der zuletzt gespeicherte.

von DerEinzigeBernd (Gast)


Lesenswert?

Es gibt eine schicke Alternative zu üblichen EEPROMs - den 48L512 bzw. 
48LM01 von Microchip. Das ist eine Kombination aus schnellem SPI-RAM und 
EEPROM, das sich selbst darum kümmert, den RAM-Inhalt ins EEPROM zu 
übertragen und umgekehrt. Die Übertragung erfolgt automatisch bei 
Anlegen der Versorgungsspannung bzw. beim Brown-Out. Zur Pufferung wird 
ein Kondensator benötigt, 100 µF reichen hier aus.

https://www.microchip.com/en-us/product/48LM01

Im normalen Betrieb muss man sich um das EEPROM nicht kümmern und kann 
das Ding ohne irgendwelche Busy-Bits abzufragen ansteuern - bei 66 MHz 
SPI-Takt ist das Ding eine gute Nummer schneller als übliche EEPROMs 
oder Flash-ROMs.

Wenn man nur drei Konfigurationsbytes sichern möchte, ist das allerdings 
leichter Overkill, bei 64 bzw. 128 kByte Kapazität.

von Jens M. (schuchkleisser)


Lesenswert?

DerEinzigeBernd schrieb:
> Wenn man nur drei Konfigurationsbytes sichern möchte, ist das allerdings
> leichter Overkill, bei 64 bzw. 128 kByte Kapazität

Wenn man bei Microchip nach EERAM sucht, bekommt man auch andere 
Kapazitäten und auch I²C-Varianten, z.B. das 47C04 mit 4kBit/5V/I²C, ein 
echter Exot.
https://www.microchip.com/en-us/product/47C04
Kostet bei Mouser weniger als 1€, und es sind sogar noch welche da, was 
ja heutzutage nicht selbstverständlich ist.

Danke für den Tip, genau sowas hab ich gesucht, wäre gar nicht drauf 
gekommen das es sowas gibt...

von 888 (Gast)


Lesenswert?

Thosch schrieb:
> Einfach ein FRAM nehmen, dann spart man sich sowohl das Theater mit
> wear-leveling als auch die elendige Warterei aufs BUSY-Bit beim
> Schreiben.

Dafür zählt jeder Lesezyklus als Schreibzyklus, geht also in die 
Lebensdauer mit ein.

von Jens M. (schuchkleisser)


Lesenswert?

Soul E. schrieb:
> Dafür zählt jeder Lesezyklus als Schreibzyklus, geht also in die
> Lebensdauer mit ein.

Wenn du sekündlich schreibst, reicht es etwa noch 4 Milliarden Jahre bis 
du nicht mehr garantiert richtig schreiben kannst.
Hält der Rest der Schaltung so lange?

von c-hater (Gast)


Lesenswert?

Jens M. schrieb:

> Wenn du sekündlich schreibst, reicht es etwa noch 4 Milliarden Jahre bis
> du nicht mehr garantiert richtig schreiben kannst.
> Hält der Rest der Schaltung so lange?

Ja, FRAM ist schon sehr komfortabel. Nutzt nur nix, wenn man ihn nicht 
mehr kaufen kann...

von Jens M. (schuchkleisser)


Lesenswert?

c-hater schrieb:
> Nutzt nur nix, wenn man ihn nicht
> mehr kaufen kann...

Du willst nur nicht.
Mouser hat noch tausende im Lager, wird woanders ähnlich sein.
Sind halt ein wenig teuer, aber "nicht" sieht für mich anders aus.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.