Hallo, Leute! Ich möchte einige Daten in die EEPROM (ATMega8 und 32) speichern, so daß wenn auch die Strom weg geht, werden diese Daten nicht verloren. Gut, ich habe mir die Dokumentation angeschauft und es sieht nicht so schwer aus. Ein Problem habe ich aber noch, und zwar: das erste Mal, daß das Programm läuft, wird sicher nur Müll von der EEPROM lesen (noch nicht einmal geschrieben...). Ich kann keinen Verfahren denken, wie ich diese Müll von richtigen Daten erkennen kann (ich muss Integer und String schreiben). Hat jemand eine Idee? Oder eventuell, wäre es möglich, bevor ich zum ersten Mal das Programm starte (flashen) schon einen bekannten Zustand in die EEPROM schreiben? Ich will aber nicht zwei Programme schreiben, ein davon nur um diese definierten Zustand zu schreiben... Danke für eure Vorschläge! Luca Bertoncello
Hi >Ein Problem habe ich aber noch, und zwar: das erste Mal, daß das >Programm läuft, wird sicher nur Müll von der EEPROM lesen (noch nicht >einmal geschrieben...). Nein. Ein unbenutzter EEPROM enthält durchgängig $FF. MfG Spess
Bei so etwas schreibt man mit den Werten immer eine Checksumme. Beim Lesen wird die Checksumme mitgelesen und geprüft (also die gelesene verglichen mit einer neu berechneten aus den gelesenen Werten). Stimmt die gelesene Summe nicht mit der brechneten überein, werden die Daten verworfen. Das hat nebenbei auch gleich den Vorteil, daß fehlerhaft geschriebene Werte (Stromausfall während des Schreibens?) ebenfalls verworfen werden. Es bietet sich eine einfache Summe an, oder CRC z.B..
spess53 schrieb: > Nein. Ein unbenutzter EEPROM enthält durchgängig $FF. Falls der Controller neu war... PS: Abgesehen davon, kann man das EEPROM natürlich explizit setzen (avrdude mit -e oder -U eeprom:w:dateiname)
Klaus Wachtler schrieb: > Abgesehen davon, kann man das EEPROM natürlich explizit setzen > (avrdude mit -e oder -U eeprom:w:dateiname) Das gefällt mir... Ich kann eine EEPROM-Datei anlegen, die ich das erste Mal (oder falls ich mal entscheide, daß die Daten gelöscht werden sollen) schreibe und ist alles erledigt. Eine Prüfsumme ist sowieso eine gute Idee und ich werde es implementieren. Danke Luca Bertoncello
Luca Bertoncello schrieb: > Eine Prüfsumme ist sowieso eine gute Idee und ich werde es > implementieren. Ein Array mit Default-Werten im Flash ist auch empfehlenswert. Außerdem kann es sinnvoll sein einzelne wichtige Blöcke mit eigener checksumme doppelt abzulegen. Im Fehlerfall (Schreibzugriff während power-down) hat man dann noch eine fehlerfreie Kopie. Generell sollte man nicht zu häufig aufs EEPROM schreiben. Ich schreibe im Normalfall nur bei Bedieneraktionen (da wird hoffentlich nicht gleich darauf der Strom abgestellt). Gruß Anja
Anja schrieb: > Generell sollte man nicht zu häufig aufs EEPROM schreiben. Ich schreibe > im Normalfall nur bei Bedieneraktionen (da wird hoffentlich nicht gleich > darauf der Strom abgestellt). Ja, klar! In meinem Fall wird es einmal am Tag passieren... Also, wenn ich richtig verstanden habe, kann ich 100000 Tage (273 Jahre) schreiben können... :) Übrigens: ich habe die Funktionen eeprom_write_block und eeprom_read_block. Die machen genau was ich brauche! Ich gebe einfach einen struct als Parameter und das war's! Toll! Grüße Luca Bertoncello
Luca Bertoncello schrieb: > Also, wenn ich richtig verstanden habe, kann ich 100000 Tage (273 Jahre) > schreiben können... :) Du wirst sogar unendlich oft schreiben können. Nur das Speichern klappt nur bei den ersten 100000 Mal. Und auch deshalb ist eine Prüfsumme über die Daten nötig, denn das kann dir auch zufällig mal passieren, das da Müll ins EEPROM gelangt. Und dann stellt sich wieder die Frage: Luca Bertoncello schrieb: > Ich kann keinen Verfahren denken, wie ich diese Müll von richtigen Daten > erkennen kann (ich muss Integer und String schreiben).
wenn man sich die Prüfsummen-Sache ersparen will, reicht vermutlich auch
ein "magische Konstante" aus. Platz ist ja im EEPROM meistens genug
vorhanden. Die "Chance", daß diese Speicherstelle genau den magischen
Wert hat, ist extremst gering.
if(eeprom_read_word(&eeMagicNumber)!=1949) // in Memorandum
Schwiegermutters Geburtsjahr
{
eeprom_write_word(&eeMagicNumber, 1949);
// mache irgendwas weiters zur Initialisierung
}
Hallo zusammen, zum Thema "Magische Konstante", siehe auch hier, auf Wikipedia: http://de.wikipedia.org/wiki/MZ-Datei Und hier: http://de.wikipedia.org/wiki/Mark_Zbikowski Gruß Markus
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.