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
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.
Versehe die Daten mit einer Checksum (zB einem einfachen XOR über alle Bytes). Falls sie beim einlesen nicht stimmt, initialisierst du die Daten neu.
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....
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.