Forum: Mikrocontroller und Digitale Elektronik PIC: EEPROM-Write durch BrownOut unterbrochen


von Markus 8. (markus_8051)


Lesenswert?

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

von TK (Gast)


Lesenswert?

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

von TK (Gast)


Lesenswert?

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

von Markus 8. (markus_8051)


Lesenswert?

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

von TK (Gast)


Lesenswert?

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

von Uwe (Gast)


Lesenswert?

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

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

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.

von I_ H. (i_h)


Lesenswert?

Oder den Wert einfach 2mal reinschreiben, dabei festlegen welcher 
zuerst, und welcher danach geschrieben wird. Weichen beide voneinander 
ab, ist wohl was schiefgelaufen.

von Markus 8. (markus_8051)


Lesenswert?

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

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

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

von Winfried (Gast)


Lesenswert?

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