Hallo Forum, ich verwende in meiner Schaltung einen PIC16F819. Es werden Sensordaten gemessen und ausgewertet. Gelegentlich wird ein Statusbyte in das interne EEPROM geschreiben. Nun ist der Fall aufgetreten, daß im EEPROM ein falsches Datenwort steht. Statt dem zu erwartenden Status von 0x08 oder 0x09 steht an der Stelle ein 0xFF. Ich konnte inzwischen feststellen, daß dieser Fehler nur beim Aus- und wieder Einschalten der Versorgungsspannung auftritt. Laut Datenblatt wird bei einem Schreibzugriff auf das EEPROM zunächst die Speicherzelle gelöscht und anschließend mit dem neuen Wert beschrieben. Ist es möglich, daß der Brown-Out-Reset einen aktiven Schreibvorgang unterbricht und so der "gelöschte Wert" 0xFF in der Speicherzelle stehen bleibt? Wer hat hierzu ähnliche Erfahrungen gemacht und weiß evtl. Abhilfe? Gruß, Markus_8051
Also ich seh das mal so: Wenn während des EEPROM Programmiervorgangs ein RESET kommt, wird dieser Vorgang natürlich ab-/unterbrochen!! Demnach ist es GANZ NORMAL, wenn die Speicherstelle einen fehlerhaften Wert aufweist oder aufweisen kann! DAHER SOLLTE NACH EINEM PROGRAMMIERVORGANG AUCH IMMER EIN VERIFY ausgeführt werden! Über die Statusbits kann man ja auch erkennen, ob ein Brown Out Reset, ein WDT Reset usw. aufgetreten ist. Bloß wie du nach einem Reset erkennen möchtest, ob in deiner EEPROM Zelle ein 0x08 oder 0x09 oder was auch immer RICHTIG sein kann, das kann ich nicht sagen. Gruß TK
Gleich noch einen hinterher: Im Datenblatt steht doch auch, dass im EECON1 Register das WREN-Bit immer auf 0 gelegt sein sollte. Damit werden sporadische, nicht gewünschte Programmierzyklen verhindert. Ausserdem sollte sich der Inhalt von EEDAT und EEADR in der Zeit des Programmierzyklusses NICHT ändern! Also nach dem Programmieren immer zuerst das WR-Bit abfragen, bis es automatisch zurückgesetzt wurde. Erst dann wieder im Programmablauf weitermachen. Alternativ auf den EE-Interrupt warten. Gruß TK
Hallo TK, nun, wenn sich das Gerät während eines Schreibvorgangs durch Abziehen der Versorgungsspannung mit einem Brown-Out-Reset verabschiedet, habe ich wohl kaum die Möglichkeit, danach noch ein Verify durchzuführen. Und beim nächsten Widerkehren der Versorgungsspannung wird wohl das Status-Bit für die Brown-Out-Detection nicht mehr gesetzt sein. Das RAM ist dann auch leer, also gibt es auch nichts, wogegen ich ein Verify durchführen könnte. Gruß, Markus_8051
Genau so sehe ich das auch! Ich wollte eigentlich nur sagen, dass es Sicherheitskriterien gibt, die man in dieser Hinsicht einhalten sollte. Aber die Frage hat sich doch darauf bezogen, ob man erkennen oder verhindern kann, dass ein Schreibfehler nach oder während eines Resets aufgetreten ist. Der Brown-Out unterbricht GARANTIERT einen Schreibvorgang und es gibt meiner Ansicht NICHTS, was man DAGEGEN tun könnte. Gruß TK
Hi! >Der Brown-Out unterbricht GARANTIERT einen Schreibvorgang und es gibt >meiner Ansicht NICHTS, was man DAGEGEN tun könnte. Ich denke schon, man muss nur vorher feststellen das Ub am einbrechen ist. Bei wichtigen Sachen wird das gemacht. - bei Netzanwendungen 3 fehlende Netzperioden - bei Batt-anwendungen Belastungstest mit Spannungskontrolle(für lange Laufzeit natürlich Mist) MFG Uwe
Die Versorgungsspannung des uC durch einen ELKO stützen, der so groß ist, daß er die Zeit zum Schreiben der Zelle hält. Dann vor dem ELKO entweder eine Shottky-Diode plazieren und die Versorgungsspannung (vor der Diode) messen und nicht mehr ins EEPROM schreiben, wenn die Spannung ausgefallen ist. Statt der Diode würde ich sogar einen Stabi verwenden, wenn es keiner dieser uralten 78xx ist, die auf diese Verpolung allergisch reagieren und sterben.
Oder den Wert einfach 2mal reinschreiben, dabei festlegen welcher zuerst, und welcher danach geschrieben wird. Weichen beide voneinander ab, ist wohl was schiefgelaufen.
Vielen Dank für Eure zahlreichen Antworten! @TK: Die von Dir angeführten Sicherheitskriterien sind in der eingesetzten Software bereits alle umgesetzt. @Uwe, Bernd: Die Idee ist gut, allerdings ist die Schaltung nicht mehr zu ändern. In der nächsten Version wird aber eine entsprechende Überwachung der Versorgungsspannung implementiert @I_H.: Über so eine Softwarelösung habe ich auch schon nachgedacht. Ist wohl die einzige Möglichkeit im Nachhinein ein sicheres Schreiben der Daten durchzuführen. Danke an alle, Markus_8051
Aha, dann schreib doch alle Werte dreimal. Beim Lesen kannst Du dann ja eine Entscheidung vorsehen, welchem Wert geglaubt wird. (Dabei sollte man auch die zeitliche Abfolge des Schreibvorgangs berücksichtigen).
Oder bei größeren Datenmengen zweimal mit Checksumme. Vor Beginn der Veränderung des zweiten Bereichs muss die Schreiboperation des ersten Bereiches abgeschlossen sein.
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.