Forum: Mikrocontroller und Digitale Elektronik EEPROM: "das erste Mal" erkennen


von Luca B. (lucabert)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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..

von Klaus W. (mfgkw)


Lesenswert?

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)

von Luca B. (lucabert)


Lesenswert?

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

von Anja (Gast)


Lesenswert?

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

von Luca B. (lucabert)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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).

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

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


}

von Markus G. (thechief)


Lesenswert?

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
Noch kein Account? Hier anmelden.