Forum: Mikrocontroller und Digitale Elektronik EEPROM von Atmega168 wird scheinbar zufällig beschrieben


von SilbergrauerAdler (Gast)


Angehängte Dateien:

Lesenswert?

Hallo.

Ich wundere mich über scheinbar zufällige EEPROM-Einträge beim 
ATmega168PA-PU. An zwei Stellen tauchen nach einiger Zeit Betrieb wie 
zufällig Einträge auf.

An diese EEPROM-Stellen schreibe ich aber nicht aktiv bzw. nicht 
gewollt. Das ganze habe ich in AtmelStudio 7.0.1188 in C geschrieben.

Hier die Schreibfunktion:
1
// ------------------------
2
// Byte in EEPROM schreiben
3
// ------------------------
4
void eepromWrite (unsigned int address, unsigned char data)
5
{
6
  // Abwarten, bis anstehende Schreibvorgänge abgearbeitet sind
7
  while (EECR & (1<<EEPE))
8
  ;
9
  
10
  // EEPROM-Adresse festlegen
11
  EEAR = address;
12
  
13
  // EEPROM-Daten festlegen
14
  EEDR = data;
15
  
16
  // Logische 1 schreiben
17
  EECR |= (1<<EEMPE);
18
  
19
  //EEPROM-Schreibvorgang starten
20
  EECR |= (1<<EEPE); 
21
}

Nun die Frage: Kann es sein, dass irgendwo im Programmcode durch 
schlampige Programmierung der EEPROM beeinflusst wird, auch wenn genau 
an der Stelle der schlampigen Programmierung gar keine EEPROM-Zugriffe 
vorgesehen sind? Gibt's sowas?

Oder liegt es einzig und alleine nur daran, dass an die 
EEPROM-Schreib-Funktion falsche Adressen übergeben werden?

Woran kann es liegen? Damit ich weiß, wo ich mit Suchen anfangen soll...

Danke!

von Jim M. (turboj)


Lesenswert?

Brownout Fuse anmachen - könnte durch Unterspannung entstehen.

von Zeige Finger Heber (Gast)


Lesenswert?

SilbergrauerAdler schrieb:
> Woran kann es liegen?

Du hast die Abblock-Kondensatoren vergessen bzw. deine
Stromversorgung ist schlampig ausgeführt.

Daran kann es liegen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

SilbergrauerAdler schrieb:
> An zwei Stellen tauchen nach einiger Zeit Betrieb wie zufällig Einträge
> auf.
Immer nur dort an diesen beiden Stellen?

> Hier die Schreibfunktion:
Mach doch dort mal eine LED an, wenn diese Funktion mit einer der beiden 
Adressen aufgerufen wird. Denn dann könnte das ein amoklaufender Pointer 
sein (aka. "zu kurz definiertes Array").

von Curby23523 N. (Gast)


Lesenswert?

Wie schon indirekt erwähnt - immer wenn es an der selben Stelle 
passiert, dann ist zu 99,9999% deine eigene Software Schuld.

Und wir sehen hier leider nur deine Schreibfunktion.

von SilbergrauerAdler (Gast)


Lesenswert?

Lothar M. schrieb:
> SilbergrauerAdler schrieb:
>> An zwei Stellen tauchen nach einiger Zeit Betrieb wie zufällig Einträge
>> auf.
> Immer nur dort an diesen beiden Stellen?

Kann ich nicht genau sagen, das müsste ich genauer analysieren. Aber 
gefühlt ja, immer an denselben Stellen.

>> Hier die Schreibfunktion:
> Mach doch dort mal eine LED an, wenn diese Funktion mit einer der beiden
> Adressen aufgerufen wird. Denn dann könnte das ein amoklaufender Pointer
> sein (aka. "zu kurz definiertes Array").

DAS ist eine gute Idee. Werde ich mal probieren. Danke!

von Thomas (kosmos)


Lesenswert?

Die Led kann aber den Spannungsabfall noch verstärken. Ich wurde direkt 
vor dem 100nF Kerko den du direkt zw. VCC und GND haben solltest noch 
nen kleinen Elko mit 10uF setzen das könnte etwas helfen falls die 
Stromversorgung schlecht geroutet ist und kein generelles Problem 
darstellt.

Die Led könnte man aber nach einem Brown Out aktivieren falls man das 
mit deinem uC auswerten kann.

von TK (Gast)


Lesenswert?

Hallo,

ich habe bei einem anderen ATMEGA vor Jahren auch mal ein ähnliches 
Problem gehabt. Dort lag es damals auch am nicht aktivierten BrownOut. 
Immer beim Runterfahren des Systems kam es sporadisch zu diesen Fehlern 
im EEPROM. Zuerst hatte ich in der "main" Routine grundsätzlich die 
EEPROM Adresse auf einen unbenutzen Wert vorbelegt. Das hatte schon mal 
geholfen. Erst mit dem Aktivieren des BrownOuts war das Problem dann 
gänzlich behoben.

Was auch noch passieren kann ist, dass Du in der Schreibroutine zwar den 
Programmiervorgang startest, dann jedoch nicht mehr auf das Ende des 
Vorgangs wartest. Damit beendest Du die Schreibroutine und kehrst ins 
HP? zurück. Wenn dort jetzt zu einem ungünstigen Zeitpunkt (also noch 
während des Schreibvorgangs) der EEPROM-ADR Eintrag geändert wird, kann 
es auch zum unvorhergesehenen Crash kommen (das ist mir mal bei einem 
PIC passiert).

Daher mein Vorschlag, dass Du die Abfrage
>while (EECR & (1<<EEPE));
vom Anfang der Routine ans Ende der Routine verschiebst (und auch 
prüfst, ob in einer ISR der EEPROM-ADR Wert geändert wird, denn dann 
solltest Du noch die Interrupts während des Schreibvorgangs abschalten)

Gruß
TK

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wenn du die avr-libc benutzt, kann es auch sinnvoll sein, einfach die 
Routinen dieser zu benutzen, anstatt das selber nach zu coden. Die 
Routinen sind auch so gemacht, das auf jeden Fall das nötige Timing für 
den EEPROM eingehalten wird, z.B.
1
  eeprom_busy_wait();
2
  eeprom_write_byte(&ee_DEAD_TIME_HALF,DEAD_TIME_HALF);
3
  eeprom_busy_wait();

von SilbergrauerAdler (Gast)


Angehängte Dateien:

Lesenswert?

Apropos Stromversorgung: Diese habe ich mal als Anhang hochgeladen. 
Vielleicht findet ja jemand Auffälligkeiten? Versorgt wird das ganze mit 
12 Volt. Als Abblockkondensatoren verwende ich 100 nF Keramik direkt 
neben den IC-Beinchen.

Ursprünglich hatte ich für die EEPROM-Zugriffe auch die AVR-libs 
genutzt, aber dann durch die eigene Programmierung ersetzt, weil ich 
dachte, der Fehler kommt daher...

Interrupts während der Schreibvorgänge abschalten wäre auch noch eine 
Fehlerquelle und eine gute Idee, da gibt es Timer, USART-Ereignisse, 
ADC-Conversion-Interrupts und einige mehr bei mir im Programm.

Die Aktivierung der Brown-Out-Fuse könnte wirklich auch ein hilfreicher 
Tipp sein.

Ich teste das ebenfalls mal und danke für die Vorschläge :-)

von Zeige Finger Heber (Gast)


Lesenswert?

Also auf die Schnelle sehe ich da einen 47K Widerstand ohne
Kondensator, das könnte in dem störenden Umfeld (das ich
nicht kenne) eine ernste Gefahr werden.

Widerstand um mindestens eine Zehnerpotenz kleiner und 100nF
dazupacken ....

Eventuell auch im realen Betrieb die ISP Leitung zu Reset
unterbrechen da Einstreu-Gefahr von Störungen.

von Helmut L. (helmi1)


Lesenswert?

Wozu ist R3,R26,R2 gut?

An R26 (9.1Ohm) faellt je nach Belastung mal mehr mal weniger ab.
R3 (169 Ohm) bringt gar nichts und verhindert die Funktion der Z-Diode 
zuverlaessig. Das gleich mit R2 (169 Ohm).

von TK (Gast)


Lesenswert?

Ja, die R2,R3 und R26 gehören hier nicht rein. Dafür sind die Z-Dioden 
dann durch TVS-Dioden zu ersetzen.
C1 ist von der Spannungsfestigkeit zu klein, wenn die TVS-Diode mit 30V 
angesetzt ist.
Zum Regler gehören auch immer noch die kleinen MLCCs (also vorne und 
hinten noch die 100nF).
>Widerstand um mindestens eine Zehnerpotenz kleiner und 100nF
>dazupacken
FullAck

Gruß
TK

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

TK schrieb:
> Zum Regler gehören auch immer noch die kleinen MLCCs (also vorne und
> hinten noch die 100nF).

Nicht beim LM2937 (siehe Datenblatt). Das ist schon ok mit den 10µF am 
Ausgang, wenn man die schöne regulierte Spannung nicht mit R26 wieder 
aushebeln würde :-P

von Zeige Finger Heber (Gast)


Lesenswert?

"Verdächtig" finde ich noch die Leitung die vom Prozessor-Vcc
nach irgendwo hinführt. Was da wohl noch an Strom gezogen wird
und noch alles passiert?

von Stefan F. (Gast)


Lesenswert?

Anscheinend ist deine Eingangsspannung so hoch, daß du einen normalen 
Spannungsregler anstelle des Low-Drop Reglers verwenden kannst.

Normale SPannungsregler sind allgemein weniger zickig als Low-Drop 
Regler.

von SilbergrauerAdler (Gast)


Lesenswert?

Zeige Finger Heber schrieb:
> Also auf die Schnelle sehe ich da einen 47K Widerstand ohne
> Kondensator, das könnte in dem störenden Umfeld (das ich
> nicht kenne) eine ernste Gefahr werden.
>
> Widerstand um mindestens eine Zehnerpotenz kleiner und 100nF
> dazupacken ....

Danke, ist auch einen Versuch wert. Den 100nF parallel zum Widerstand?
Habe ich das recht in Erinnerung, dass Atmel in den Datenblättern einen 
Wert von etwa 47k empfiehlt?

Helmut L. schrieb:
> Wozu ist R3,R26,R2 gut?
>
> An R26 (9.1Ohm) faellt je nach Belastung mal mehr mal weniger ab.
> R3 (169 Ohm) bringt gar nichts und verhindert die Funktion der Z-Diode
> zuverlaessig. Das gleich mit R2 (169 Ohm).

Okay, das habe ich dann wohl am Experimentierboard "falsch" getestet. 
Hier stieg die Spannung mit dieser Dioden-Widerstands-Kombination knapp 
über 5 Volt nicht mehr weiter an. Werde ich dann entfernen die 
Widerstände.

Matthias S. schrieb:
> TK schrieb:
>> Zum Regler gehören auch immer noch die kleinen MLCCs (also vorne und
>> hinten noch die 100nF).
>
> Nicht beim LM2937 (siehe Datenblatt). Das ist schon ok mit den 10µF am
> Ausgang, wenn man die schöne regulierte Spannung nicht mit R26 wieder
> aushebeln würde :-P

Wird entfernt ;-) Danke.

Zeige Finger Heber schrieb:
> "Verdächtig" finde ich noch die Leitung die vom Prozessor-Vcc
> nach irgendwo hinführt. Was da wohl noch an Strom gezogen wird
> und noch alles passiert?

Frag ich mich auch gerade. Das Signal geht als Spannungsversorgung zu 
einem Hallsensor.

von Zeige Finger Heber (Gast)


Lesenswert?

SilbergrauerAdler schrieb:
> dass Atmel in den Datenblättern einen
> Wert von etwa 47k empfiehlt?

Zeige Finger Heber schrieb:
> das könnte in dem störenden Umfeld (das ich
> nicht kenne) eine ernste Gefahr werden.


SilbergrauerAdler schrieb:
> Den 100nF parallel zum Widerstand?

Ist zwar fast wurscht, aber normalerweise setzt man R-C-Glieder
mit dem Kondensator nach Masse.

Auf jeden Fall ein Segen für die "Entstörung".

von SilbergrauerAdler (Gast)


Angehängte Dateien:

Lesenswert?

Die Reset-Beschaltung vom Atmega wurde nun geändert.
Passt das soweit?

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.