Hallo,
Für einen Zähler, dessen Stand im EEPROM eines µCs mitgeführt
wird, muss ich mich ernsthaft mit der Lebensdauer von EEPROMs
befassen.
das Thema hatte ich im Laufe der Jahre auch imer wieder mal, weil
die Zyklenzahl von EEPROM-Zellen nun mal begrenzt ist.
Also muß man sich immer überlegene, wie man ein Programmablauf schreibt,
um nicht Zellen tot zu schreiben bzw. tot zu löschen.
Welche Zugriffe nun für die Zellen kritischer sind und welche eher
unkritisch, kann ich nicht genau sagen. Fakt ist, dass die Information
durch Eintunneln von Ladungen in vergrabene Strukturen erfolgt
(floating gates). Wenn eine Zelle beschrieben ist, muß man wieder
löschen, um neue Infos reinzubringen. Löschen und schreiben hängen
also mehr oder weniger direkt zusammen.
Jedes Speichern und auch jedes Löschen bewirkt eine Verschlechterung
der Struktur, so daß die Ladungen irgend wann nicht mehr gehalten
werden können. Dann kippt eine solche Zelle von ursprünglich 1 auf 0um.
Das äußert sich dann so, dass die Zelle nicht mehr gelöscht werden
kann, weil dabei ja das floating Gate aufgeladen wird.
Kann natürlich auch passieren, das es zwar noch aufgeladen wird, aber
dann nach einiger Zeit doch die Ladung verliert.
Die Hauptfrage ist, ob
a.) das Setzen eines einzelnen(!) Bits eines Bytes (Bit -> 0)
unschädlich für dieses Bit ist, oder ob
b.) beim Setzen eines einzelnen(!) Bits eines Bytes (Bit -> 0)
nur dieses eine Bit „leidet“, oder ob
c.) beim Setzen eines einzelnen(!) Bits auch alle anderen Bits
in Mitleidenschaft gezogen werden.
Ich denke, nur das Bit welches wirklich angesteuert wird, wird auch
strapaziert.
Außerdem d.), e.) und f.) wie vor, aber für das Löschen von
Bits (Bit -> 1).
Werden EEPROM nicht soweiso byteweise gelöscht? Da macht IMHO die
Betrachtung von Einzelbits nicht so viel Sinn, oder?
Bei einem Kilometerzähler in einem Autotacho (geschätzte
Lebensdauer: ca. 10^7 x 100 Meter) lernte ich folgendes
Verfahren: Die untersten 7 Bit des Zählers werden durch 16
Byte = 128 Bit repräsentiert. Jede 100 m wird ein weiteres Bit
davon auf 0 gesetzt. Nach 12,8 km sind alle 128 Bit auf 0,
aber jedes Bit wurde nur einmal auf 0 gesetzt.
Das scheint mir eine durchaus schonende Lösung.
Ich denke auch, nur die Bits welche tatsächlich von 1 auf 0
runter gezogen werden, machen da eine Strapaze durch.
Jetzt werden
entweder alle 16 Byte zu FFh gelöscht, oder es werden der
Reihe nach alle Bits einzeln gelöscht - das weiß ich nicht.
Bin nicht sicher, aber Bit einzeln löschen ist wohl nicht.
Nach 12,8 bzw. 25,6 km kann dann ein echter Zähler
inkrementiert werden. Also kippt jedes Bit pro 12,8 oder 25,6
km nur zwei Mal um, davon einmal setzen, einmal löschen. Wenn
das z. B. 100 k mal passieren darf, sind das über 10^7 km.
Ja, aber die 100k Schreib/Lesezyklen sind ein Wert, den ich in Praxis
nicht ausnutzen würde. Das sind statistische Ausfälle mit Sicherheit
vorprogrammiert.
Meine Vermutung ist, das einzelnes Setzen gänzlich unschädlich
ist (Annahme a.) und Löschen eines Bits auch alle anderen in
Mitleidenschaft zieht (Annahme f.).
Löschen ist zumindest eine Stapaze für die Zellen. Aber ich würde mich
nicht drauf verlassen, dass schreiben gänzlich unschädlich ist.
In beiden Fällen müssen die Ladungsträger durch die Isolierschicht tunneln.
Ist aber auch eigentlich egal, weil schreiben und löschen sich immer
abwechseln müssen.
Auch mein (Betriebszeit-)Zähler bzw. die EEPROM-Zellen sollen
bis ca. 10^7 (10 Millionen) Zählerstände mit Sicherheit
durchhalten. Die Anzahl der Schreibzyklen ist mit 100 k angegeben.
Es wäre als am sinnvollsten, Bits einzeln auf 0 zu setzen und
dann byteweise auf 1 zu löschen.
Wer bis hierhin noch alles verstanden hat, der sei schon mal gelobt.
Für eine Datenaufzeichnung auf EEPROM haben wir das z.B. so gelöst,
dass zwar wie üblich sequenziell die Daten eingeschrieben werden,
aber nicht wie üblich ein Zähler im EEPROM mit läuft, der dann
natürlich schnell an die Grenzen kommen würde.
Statt dessen wird immer in der letzten Zelle eine Endekennung (EoF)
eingetragen. Bei jedem Schreibvorgang wird das EoF also gelöscht und
der Messwert eingeschrieben und dann EoF eine Pos. weiter geschrieben.
So werden über den benutzten Speicherraumraum die Zellen
gleichmäßig wenig belastet. Beim jedem Neustart muß natürlich
dann das EoF gesucht werden.
Wenn du dass also z.B. mit 200 Speicherplätzen machst, hast du die
Schreibzahl der Zellen um Faktor 100 reduziert.
Andere Methoden, die den Speicher quasi umlaufend benutzen sind
gibt es einige.
Gruß Uwi