Forum: Mikrocontroller und Digitale Elektronik [t4313] EEPROM verliert Inhalt?


von J. W. (jw-lighting)


Lesenswert?

Hallo,

ich hatte zunächst gedacht, mein Fehler hängt mit dem Bug in einigen AVR 
zusammen, dass EEPROM-Adresse 0 fehlerhaft ist.
Nach einem Blick ins Listing scheint das aber nicht der Fall zu sein.

Ich habe eine Variable (chip_erase_check) im EEPROM (verwende die 
avr-libc Funktionen) die auf einen bestimmten Wert geprüft wird. Ist 
dieser Wert nicht vorhanden, werden alle EEPROM-Variablen mit ihren 
Default-Werten beschrieben und der erwartete Wert in die Check-Variable 
geschrieben:
1
/// EEPROM variables
2
uint8_t    chip_erase_check EEMEM,
3
      prog_speed_eemem EEMEM = 170,
4
      prog_wait_eemem EEMEM = 170;
5
uint16_t  powerleda_on_eemem EEMEM = 1023,
6
      powerledb_on_eemem EEMEM = 1023;
7
8
9
// ...
10
11
12
void check_eemem(void){
13
  
14
  uint8_t temp;
15
  temp = eeprom_read_byte(&chip_erase_check);
16
  
17
  #define CHECK_NEGATIVE 0xAA
18
  if(temp == CHECK_NEGATIVE){
19
    return;
20
  }
21
  
22
  PROG_ACTIVE_PORT |= (1<<PROG_ACTIVE); // indicate EEPROM default writing
23
  
24
  eeprom_write_byte(&prog_speed_eemem, 175);
25
  eeprom_write_byte(&prog_wait_eemem, 175);
26
  eeprom_write_word(&powerleda_on_eemem, POWERLED_ON);
27
  eeprom_write_word(&powerledb_on_eemem, POWERLED_ON);
28
  
29
  eeprom_write_byte(&chip_erase_check, CHECK_NEGATIVE);
30
  
31
}

Das hat anfangs alles wunderbar funktioniert. Seit neustem wird der 
EEPROM aber bei jedes mal, nachdem die Spannung weg war, neu 
beschrieben, der Wert der Variable ist also verloren gegangen. Woran 
kann das liegen? Was tuen?
Es gibt sonst keine Stellen im Programm, die diese Variable beschreiben, 
da bin ich sicher ;)

LG :)

PS: Sind die EEPROM-Funktionen der avr-libc eigentlich schon gegen 
Unterbrechung durch Interrupts gesichert, oder muss ich das selber 
machen? Die Interrupts werden aber erst nach Aufruf von check_eemem() 
aktiviert.

von Oliver (Gast)


Lesenswert?

Die klassische Antwort zu dem Problem lautet brown-out.

(eigentlich lautet sie RTFM)

Oliver

von J. W. (jw-lighting)


Lesenswert?

Hallo Oliver,

vielen Dank für deine Hilfe. Das scheint echt was gebracht zu haben. 
Trotzdem spinnt der Controller nach dem Einschalten jetzt manchmal und 
macht Sachen, die er nicht tuen soll. Nach ca. 10 Tests scheint der 
EEPROM jetzt aber zu arbeiten, wie er soll.
Ich habe den BOD auf 4,3V eingestellt.

Da ich den µC am Netzteil und mit recht dicken Elkos betreibe hatte ich 
nicht mit einem Problem durch die Versorgungsspannung gerechnet. Dazu 
kommt, dass ich nur in Erinnerung hatte, es könne Probleme beim 
Schreiben durch zu niedrige Spannung geben. Und da ich nicht schreibe, 
während die Spannung instabil ist (das ist sie nur kurz nach einschalten 
und beim Entladen nach dem Ausschalten, habs mit dem Oszi nachgemessen) 
hatte ich das ausgeschlossen.

LG :)

von Uwe (de0508)


Lesenswert?

Wie hoch ist der Takt?

mir kam noch eine Idee die sich mal auf den attiny861 bezog, dort war 
bei 10MHz schluss, um das eeprom geschreiben zu können.

von pompete (Gast)


Lesenswert?

J. W. schrieb:
> Seit neustem wird der
> EEPROM aber bei jedes mal, nachdem die Spannung weg war, neu
> beschrieben, der Wert der Variable ist also verloren gegangen. Woran
> kann das liegen? Was tuen?

....programm nochmals prüfen, irgendwo läuft dein programm am anfang 
entweder amok (interruptproblem?) oder verirrt sich sonstwie in deine 
eeprom-routine.
von alleine beschreibt sich das teil nicht.....ich würde z.b. die 
eeprom-routine in einem kleinen testprogramm isolieren und etwas in den 
eeprom schreiben lassen, ohne interrupts und den ganzen kladeradatsch.
wenn nun nach dem einschalten nix verloren geht, nacheinander 
komponenten hinzufügen.....manchmal ist der umständliche weg der 
schnellste.....

von Michael (Gast)


Lesenswert?

J. W. schrieb:
> Da ich den µC am Netzteil und mit recht dicken Elkos betreibe hatte ich
> nicht mit einem Problem durch die Versorgungsspannung gerechnet.

Wo hast du die "recht dicken Elkos", am Eingang oder/und Ausgang deinen 
Spannungsreglers (welcher?)? Und hast du die VCC direkt am µC mit 100 nF 
abgeblock? Ein dicker Elko bringt nichts gegen kurze Strombedarsspitzen.

von J. W. (jw-lighting)


Lesenswert?

Hallo,

dank für die weiteren Antworten ! ;)

Uwe S. schrieb:
> Wie hoch ist der Takt?

8MHz vom Quarz ohne Teilung durch acht (CKDIV8 unprogrammed)

pompete schrieb:
> ....programm nochmals prüfen, irgendwo läuft dein programm am anfang
> entweder amok (interruptproblem?) oder verirrt sich sonstwie in deine
> eeprom-routine.
> von alleine beschreibt sich das teil nicht.....

Bisher gabs keine Probleme mit dem EEPROM mehr, seitdem die BOD 
aufpasst.
Andernfalls werde ich dem dann aber sicherlich nachgehen.
Interrupts sind aber, wie gesagt nicht aktiviert während die 
check_eemem-Funktion ausgeführt wird. Die kommt nur einmal vor der 
Hauptschleife und vor sei() vor.
Kann ich den davon ausgehen, dass die EEPROM-Funktionen der avr-libc 
atomar sind? Oder muss ich mich da selbst drum kümmern?

Michael schrieb:
> Wo hast du die "recht dicken Elkos", am Eingang oder/und Ausgang deinen
> Spannungsreglers (welcher?)? Und hast du die VCC direkt am µC mit 100 nF
> abgeblock? Ein dicker Elko bringt nichts gegen kurze Strombedarsspitzen.

Ich habe 470µ direkt beim µC, sowie die obligatorischen 100n. Am 
Schaltnetzteil (Meanwell S-40-5, direkt 5V, daher kein Stabi in der 
Schaltung) habe ich zudem nochmal 6.800µ. Die dienen aber ehr dazu, die 
ungleichmäßige Belastung durch PWM (f=1kHz) auf zwei 5W-LEDs ein wenig 
auszugleichen.
Das Schaltnetzteil kommt damit aber gut zurecht, wie gesagt, habe mit 
dem Oszi nachgemessen.
Der BOD spricht darauf auch nicht an.

LG :)

von Peter D. (peda)


Lesenswert?

J. W. schrieb:
> Da ich den µC am Netzteil und mit recht dicken Elkos betreibe hatte ich
> nicht mit einem Problem durch die Versorgungsspannung gerechnet.

Gerade dadurch kann die VCC langsam absinken. Irgendwann kann dann bei 
der Programmausführung ein Fehler passieren und die CPU springt in den 
Wald, vielleicht zufällig zur EEPROM-Schreibroutine.
Das BOR hält bei Unterspannung die CPU in Reset und damit kann sie 
keinen Code falsch ausführen.


Peter

von pompete (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Gerade dadurch kann die VCC langsam absinken. Irgendwann kann dann bei
> der Programmausführung ein Fehler passieren und die CPU springt in den
> Wald, vielleicht zufällig zur EEPROM-Schreibroutine.
> Das BOR hält bei Unterspannung die CPU in Reset und damit kann sie
> keinen Code falsch ausführen.

....das klingt sinnig und würde die sache mit dem verbesserten verhalten 
bei eingeschaltetem BOD erklären....

von J. W. (jw-lighting)


Lesenswert?

Hey,

danke Peter, so langsam leuchtet das ein, ja. ;)
Das erklärt auch, warum der Fehler nur beim erneuten Einschalten 
aufgetreten ist.

LG :)

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.