www.mikrocontroller.net

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


Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ---- __ (quaddash)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.