PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : EEPROM sinnvoll speichern. Aber wie?



DanielSan
27.03.2013, 19:57
Hi,

ich habe mir ein 24LC1026 EEPROM gekauft. Die Ansteuerung mit einem Atmel per I2C stellt -denke ich- für mich erstmal kein Problem dar.

Mein Problem ist ehr wie ich Sinnvoll Daten speicher. Ich möchte es gerne so haben, das ich Daten in das EEPROM schreibe sobald der Atmel läuft. Schaltet man ihn ab und irgendwann (in < 200 Jahren ;-) ) wieder an soll er 5 Sekunden auf einen Befehl auf der seriellen Schnittstelle warten. Kommt nichts dann weiter Daten speichern. Kommt was dann den Inhalt des EEPROMs über die serielle Schnittstelle ausgeben. Wie Markiere ich jetzt meinen Datensatz? Den Anfang könnte ich mir vorstellen einfach 4 Bytes mit FF zu schreiben. Aber wie markiere ich das Ende? Ich hab im Datenblatt des EEPROMs gelesen, das ein einfacher Read befehl da weiter macht wo er zuletzt aufgehört hat. An den internen Adresspointer kommt man aber nicht ran oder?
Das Problem ist, das der Atmel ja vergisst wo er aufgehört hat, wenn er plötzlich ohne Strom da steht. Klar ich könnte jetzt einfach jedesmal bei Adresse 0 wieder Anfagen aber wenn der neue Datensatz kürzer ist als der alter hab ich schon ein Problem. Jedesmal alles mit Nullen vollschreiben finde ich auch nicht sehr elegant.

Ich hoffe ihr versteht wie ich das meine.

Danke
Gruß Daniel

markusj
27.03.2013, 21:28
Im Endeffekt willst du erste Ansätze eines Dateisystems.
Eine einfache Lösung: Du schreibst die Daten blockweise und jeder Block hat eine fortlaufende Nummer. Du fängst also an zu schreiben: Block n ... n+m. Wenn der AVR erneut eingeschaltet wird, sucht er die höchste Zahl in dieser Kette und fängt dann an zu Zählen n+m .. n+m+x. Das Ende der Kette ist recht einfach dadurch zu erkennen, dass der nächste Block eben nicht den numerisch nächsten Wert hat.
Einzige erforderliche Vorbereitung: Einmal den EEPROM mit leeren Blöcken vorformatieren.

mfG
Markus

DanielSan
27.03.2013, 22:56
Mh ok. Das EEPROM hat ne PageWrite Funktion, die ich sowieso nutzen wollte. Also man kann immer 128 Byte aufeinmal schreiben. Das könnte ich ja als Block nutzen. Dann würde ich am Anfang jedes Blocks "Indexnummer Hi" "Indexnummer lo" schreiben. Da ich ja weiss das immer die ersten beiden Bytes eines Blocks meine Indexnummer ist brauch ich a auch kein Startbyte oderso.

Ist ne Top Idee! Danke!
Das wird morgen oderso mal getestet und umgesetzt!

Gruß Daniel

Andre_S
28.03.2013, 07:44
Hallo Daniel,

ich nehme mal an, dass Du die Schreibprozesse so geplant hast, dass Du nicht ständig, also in kurzen Zyklen auf dem EEPROM „schreibst“, also so gesagt die Lebensdauer beachtet hast.

Warum benutzt Du in dem Falle nicht Deinen eigenen Adresspointer, die Ablage vorzugsweise gleich in dem EEPROM (Bereich den Du nicht überschreibst vorzugsweise Anfang/Ende) oder wenn Du Dir sicher bist, das die Kombi nie auseinandergerissen wird, wie es bei gesteckten I²C – Datenkarten möglich ist, auch gleich in den Prozessor-Eeprom.
Dort legst Du nach dem Schreibprozess (Du weißt ja wie viele Daten Du wohin schreibst) die nächste freie Eeprom Adresse ab.

Wenn Du also etwas schreiben möchtest:
- eigenen Adresspointer lesen
- ab der entsprechende Adresse im Eeprom schreiben
- eigenen Adresspointer entspr. erhöhen und wieder abspeichern

Wenn Du auslesen möchtest:
- eigenen Adresspointer lesen
- ab Startadresse bis Adresspointer auslesen
- eigenen Adresspointer auf erste Schreibadresse setzen und wieder abspeichern


Je nachdem was Du vorhast und wie Deine Energieversorgung und Schaltung aussieht, kannst Du diesen Adresspointer auch temporär im flüchtigen Speicher halten und bei Trennung der Spannung (eventuell mit vorhandener Restenergie) oder vor dem Abschalten erst abspeichern.

Mache ich bei unseren Geräten schon seit über 10 Jahren so, egal ob ich diese als Ringspeicher oder „normal“ mit zyklischer Auslesung nutze. Im ersten sowieso aber auch letzten Fall entfällt ein Löschen der ausgelesenen Daten.

Es geht auch sehr schnell, da Du den Eeprom nicht durchsuchen musst, was ja doch je nach Größe etwas Zeit beansprucht.


Gruß André

markusj
28.03.2013, 11:12
@André: Damit belastest du aber einen kleinen Bereich im EEPROM deutlich mehr als den Rest (zumindest wenn der Pointer nach jedem Schreibvorgang aktualisiert wird). Hattest du noch keine Probleme mit Wear-Out?

mfG
Markus

JoeM1978
28.03.2013, 11:27
Diesen Adresspointer "muss" man eben immer an der Selben stelle halten, da sonst bei Reset/Neustart das Programm nicht weiss, wo es suchen soll.

aber wie Andre_S schrieb...


Je nachdem was Du vorhast und wie Deine Energieversorgung und Schaltung aussieht, kannst Du diesen Adresspointer auch temporär im flüchtigen Speicher halten und bei Trennung der Spannung (eventuell mit vorhandener Restenergie) oder vor dem Abschalten erst abspeichern.

Das Schreiben des Adresspointers kann man dadurch minimieren indem man ihn bei BrownOut schreibt.
(Während das Programm läuft hat man die Adresse ja immer parat)
Somit wird der Bereich, an dem der Adresspointer steht nur 1 mal beschrieben bei jedem Abschalten/Neustart.

DanielSan
28.03.2013, 11:31
Ich denke das die Methode von Markus auch einfacher umzusetzen ist, was die Programmierung angeht. Die 2 Byte pro Block für die Indexierung habe ich locker über.

Mit der Methode von Andre schreibe ich mir ja mein Internes EEPROM vom Atmel kaputt (auf die dauer) ausser ich schreibe den Adresspointer immer eine Adresse weiter. Da in dem internen EEPROM aber ein paar konstanten liegen muss ich ja auch noch aufpassen das die nicht überschrieben werden.
An eine Abschalterkennung dachte ich auch schon, aber das ist mir zu aufwendig. Wenn mir die letzten 2 Sekunden an Daten verloren gehen sollten, ist das nicht besonders schlimm.

Danke für eure Ideen.
Ich hoffe das mein EEPROM morgen bei mir eintrifft.

Gruß Daniel

Andre_S
28.03.2013, 12:21
...
Mit der Methode von Andre schreibe ich mir ja mein Internes EEPROM vom Atmel kaputt (auf die dauer) ausser ich schreibe den Adresspointer immer eine Adresse weiter.
...
Gruß Daniel

Nö,...
da haste mich nicht richtig verstanden oder nicht richtig gelesen...

Aber jeder kennt seine Projekte und die damit verbundenen Anforderungen am besten und muss daraus die für sich optimale Vorgehensweise finden.


Gruß André