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.
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
GayWin schrieb im Beitrag #7070159: > 10000 Zyklen. > Physiopaten gibts.... Attiny Mikrocontroller (Atmel) => 100'000 Zyklen
hawky schrieb: > Attiny Mikrocontroller (Atmel) => 100'000 Zyklen Und diverse externe EEPROMs bis 1.000.000 Zyklen, z.B. 24Cxx oder 93C46.
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
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
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.
Einfach ein FRAM nehmen, dann spart man sich sowohl das Theater mit wear-leveling als auch die elendige Warterei aufs BUSY-Bit beim Schreiben.
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.
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
>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.
> 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.
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.
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.
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...
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.
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?
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.