Forum: Mikrocontroller und Digitale Elektronik EEPROM Erstzugriff


von Michael S. (rbs_phoenix)


Lesenswert?

Hallo zusammen.

Ich will für ein Projekt den PIC-internen EEPROM benutzen. Darin sollen 
Variablen für den nächsten Programmstart gespeichert werden. Doch wie 
macht man das am besten softwaretechnisch, dass beim aller ersten 
starten des Programms erkannt wird, dass es dieser ist und somit noch 
keine Sinnvollen Daten in den EEPROM-Adressen sind?

Ich hab mir das so vorgestellt:

1. Prüfen, ob erste start
2a. Wenn ja, Default-Wert ins EEPROM und Variablen speichern
2b. Wenn nein, Werte aus EEPROM Lesen und in Variablen speichern
...
3. Wenn eine Variable geändert wird, wird auch der dazugehörige Wert im 
EEPROM geändert.

Mir gehts nun um Punkt 1.

Mein erster Gedanke war, dass ich ein Kontroll-Byte habe. Beim Punkt 2a. 
schreibe ich das Kontroll-Byte auf 0xFF. Demnach wäre Schritt 1. das 
Kontrollbyte zu lesen und auf 0xFF zu testen.

Doch woher weiß ich, dass es beim allerersten Start nicht schon zufällig 
0xFF ist?

Sind die Daten denn im Auslieferzustand definiert? Und wenn, wie?

Die Alternative, die aber etwas nervig ist, wäre ein Programm zu 
schreiben, dass nichts anderes macht, als das komplette EEPROM auf 0 zu 
setzen. Also erst das Programm drauf, dann Löschen lassen und dann das 
andere Programm drauf.

Vielen Dank schonmal

von Dieter (Gast)


Lesenswert?

0xFF ist ein schlechter Wert, da eine leere Speicherstelle i.d.R. mit 
1en voll sind. Denk dir ein anderes aus, oder nimm direkt zwei. Die 
Wahrscheinlichkeit, dass genau zwei gelesene Bytes deinen Kontrollbytes 
entsprechen, ist sehr gering.

von Dr. Sommer (Gast)


Lesenswert?

Versehe die Daten mit einer Checksum (zB einem einfachen XOR über alle 
Bytes). Falls sie beim einlesen nicht stimmt, initialisierst du die 
Daten neu.

von Max D. (max_d)


Lesenswert?

Oder du machst ne checksumme über deine Daten (8 oder 16 Bit) und 
vergleichst die bei jedem Start, hat den Vorteil, dass auch im Betrieb 
Fehler erkannt und durch defaults ersetz werden... und die paar ms die 
das checken dauert kümmern den user nicht...

Edit: Ups, zu spät....

von Didi S. (kokisan2000)


Lesenswert?

Hallo Michael,

das ist recht einfach.

Im Sourcecode für den PIC kannst Du je nach Compiler auch Daten 
hintzerlegen, mit dennen der EEPROM Bereich beim Programmieren 
beschrieben wird. Sozusagen die 0te Programmierung des Anfangszustandes 
des EEPROM. Entweder kann man dann gleich die Defaultwerte 
hineinschreiben oder eine Kennung, die man beim ersten Aufruf ausliest.

Beim HiTech Compiler von Microchip sieht das zugehörige Makro im 
C-Sourcecode zum Beispiel so aus:

__EEPROM_DATA(0xFF,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00);  // Default
__EEPROM_DATA(0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00);
__EEPROM_DATA(0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
__EEPROM_DATA(0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
__EEPROM_DATA(0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
....

Somit ist der Auslieferungszustand definiert.

Gruß
kokisan

von Cyblord -. (cyblord)


Lesenswert?

Ich mache das auch über eine CRC Checksumme. Aber auf AVR. Nämlich die 
crc_ibutton aus dem crc16 Header. Ist sogar noch einfacher als selbst 
eine mit XOR zu bauen. Ich habe alle Config-Daten in einem struct. So 
sind alle Funktionen zum speichern, laden, übertragen und crc-berechnen 
lediglich 3-Zeiler. gerade die eeprom_write_block usw. Funktionen sind 
da wirklich super für geeignet. Wirds für PIC ja wohl auch geben sowas.

viele Grüße
cyblord

von Bronco (Gast)


Lesenswert?

Noch zwei Tips:

1. Falls sich die EEPROM-Inhalt öfter ändern, solltest Du mal 
nachrechnen, ob Du ggf. die maximale Anzahl an Schreibzugriffen 
überschreitest.
Extrem-Beispiel: Du sicherst einen Zustand alle 100ms im EEPROM, Dein 
EEPROM spezifziert 100000 Schreibzugriffe -> nach 3h hast Du über 
100000mal ins EEPROM geschrieben.

2. Falls es vorkommen kann, daß die Spannungsversorgung abgeschaltet 
wird, während Du ins EEPROM schreibst, mußt Du die Daten mehrfach 
ablegen und jede Kopie mit einer CRC o.ä. versehen, damit Du korrupte 
Datensätze erkennen kannst.

von Michael S. (rbs_phoenix)


Lesenswert?

Dr. Sommer schrieb:
> Versehe die Daten mit einer Checksum (zB einem einfachen XOR über alle
> Bytes). Falls sie beim einlesen nicht stimmt, initialisierst du die
> Daten neu.

Also meinst du:

XOR_Byte = Byte1 xor Byte2 xor Byte3..... xor Byte18 (Es sind 18 Byte 
Daten)

Das XOR_Byte ins eine extra EEPROM-Speicherzelle schreiben. Und beim 
ersten Start wird der Fehler erkannt, weil 18 undefinierte Byte-zustände 
ver-x-odert sehr warscheinlich nicht einem zusätzlichen undefiniertem 
Byte entpricht?

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.