Hallo,
ich wollte mal fragen, ob jemand weiss, wie das mit der
Schreibhäufigkeit auf ein EEPROM aussieht. Im Datenblatt ist für
Schreibzugriff ca 100.000 Mal angegeben. Wenn ich nun ein 4KB EEPROM ca
4000 mal in einer Schleife mit write_byte(0xFF) beschreibe, ist das ein
einziger Schreibzugriff oder gleich 4000 Zugriffe?
Worauf bezieht sich das Datenblatt? Kann man ein EEPROM rund 100.000 mal
vollschreiben, oder quasi 100.000 bytes schreiben?
Danke für Eure Hilfe
Schönen Abend, Jürgen
Ich habe häufig EEPROMs gesehen, die beim Schreiben eines Werts die
gesamte Page auffrischen, zum Beispiel das 24LC256 von Microchip.
Dementsprechend verkürzt sich beim Schreiben die Lebensdauer der
gesamten Page.
Schau am Besten ins Datenblatt deines EEPROMs, dort steht alles wichtige
drin.
Schönen Abend noch!
Hi,
Wie das mit der Schreibhäufigkeit zu verstehen ist wurde ja schon
gesagt.
Das einzige was ich mir bei einigen EEPROM VORSTELLEN könnte, das ist
das die vorher ÜBERPRÜFEN ob der "neue" Wert überhaupt anders ist als
der "alte" Wert und erst keinen Schreibzugriff durchführen wenn die
Identisch sind. WÜsste jetzt aus dem Stehgreif keinen EEPROM der das
sicher macht, aber jedes mal wenn ich denke ich habe schon alles gesehen
kommt der nächste Exot daher und wiederlegt mein denken. (Wobei ich
nicht mal ausschließen würde das sogar einige Bekanntere EEPROM das zur
Verlängerung der Lebensdauer haben, weiß es aber nicht -> DATENBLATT)
Sobald die aber tatsächlich einen Schreibzyklus beginnen ist das ein
Schreibzugriff im Sinne der Lebensdauer der den EEPROM altern lässt.
Captain Subtext schrieb:> Ich habe häufig EEPROMs gesehen, die beim Schreiben eines Werts die> gesamte Page auffrischen, zum Beispiel das 24LC256 von Microchip.
JA- das wird man immer häufiger sehen... Ist wohl schon der absolute
Standart!
Das hängt damit zusammen das man heute "richtige" EEPROMS Nicht mehr als
das realisiert was man lange Zeit als EEPROM verstand, sondern diese in
der FLASH Technologie (ist im Grund enatürlich auch ein EEPROM im
Wortsinn) ausführt. Speicherzellen in Flashtechnologie sind mitllerweile
viel billiger zu bauen und um welten Langlebiger als die "normalen"
EEPROM Speicherzellen. NAchteil an der Flashtechnologie ist halt aber
das immer nur eine komplette Seite gelöscht und neubeschreiben werden
kann und nicht der Inhalt einer einzelnen Speicherzelle alleine
verändert werden kann ohen die anderen anzutasten.
Um dieses Problem zu lösen und auch Abwärtskompatibel zu sein baut man
als Ersatz für die alten EEPROMs nun EEPROMS mit ein wenig mehr
Intelligenz. Bei einem Schreibzugriff wird die gesamte Page ausgelesen
und in einem kleinen RAM abgelegt und die Flash-Page gelöscht, die zu
modifizierenden Speicherzellen bekommen ihre neuen Werte und nun wird
die ganze Speicherseite neu mit dem Inhalt aus dem "Spiegel-Ram"
beschrieben.
Ein solcher EEPROM mit Flash speicher ist trotz der höheren
Eigenintelligenz mittlerweile wit billiger zu bauen als der gleichgroße
Typ mit echtem EEPROM. Auch die vom Benutzer benutzbaren EEPROM
-Speicher in den meisten µC sind mittlerweile "SO" Implementiert. NAch
aussen arbeiten die wie ein alter EEPROM, intern werkelt aber eine
Kombination aus Flash und Ram.
Diese Bausteine kann man gut an der Zahl der Schreibzugriffe
auseinanderhalten. Flash hat typisch so um 100.000 oder mehr, echte
EEPROM aber nur wenige tausend maximal. (NAtürlich gibt es auch
"nackten" Flash, den man wirklich von aussen auch nur Blockweise
ansprechen kann und wo kein EEPROM verhalten Simuliert wird)
Zum Abschluss noch:
EEPROM schrieb:>...> Wenn ich nun ein 4KB EEPROM ca> 4000 mal in einer Schleife mit write_byte(0xFF) beschreibe, ist das ein> einziger Schreibzugriff oder gleich 4000 Zugriffe?
DAS sollte man NIEMALS so machen!
Einen (DEN meist WICHTIGSTEN) Grund hast du jetzt sicher schon
verstanden.
Dein EEPROM wird selbst bei internem FlashKErn nach einigen Tagen
Programmlaufzeit "matsche" sein...
Aber es ist definitiv auch nicht zu vernachlässigen das die Zeit für
einen "Schreibzugriff" viel höher ist als für einen Lesezugriff.
Das können durchaus für einen Schreibvorgang (intern im Eeprom) ein paar
ms sein, Bei FlashKernen egal ob nur ein Byte modifiziert wird oder die
ganze Seite, bei "echten"EEPROM pro Byte. Gemessen am Befehlstakt eines
µC sind das "Ewigkeiten". Selbst wenn man über Interrupt mitgeteilt
bekommt wann der EEPROM wieder Aufnahmebereit ist (z.B. bei internem
Speicher im µC) wartet man doch die meiste Zeit.
Es ist daher immer Sinnvoll gut abzuwägen ob ein WErt jetzt hier und
sofort unbedingt abgespeichert werden soll, oder ob es nicht reicht den
einfach nur im RAM zu haben und z.B. beim Ausschalten zu speichern.
(Liegt natürlich an den Daten, wenn die NICHT, unter keinen Umständen
vergessen werden dürfen muss man natürlich immer sofort speichern.)
Bei einer Anwendung wo man häufig die daten erfassen will, aber es gut
möglich ist das sich lange nichts tut, da ist eine Überprüfung auf
änderung dann das mindeste. ICh weiß ja welchen Wert ich als letztes
"Geschrieben" habe. Und da ist es doch kein Problem einen einfaches "if
(Wert_Alt!=Wert_Neu) WRITEEEPROM(Wert_Neu)" in den Code einzubauen. Nur
mal so zur Anregung ;-)
Gruß
Carsten
Carsten Sch. schrieb:> Captain Subtext schrieb:>> Ich habe häufig EEPROMs gesehen, die beim Schreiben eines Werts die>> gesamte Page auffrischen, zum Beispiel das 24LC256 von Microchip.>> JA- das wird man immer häufiger sehen... Ist wohl schon der absolute> Standart!
Das stimmt nur so nicht. Einfach mal ins Datenblatt schaun.
1. Es gibt ein Byte Write
2. Bei einem Pagewrite wird der Datenblock erst zwischengespeichert und
erst mit der Stop-Condition ins EEPROM geschrieben.
Um die Schriebzugriffe auf eine Speicherzelle zu minimieren kann man die
Daten auch über den gesamten Speicher verteilen. Hat man z.B. einen
Datenblock von 100Byte dann landen die Daten beim erstenschrieben an
Adresse 0 beim zweiten schreiben an Adresse 100 usw. Erst wenn der
gesammte Speicher voll ist wird er komplett gelöscht und wieder bei
Adresse 0 geschrieben.
Das erste Byte welches ich schreibe ist die länge des Datenblocks. Also
schaue ich ist das erste Byte 0xff (Zelle gelöscht=Datenblock nicht
vorhanden). Ist der Datenblock vorhanden springe ich um die Länge des
Datenblocks im Speicher nach hinten. Ist dort ein gültiger Datenblock
schaue weiter hinten im Speicher. Ist dort kein gültiger Datenblock
verwende den letzten den du gefunden hast.
Ich hoffe, es ist einigermaßen verständlich erklärt.
Es gibt da auch einen kleinen Trick, um die Lebensdauer eines EEPROMs zu
erhöhen:
1. Man überprüft, ob die EEPROM-Zelle den gewünschten Wert hat.
2. Wenn nicht, schreibt man den Wert in die Zelle und springt zu 1.
3. Fertig!
Ist die Zelle kaputt, wird einfach so lange drauf "rumgeprügelt", bis
der Wert dann doch mal drin ist. Ist der Wert bereits vor dem Schreiben
drin, wird nicht geschrieben. Je kaputter die Zellen, desto länger die
Schreibezeit - korrekt geschrieben wird es trotzdem.
Gruß
Jonathan
@Matthias Lipinsky
Dann löscht du den Eeprom und beginnst wieder am Anfang.
@Jonathan Strobl
Durch das Verifizieren nach dem Schreiben stellt du aber nur sicher das
du die Zelle JETZT auslesen kannst. Wie es in einer Stunde, einer Woche
oder einem Jahr ist weist du nicht. Je älter eine Zelle ist um so
vergesslicher wird sie. Wenige Millisekunden nach dem Schreiben zu
überprüfen ob in der Zelle das richtige steht bringt also nichts.
Martin schrieb:> Carsten Sch. schrieb:>> Captain Subtext schrieb:>>> Ich habe häufig EEPROMs gesehen, die beim Schreiben eines Werts die>>> gesamte Page auffrischen, zum Beispiel das 24LC256 von Microchip.>>>> JA- das wird man immer häufiger sehen... Ist wohl schon der absolute>> Standart!>> Das stimmt nur so nicht. Einfach mal ins Datenblatt schaun.> 1. Es gibt ein Byte Write> 2. Bei einem Pagewrite wird der Datenblock erst zwischengespeichert und> erst mit der Stop-Condition ins EEPROM geschrieben.
Bist du dir da auch ganz sicher ;-)
Es gibt durchaus einen Unterschied zwischen den nach aussen hin
"SIMULIERTEN" Verhalten und dem Internen...
Bei vielen "NEUEN" EEPROM Revisionen gibst du halt einen "ByteWrite" im
Auftrag, für dien Programm verhält sich ALLES wie ein Bytewrite, INTERN,
OHNE DAS DU ES MERKST wird aber ein Zyklus, AUSLESEN, Zwischenspeichern,
GESAMTE PAGE Löschen, IM SPEICHER das eine Byte Modifizieren, PAGE
ZURÜCKSCHREIBEN ausgelöst. Du MERKST es halt nur nicht...
Der Befehl "PageWrite" hat damit nichts zu tun, der mein etwas völlig
anderes, das ist der Befehl welche den EEPROM dazu veranlasst erst auf
mehrere Daten zu warten um nicht nach jedem einzelnen Byte in diesem
Zyklus zu springen. Aber egal ob "ByteWrite" oder "PageWrite" in "neuen"
EEPROM mit Flash Kern wird immer eine gesamte Seite bearbeitet.
Wie gesagt: Das gilt natürlich nur für EEPROM mit Flash Kern die "ALTE,
Baugleiche" EEPROM ersetzen sollen. Ein heute Gebauter 24c08 wird
wahrscheinlich fast bei jedem Hersteller so arbeiten.
Ein 24c08 von 1995 desselben Herstellers wird bei Bytewrite tatsächlich
auch intern nur ein Byte bearbeiten.
In sofern sind "Sparversuche" nur durch VErschieben um ein paar
Bytestellen "Müssig". Wenn dann gleich um ganze Pages verschieben.
Aber das ist sowieso nur eine Krücke, die nur geht wenn ich immer wieder
denselben Datensatz fester Länge - der auch noch viel kleiner ist als
der Gesamtspeicher, ablegen will.
Sobald ich einen haufen verschiedener Datensaätze ablegen oder große
Teile des Speichers gleich zu anfang belegen will ist das einfach nur
Mumpitz.
Gruß
Carsten
Gruß
Carsten
Carsten Sch. schrieb:> Bei vielen "NEUEN" EEPROM Revisionen gibst du halt einen "ByteWrite" im> Auftrag, für dien Programm verhält sich ALLES wie ein Bytewrite, INTERN,> OHNE DAS DU ES MERKST wird aber ein Zyklus, AUSLESEN, Zwischenspeichern,> GESAMTE PAGE Löschen, IM SPEICHER das eine Byte Modifizieren, PAGE> ZURÜCKSCHREIBEN ausgelöst. Du MERKST es halt nur nicht...
Noch ein Satz von mir dazu - Ich glaube nicht das es so läuft.
1. Es würde dann ja effektiv keine Möglichkeit geben ein einzelnes Byte
zu schreiben also müsste ja auf jeden Fall die Anzahl der
Schreibvorgänge durch die Größe der Page geteilt werden.
2. Es Geht doch bei den Flash-Kernen eher um die Anzahl der
Schreib/Löschvorgänge. Also einmal beschreiben und dann wieder löschen
ist ein Zyklus. Man kann aber nur Pageweise löschen. Ich kann allso die
Page löschen, dann schreibe ich etwas an Adresse 0 und danach an Adresse
1. Zwischen diesen beiden Schreibvorgängen muss die Page aber nicht
gelöscht werden, das alle Bytes schon gelöscht sind. Dazu mal ein auszug
aus einem anderen Datenblatt (R8C13 interner Dataflash):
"The program/erase times are defined to be per-block erase times. When
the program/erase times are n times (n=1,000 or 10,000 times), to erase
n times per block is possible. For example, if performing one-byte
write to the distinct addresses on the Block A of 2K-byte block 2,048
times and
then erasing that block, the number of the program/erase cycles is one
time. if rewriting more than 1,000 times, run the program until the
vacant areas are all used to reduce the substantial rewrite times and
then erase. Avoid rewriting only particular blocks and rewrite to
average the program and erase times to each block. Also keep the erase
times as inrformation and set up the limit times."
Martin schrieb:> Das stimmt nur so nicht. Einfach mal ins Datenblatt schaun.> 1. Es gibt ein Byte Write> 2. Bei einem Pagewrite wird der Datenblock erst zwischengespeichert und> erst mit der Stop-Condition ins EEPROM geschrieben.
Okay, dann schauen wir "einfach mal" ins Datenblatt:
http://ww1.microchip.com/downloads/en/DeviceDoc/21203R.pdf>6.1) Byte Write>...>...>...>Note: When doing a write of less than 64 bytes>the data in the rest of the page is refreshed>along with the data bytes being written.>This will force the entire page to endure a>write cycle, for this reason endurance is>specified per page.
Gruß, Subtext
Captain Subtext schrieb:> Okay, dann schauen wir "einfach mal" ins Datenblatt:
Ok dann hast du recht. Dann bleibt nur eine Möglichkeit übrig, solch ein
Schrott IC nicht kaufen. Ist zumindest meine Meinung.
Alex schrieb:> Captain Subtext schrieb:>> Okay, dann schauen wir "einfach mal" ins Datenblatt:>> Ok dann hast du recht. Dann bleibt nur eine Möglichkeit übrig, solch ein> Schrott IC nicht kaufen. Ist zumindest meine Meinung.
GENAU!!!
Wozu brauche ich günstigen EEPROM mit mehr als 1 000 000 zulässigen
Schreibzugriffen pro Seite,kleiner <5ms Write Time für die gesamte Page
und datenhaltigkeit von über 200Jahren...
IST DOCH MIST DAS MEIN ABSTRUSES LEBENSVERLÄNGERUNGSGEDÖNS Unsinnig ist!
Bleiben wir doch besser bei dem Althergebrachten, mit 1000 bis maximal
10000 zulässigen SChreibzugriffen pro Byte, 10 Jahren Datenhaltigkeit
und 20ms WriteTime pro Byte...
Im Antquariat deines Vertrauens wirst du garantiert noch fündig.
Aber hergestellt wird soetwas seit bestimmt 10JAhren nicht mehr, habe
gerade mal in meine Alten Datenblätter -noch auf totem Baum- geschaut,
der Wechsel fing so um 91/92 an. Ich habe kein Datenblatt das jünger als
98 ist für einen noch "ECHTEN" EEPROM.
NOCH EINMAL: ALLES was mit 100K oder noch viel mehr zulässigen
Schreibzugriffen/Speicherzelle daherkommt arbeitet nach dem
beschriebenen Verfahren. Es wird intern immer die ganze Page neu
beschrieben/ein Refresh durchgeführt.
GRuß
Carsten
Noch ein Nachtrag:
OK, mit einer vernümpftigen Schreibstrategie wird aus den 1M z.B. im
durchschnitt 100k.
Abber bei den "alten" EEPROMS wird mit einer vernümpftigen
Schreibstrategie aus den 10k im Durchschnitt auch 100k.
(eh sich jemand aufregt so wie Carsten, ich habe und kann dies nicht
wissenschaftlich belegen. Also immer ruhig bleiben. Mein Antiquariat hat
sowas jedenfalls noch.)