Forum: Mikrocontroller und Digitale Elektronik EEPROM nicht konsistent nach Aus-/Einschalten


von Volker (Gast)


Lesenswert?

Hallo zusammen!

Ich verwende einen Mega16L den ich in C mit dem AVR-GCC programmiere.
Wenn ich nun das interne EEPROM nutze um dort Konfigurationswerte
abzulegen kommt es vor, dass nachdem ich die Spannungsversorgung ein
und wieder ausschalte, der Inhalt des EEPROMs unterschiedlich ist!
(Dazu lese ich das EEPROM über den JTAG ICE und dem AVR Studio aus.)
Einen zufälligen Schreibzugriff auf die EEPROM Zellen kann ich vom
Programm her ausschliessen (jeder Schreibzugriff wird über eine
Schnittstelle nach aussen entweder positiv oder negativ quittiert und
auch nur über diese Schnittstelle angetriggert).

Hat jemand solch ein Verhalten schon mal erlebt? Muss ich ein
aufwändigeres EEPROM Management einsetzen (mehrfachablage, Prüfsummen)?
Leider ist die Hardware momentan ein Unikat und ich kann nicht auf die
Schnelle mit einem zweiten Controller testen.

Ich wäre für ein paar Tipps dankbar!

Viele Grüsse

Volker

von Volker (Gast)


Lesenswert?

Ich hab jetzt noch ein wenig tiefer gegraben und bin auf diese Compiler
Warning gestossen:

appl.c:41: warning: missing braces around initializer
appl.c:41: warning: (near initialization for 'msg_key_eeprom[0]')

Die betreffende Zeile ist genau die Stelle, an der das EEPROM
"urinitalisiert" wird:

static struct msg msg_key_eeprom[16] EEMEM =
{0xB,0x20,0x11,0x8,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x1,\
0xB,0x20,0x11,0x8,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,\
0xB,0x20,0x11,0x8,0x2,0x1,0x1,0x1,0x1,0x1,0x1,0x1,\
0xB,0x20,0x11,0x8,0x3,0x1,0x1,0x1,0x1,0x1,0x1,0x1,\
0xB,0x20,0x11,0x8,0x4,0x1,0x1,0x1,0x1,0x1,0x1,0x1,\
0xB,0x20,0x11,0x8,0x5,0x1,0x1,0x1,0x1,0x1,0x1,0x1,\
0xB,0x20,0x11,0x8,0x6,0x1,0x1,0x1,0x1,0x1,0x1,0x1,\
0xB,0x20,0x11,0x8,0x7,0x1,0x1,0x1,0x1,0x1,0x1,0x1,\
0xB,0x20,0x11,0x8,0x8,0x1,0x1,0x1,0x1,0x1,0x1,0x1,\
0xB,0x20,0x11,0x8,0x9,0x1,0x1,0x1,0x1,0x1,0x1,0x1,\
0xB,0x20,0x11,0x8,0xA,0x1,0x1,0x1,0x1,0x1,0x1,0x1,\
0xB,0x20,0x11,0x8,0xB,0x1,0x1,0x1,0x1,0x1,0x1,0x1,\
0xB,0x20,0x11,0x8,0xC,0x1,0x1,0x1,0x1,0x1,0x1,0x1,\
0xB,0x20,0x11,0x8,0xD,0x1,0x1,0x1,0x1,0x1,0x1,0x1,\
0xB,0x20,0x11,0x8,0xE,0x1,0x1,0x1,0x1,0x1,0x1,0x1,\
0xB,0x20,0x11,0x8,0xF,0x1,0x1,0x1,0x1,0x1,0x1,0x1};

Welche fehlenden Klammern werden hier angemeckert??

Viele Grüsse

Volker

von ---- _. (quaddash)


Lesenswert?

Naja, er wird die Klammern um deine 12 Variablen meinen, die wohl in
"msg" definiert sind.

static struct msg msg_key_eeprom[16] EEMEM =
{
{0xB,0x20,0x11,0x8,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x1},
{0xB,0x20,0x11,0x8,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1},
usw.
};

Aber was anderes: Könnte es sein, daß deine Zeile zu lange wird (durch
die '\' am Ende jeder Zeile wird diese ja bekanntlich zu einer Zeile
zusammengezogen)? Lass die Backslashs mal weg.
In welcher Art ist dein Eeprom denn korrupt? Erst ab einer bestimmten
Stelle alle Werte falsch, aber der Anfang stimmt?

----, (QuadDash).

von Volker (Gast)


Lesenswert?

Das Weglassen der Backslashes brachte für die Warnings auch keine
Änderungen, wie meinst Du das mit den Klammern um die 12 Variablen? MSG
ist ne Struktur di in nem anderen File definiert ist.

Zu dem korrupten EEPROM:
Es lässt sich leider keine Regelmässigkeit feststellen. Manchmal ist es
nur ein Bit (0->1) ein andermal mehrere (01->3C) in nem ganz anderen
Byte. Ich kann bisher keine Zusammenhänge erkennen.

Das Auslesen des EEPROMs während der Initialisierung erfolg unter
Interruptsperre (ich glaube das machen die eeprom_read_block Funktionen
des avr-gcc eh). Ich lese übrigens 16 Blöcke nacheinander aus.

In einem nächsten Schritt werde ich mal alle Schreiboperationen aus der
Taskliste entfernen, allerdings bin ich mir sehr sicher,dass da keiner
unbemerkt aufs EEPROM schreibt.

Viele Grüsse

Volker

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

"wie meinst Du das mit den Klammern um die 12 Variablen? "

Du initialisierst ein Array von 16 Instanzen einer Struktur - für jede
Instanz sind eigene Klammern erforderlich.

Da die Struktur 12 Elemente zu enthalten scheint, ist also jeder Block
von 12 Bytes von Klammern zu umgeben.

von The Daz (Gast)


Lesenswert?

Volker,
den Spass kenne ich von einem Projekt mit nem AT90S2313. Eine
Erklaerung habe ich dafuer nie gefunden aber das Verschieben der
Datenablage auf die EEPROM Adresse 10 (und folgende) hat das Problem
fuer mich geloest.

von Volker (Gast)


Lesenswert?

vielleicht hab ich jetzt etwas überlesen, aber ich konnte keine Angaben
darüber finden, ob du die im Controller integrierte Brown-Out Einheit
benutzt.

Falls nicht, musst du mit einem externen Reset-Controller für einen
definierten Reset sorgen, ansonsten kann es bei zu geringen Spannungen
(auch im Ein- und Ausschaltzeitpunkt) zu fehlerhaften
EEprom-Zugriffen kommen, dies steht aber auch irgendwo im Datenblatt
drin.

Volker (ein anderer)

von Volker (Gast)


Lesenswert?

Hallo zusammen!

@Rufus
Ja, genau das war der Grund für die Warnings. Danke!

@The Daz
Das selbe habe ich auch probiert. Ich hab einfach meine Daten etwas
nach oben verschoben. Leider sind die inkonsistenten Bereich
mitgewandert. Das hat dazu geführt, dass ich sämtliche
Schreiboperationen im Sourcecode deaktiviert habe.... und siehe da...
nach ein paar Ein-Aus-Ein Zyklen war noch immer nichts passiert.
Ich bin jetzt dabei alle Buffer Initialisierungen nochmals genau zu
überprüfen, denn ein Schreiben des EEPROMs wird nie direkt angestossen,
es muss immer eine handvoll Bedinungen erfüllt sein (und die sind nie
erfüllt, da sie von aussen vorgegeben werden müssen). So richtig klar
ist mir das noch nicht..

dann kam der goldene Tipp!

@Volker (ein anderer) :-)
Ich glaube, Du hattest den goldenen Tipp parat! Ich hatte zwar den
Brown Out Level eingestellt, aber die enable Fuse nicht gesetzt. Seit
ich die Detection enabled habe tritt kein Problem mehr auf!!!

Ich hab jetzt nochmal im Datenblatt nachgelesen und sehe, dass es zwei
Möglichkeiten gibt bei dem das EEPROM bei niedriger Spannung leiden
kann. Bei einem Schreibzugriff und wenn die CPU Befehle nicht mehr
korrekt abarbeiten kann. Einen Schreibzugriff mach ich nur, wenn er von
aussen angeregt wird (ev. ist doch an meiner Initialsierung etwas
faul???) und die zweite Möglichkeit, dass die CPU Befehle nicht mehr
richtig ausführen kann. Wäre doch etwas merkwürdig, wenn das so
reproduzierbar wäre?

Jedenfalls ist mein Sonntag gerettet und ich suche noch ein wenig
weiter :-)

Viele Grüsse

Volker

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.