Forum: Mikrocontroller und Digitale Elektronik EEPROM -seltsames Verhalten?


von Paul (Gast)


Lesenswert?

Hallo,

Ich verwende einen 1K EEPROM zum Speichern von diversen Einstellungen.
Seit kurzem habe ich ein merkwürdiges Phänomen beobachtet: Nach dem 
Ausschalten und erneutem Einschalten veränderten sich in zwei bestimmten 
Speicheradressen die Werte. In einem stand plötzlich 0 statt 30, in 
einem anderen 256 statt 308. Ich verwende zahlreiche Speicheradressen 
des EEPROM-Chips, begonnen bei den unteren Adressen, also 0,4,8,.. 
jeweils 4 bytes für einen Speichereintrag als Zahl(uint32_t). Die beiden 
betroffenen Speicheradressen liegen nicht nebeneinander (die eine ist 
32, die andere 608).
Ich habe durch zig-Maliges Aus- und wieder Einschalten versucht, den 
Vorgang zu simulieren bzw. auf irgend einen Zusammenhang zu kommen, was 
mir nicht gelang. Das Problem tritt nicht bei jedem Aus- und 
Einschalt-Vorgang auf, nur ganz selten, weshalb es auch so schwierig 
ist, etwaige Ursachen zu finden. Wenn diese Verhalten auftritt, dann 
werden immer genau die selben beiden Einstellungen auf die besagten 
Werte 0 und 256 geändert. Aus meiner Sicht wird während des Aus- und 
Einschalt-Vorganges nichts in den EEPROM geschrieben, weshalb ich auch 
nicht an einen Programmierfehler glaube.

Die betroffenen Speicherzellen wurden bei weitem nicht so oft neu 
beschrieben wie ihre typische Lebensdauer.

Meine Konkrete Frage: Kann so ein Verhalten hardware-bedingt sein? D.h. 
ein Speicherfehler, der manchmal auftritt und dann aber immer den 
gleichen falschen Wert liefert? Und das an zwei unterschiedlichen 
Speicher-Adressen? Klingt relativ unwahrscheinlich, aber die 
Alternative, dass es doch programmtechnischer Natur ist, ist auch nicht 
wahrscheinlicher, da der Fehler manchmal auch auftritt, wenn die 
Anwendung gar nichts getan hat, außer Aus- und wieder Einschalten. Ich 
bin natürlich dran, mein Programm nach Fehlern zu durchsuchen, habe aber 
nach zig Stunden nichts bedenkliches gefunden, weshalb ich mal 
vorsichtig anfragen wollte, ob solch ein Verhalten in irgendeiner Weise 
durch einen Hardwarefehler erklärbar sein kann. Is es denkbar, dass ein 
Speicherfehler noch sporadisch auftritt, oder müsste der dann immer nach 
Aus-und Einschalten auftreten? Gibt es eine Erklärung, weshalb immer die 
gleichen zwei getrennten Speicherplätze gleichzeitig betroffen sind? 
Nachdem ich software-seitig nichts finden konnte, sehe ich ansonsten nur 
zwei Möglichkeiten: Einige Programmteile neu programmieren, evtl. mit 
anderen Speicherplätzen, um zu sehen, ob der Fehler dann immer noch 
(oder vielleicht an anderen Adressen) auftritt, andere Möglichkeit wäre 
Austauschen des EEPROMs. Vorab würde ich aber gerne um Einschätzung 
bitten, wie so ein Verhalten möglicherweise am ehesten zu erklären ist. 
Ich möchte vermeiden, dass ich (mit viel Aufwand) beispielsweise 
umprogrammiere, aber ohne Garantie, ob der Fehler dann nicht erst recht 
wieder auftritt, wenn er doch hardware-seitig bedingt war. Umgekehrt 
bringt der Hardware-Tausch auch nichts, wenn es doch die Software war. 
Wie ist eure Einschätzung?

von Einer K. (Gast)


Lesenswert?

Paul schrieb:
> denkbar
ist vieles.

Aber überprüfbar, Fakten: Null!
Null Komma gar nix.

Außer Prosa nix gewesen....

von Paul (Gast)


Lesenswert?

Ich weiß, dass ich mich sehr allgemein ausgedrückt habe.
Den Programmcode kann ich nicht veröffentlichen, weil es ein 
kommerzielles Produkt ist, und weil es auch nicht wirklich zumutbar ist, 
dass sich jemand die 100 Textseiten durchschaut. Ich möchte einfach nur 
wissen, ob es theoretisch möglich ist, dass ein EEPROM-Speicher solche 
Anomalien zeigt, oder ob das auf jeden Fall ein Software-Problem sein 
muss, weil es eben ausgeschlossen ist, dass sich ein EEPROM so 
verhält...

von Einer K. (Gast)


Lesenswert?

Ok ....

von Georg A. (georga)


Lesenswert?

Paul schrieb:
> Ich verwende einen 1K EEPROM zum Speichern von diversen Einstellungen.

Gibt ja nur drölfzig EEPROM-Hersteller und EEPROM-Typen und 
EEPROM-Interfaces. Vermutlich hast du genau den Chip eingebaut, bei dem 
im Datenblatt als Feature "Random content every 10k reads" steht. Kann 
schon mal passieren, wenn man das Datenblatt nicht liest.

> Aus meiner Sicht wird während des Aus- und Einschalt-Vorganges
> nichts in den EEPROM geschrieben, weshalb ich auch nicht an einen
> Programmierfehler glaube.

Du solltest erstmal an ein Oszilloskop oder einen Logicanalyzer glauben. 
Das schafft Erleuchtung.

von Wolfgang W. (Gast)


Lesenswert?

Hallo,

ist das EEPROM Bestandteil eines Microcontrollers? Wenn ja, dann wäre 
mein Verdacht eine unvollständige bzw. nicht vorhandene 
Brownout-Schaltung, die den Controller bei Unterschreiten der minimal 
zulässigen Versorgungsspannung sofort anhält.

Selbiges wäre auch der Fall, wenn das EEPROM ein externer I2C- oder 
SPI-Typ ist.

Außerdem wäre (mit Oszi) zu prüfen, ob die Versorgungsspannung beim Ein- 
und Auschalten wilde Haken schlägt. So was hab ich schon bei einfachen 
Netzteilen mit primärseitigem Schalter, Trafo, Gleichrichter, 
Spannungsregler und zugehörigen Elkos gesehen.

MfG Wuff_W

von PittyJ (Gast)


Lesenswert?

Hm
Kein Hersteller, Kein Typ (I2C, SPI, 8Bit parallel(so wie früher) ).

Und eine Speicherstelle mit 308 habe ich noch nie erlebt, weil die 
Eeproms meist Byte orientiert sind. Da muss woanders ein Problem sein.

Entweder gibt es noch Fakten, oder das war ein Beichtstuhlposting, um 
das Gewissen zu befrieden. Dann bekommst du jetzt Absolution von mir.

Achja: und die 100 Seiten Text: meine EEprom (24AA01-EMC) Routine für 
den STM-32 ARM hat 420 Zeilen.

von mIstA (Gast)


Lesenswert?

Paul schrieb:
> Umgekehrt bringt der Hardware-Tausch auch nichts, wenn es
> doch die Software war.

Aber der Hardware-Tausch (des EEPROMs) ist wahrscheinlich deutlich 
weniger Aufwand als Du bisher schon in die Suche nach dem Fehler 
gesteckt hast.
Wenn danach das Fehlerbild lange genug nicht mehr auftritt, dann kannst 
Du mit hoher Wahrscheinlichkeit davon ausgehen, daß es ein 
Hardwaredefekt war; bzw. umgekehrt, sollte sich nach dem EEPROM-Tausch 
irgendwann ein identes Fehlerbild zeigen, dann weißt Du, daß es an der 
Software liegen muß.
Außerdem kannst Du, sofern diese beiden Werte an den konkreten Adressen 
normalerweise nie auftreten können, automatisch beim Programmstart 
überprüfen, ob der Fehler aufgetreten ist.

von H. (Gast)


Lesenswert?

Brownout wurde schon genannt, ansonsten auch mal einen Zugriffszähler 
(Write Counter) mit in den Datensatz einbauen. Dann kann man sehen, ob 
wirklich nur zu den beabsichtigten Zeitpunkten geschrieben wird. Und 
wenn man es ordentlich machen will: Datensatz mit CRC doppelt ablegen, 
z.B. in untere und obere EEPROM Hälfte. Beim Startup stets prüfen, ob 
beide Datensätze okay und ggf. korrigieren, dabei nur den defekten 
Datensatz anfassen. Vorher nichts anderes machen. Beim Schreiben im 
normalen Programm streng nacheinander schreiben.
Kann man auch im Nachhinein einbauen, davon wird das Hauptprogramm nicht 
beeinflusst werden.

von H. (Gast)


Lesenswert?

Falls Du das mit dem doppelten Datensatz so baust führe bitte neben dem 
Write Counter noch einen Zähler ein, wie oft der Datensatz gerettet 
werden musste.
Übrigens gibt es unzählige dilettantische Produkte, bei denen das EEPROM 
Handling nicht sauber implementiert wurde und der Kunde dann durch 
gelegentliche Ausfälle das Nachsehen hat (z.B. meine Jalousiemotoren von 
Elero)

Baue bitte nicht noch eins.

von Peter D. (peda)


Lesenswert?

Georg A. schrieb:
> Gibt ja nur drölfzig EEPROM-Hersteller und EEPROM-Typen und
> EEPROM-Interfaces.

Genau.
Ein Link auf das Datenblatt oder die vollständige Bezeichnung wäre das 
absolut mindeste.
Wir sind hier ja nicht bei den Kaffeesatzlesern.

von Karl B. (gustav)


Lesenswert?

Paul schrieb:
> Ich verwende zahlreiche Speicheradressen
> des EEPROM-Chips, begonnen bei den unteren Adressen, also 0,4,8,..
> jeweils 4 bytes für einen Speichereintrag als Zahl(uint32_t).

Hi,
und ohne "atomic" Schreibroutine? Haut noch ein Interrupt dazwischen?
https://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html

ciao
gustav

von Michael (Gast)


Lesenswert?

Hier kann kaum gesagt werden, was die Ursache dieses Verhalten ist. 
Insofern kann auch mein Beitrag nur ein Denkanstoß sein, denn das 
gleiche Problem hatte ich auch einmal. Es ging um ein 
Batteriebetriebenes Gerät und beim Einlegen der Batterie prellte die 
Versorgungsspannung zwangläufig mehrmals und der Controller startete 
daher auch mehrmals. In der Anfangssequenz wurde auch das EEPROM 
„gelesen“. Diese Lesevorgänge brachen durch das Prellen natürlich ab. 
Das EEPROM blieb aber wegen der Pufferung (ausreichend) an Spannung und 
dann konnte es passieren, dass sich ein erneuter READ Zugriff zu einem 
WRITE Zugriff verwandelte, da das EEPROM noch Daten im Empfangspuffer 
hatte. Als die Ursache klar war, konnte man geeignete Gegenmaßnahmen 
ergreifen.
Viel Erfolg

von Paul Kaiser (Gast)


Lesenswert?

Vielen Dank für eure Antworten, da waren wirklich gute Tipps dabei.

Vielleicht noch etwas zur Hardware:

Der EEPROM, von dem ich spreche, befindet sich an Bord eines NEXTION 
HMI:
https://nextion.tech/enhanced-series-introduction/
Das Beschreiben selbst übernimmt die (closed Source) Firmware des 
NEXTION.

Im NEXTION ist folgender EEPROM verbaut:

http://ww1.microchip.com/downloads/en/devicedoc/doc0180.pdf

Leider habe ich kein Oszilloskop zur Verfügung. Ich werde mal das 
NEXTION tauschen und sehen, ob der Fehler dann immer noch (oder 
womöglich in einer anderen Speicher-page?) auftritt. Es bleibt aber ein 
Unsicherheitsfaktor, da der Fehler eben nur sporadisch auftritt. 
Eigentlich hätte ich schon gerne Gewissheit, wo die Ursache liegt...

von Walter T. (nicolas)


Lesenswert?

Michael schrieb:
> dann konnte es passieren, dass sich ein erneuter READ Zugriff zu einem
> WRITE Zugriff verwandelte,

Gibt es zu dem Phänomen irgendetwas an Lesestoff? Davon habe ich noch 
nie gehört.

von Teo (Gast)


Lesenswert?

Wolfgang W. schrieb:
> Außerdem wäre (mit Oszi) zu prüfen, ob die Versorgungsspannung beim Ein-
> und Auschalten wilde Haken schlägt.

Wenn die zB. über einen Hohlstecker oä. läuft, bräucht's evtl. nen 
dickeren Elko vom Regler!?

von Rainer V. (a_zip)


Lesenswert?

Paul Kaiser schrieb:
> Es bleibt aber ein
> Unsicherheitsfaktor, da der Fehler eben nur sporadisch auftritt.

Ganz klar. Sporadische Fehler sind die Pest. Hier scheint mir der Tausch 
auch erst mal der beste Ansatz. Da muß man halt hoffen, das sich etwas 
verwertbares zeigt. Parallel dazu könnte man versuchen, das EEprom mit 
einer Testsoftware separat zu quälen. "Einschalten" und "Ausschalten" 
wären im Hinblick auf ein EEprom vielleicht noch gesondert zu 
untersuchen. Außerdem sollte bestimmt dieser Zugriffszähler rein. 
Ungewollte Zugriffe auf das EEprom müssen natürlich auch sicher 
ausgeschlossen werden. Ansonsten kannst du ja die Konsistenz des ganzen 
Datensatzes überhaupt nicht garantieren. Ich bin gespannt!
Gruß Rainer

von Paul Kaiser (Gast)


Lesenswert?

Mal angenommen, der Speicherfehler hat was mit Spannungsspitzen zu tun:
Ist es tatsächlich denkbar, dass der Fehler immer an der selben Adresse 
und dem gleichen "falschen" Wert auftritt?

Teo schrieb:
> Wenn die zB. über einen Hohlstecker oä. läuft, bräucht's evtl. nen
> dickeren Elko vom Regler!?

von Paul Kaiser (Gast)


Lesenswert?

Soweit ich das jetzt überblicken kann, wird das schwierig. Ich habe nur 
über eine Funktion Zugriff auf das von mir gewollte EEPROM Lesen und 
Schreiben. Was genau das NEXTION während dem "Setup" macht, entzieht 
sich meiner Kenntnis. Ich weiß nicht, ob es viel Sinn macht, wenn ich 
bei den Chinesen anfrage, wie bzw. ob sie das EEPROM Lesen und schreiben 
handlen...

Rainer V. schrieb:
> Außerdem sollte bestimmt dieser Zugriffszähler rein.
> Ungewollte Zugriffe auf das EEprom müssen natürlich auch sicher
> ausgeschlossen werden. Ansonsten kannst du ja die Konsistenz des ganzen
> Datensatzes überhaupt nicht garantieren. Ich bin gespannt!
> Gruß Rainer

von Peter D. (peda)


Lesenswert?

I2C-EEPROM sind sehr sicher. Sie benötigen eine Sequenz von 5 Aktionen, 
damit ein Schreiben erfolgt (Start, Deviceadresse, Memoryadresse, 1. 
Datenbyte, Stop).
Es liegt daher mit Sicherheit ein Problem in der CPU oder Firmware vor.
Es kann sein, daß die CPU kein ordentliches Power-On-Reset macht, z.B. 
in den Konfigurationsbits keine oder eine zu kleine 
Unterspannungsschwelle enabled ist.
Notfalls muß man einen externen Supervisor-IC an den Resetpin der CPU 
hängen, um ein sauberes Reset zu erzwingen.

von Paul Kaiser (Gast)


Lesenswert?

Danke peda für deine Einschätzung. Aber was genau passiert im 
EEPROM,wenn das Power-On_Reset nicht korrekt ausgeführt wird? Wie kann 
es sein, dass immer genau an der gleichen Stelle der Fehler auftritt? 
Müsste dann nicht viel eher ein "allgemeines" Datenchaos herrschen?

Peter D. schrieb:
> I2C-EEPROM sind sehr sicher. Sie benötigen eine Sequenz von 5 Aktionen,
> damit ein Schreiben erfolgt (Start, Deviceadresse, Memoryadresse, 1.
> Datenbyte, Stop).
> Es liegt daher mit Sicherheit ein Problem in der CPU oder Firmware vor.
> Es kann sein, daß die CPU kein ordentliches Power-On-Reset macht, z.B.
> in den Konfigurationsbits keine oder eine zu kleine
> Unterspannungsschwelle enabled ist.
> Notfalls muß man einen externen Supervisor-IC an den Resetpin der CPU
> hängen, um ein sauberes Reset zu erzwingen.

von Teo (Gast)


Lesenswert?

Paul Kaiser schrieb:
> Mal angenommen, der Speicherfehler hat was mit Spannungsspitzen zu tun:
> Ist es tatsächlich denkbar, dass der Fehler immer an der selben Adresse
> und dem gleichen "falschen" Wert auftritt?
>
> Teo schrieb:
>> Wenn die zB. über einen Hohlstecker oä. läuft, bräucht's evtl. nen
>> dickeren Elko vom Regler!?

Eigentlich garnicht, wäre rein zufällig.
Nur wenn der Brownout der Auslöser für diesen Schreibzykluses wäre.

von Rainer V. (a_zip)


Lesenswert?

Paul Kaiser schrieb:
> Ich weiß nicht, ob es viel Sinn macht, wenn ich
> bei den Chinesen anfrage, wie bzw. ob sie das EEPROM Lesen und schreiben
> handlen...

Na, dann solltest du es aber herausfinden. Wenn du quasi überhaupt 
keinen Zugang zum System hast außer einer Schreib- und Lesefunktion, 
dann ist es doch unmöglich mehr zu machen, als den Datenfehler 
festzustellen! Ich würde mir da jetzt Gedanken machen, wie ich die 
Fehler "wasserdicht" dokumentieren könnte. Und wenn dann auch für deinen 
Chef zweifelsfrei feststeht, dass es Fehler gibt, wird man die weitere 
Vorgehensweise festlegen müssen. Das sieht alles nach unendlichem Ärger 
aus! Bin weiter gespannt...
Gruß Rainer

von Peter D. (peda)


Lesenswert?

Paul Kaiser schrieb:
> Wie kann
> es sein, dass immer genau an der gleichen Stelle der Fehler auftritt?

Das würde für mich sehr stark für einen Firmwarefehler sprechen.

Ein fehlendes Unterspannungsreset kann dazu führen, daß mit Absinken der 
VCC die CPU nicht mehr richtig arbeitet, an eine falsche Adresse springt 
und schnell noch einen Schreibbefehl an das EEPROM schickt.

Wie oft muß denn der EEPROM geändert werden?
Man könnte über einen Jumper oder Schalter den WP-Pin auf Read-only 
(VCC) setzen.

von Paul (Gast)


Lesenswert?

Du meinst, dies tritt auf, wenn ein gewollter Schreibbefehl während dem 
Herunterfahren der Spannung erfolgt und durch den Spannungsabfall falsch 
geschrieben wird? Oder entsteht dieser Schreibbefehl durch den 
Spannungsabfall? Das wäre ja eher unwahrscheinlich bei dem, was du über 
das Protokoll dieser EEPROMs gesagt hast, richtig?
Soweit ich das beobachtet habe, habe ich während des Ausschaltens keinen 
Schreibbefehl erteilt, als der Fehler das letzte Mal auftrat.
So wie ich mir das vorstelle, passiert der Fehler auf jeden Fall immer 
im gleichen Ablauf und Timing, da es sonst ja praktisch ausgeschlossen 
ist, dass an der gleichen Speicheradresse falsch geschrieben wird. Wie 
ist das eigentlich mit dem I2C- Schreib-Protokoll? Ich nehme an, nur 
eine "elektrische Störung", also eben ein Spannungsabfall etc. kann zu 
so einem Schreibfehler führen, oder? Oder anders formuliert: Ein 
softwareseitiges Falsch-behandeln, indem ich z.B. einen neuen 
Schreib-Befehl sende, bevor der alte abgeschlossen ist, ist nicht 
denkbar, oder? Ich nehme an, der EEPROM würde den neuen Schreibbefehl 
erst ausführen, wenn der erste abgeschlossen ist, oder?
Das mit dem WP-Pin ist natürlich eine super Idee, aber der 
Endverbraucher soll jederzeit Einstellungen ändern können, ohne einen 
Jumper oder Schalter zu betätigen. Super wäre natürlich, wenn mein uC 
Zugriff auf den WP hätte, das NEXTION Display ist aber leider nur über 
die Serielle Schnittstelle mit dem uC verbunden, da geht also nichts :-(

Peter D. schrieb:
> Ein fehlendes Unterspannungsreset kann dazu führen, daß mit Absinken der
> VCC die CPU nicht mehr richtig arbeitet, an eine falsche Adresse springt
> und schnell noch einen Schreibbefehl an das EEPROM schickt.
>
> Wie oft muß denn der EEPROM geändert werden?
> Man könnte über einen Jumper oder Schalter den WP-Pin auf Read-only
> (VCC) setzen.

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.