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
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
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).
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
"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.
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.
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.