Forum: Compiler & IDEs EEPROM Problem bei ATmega168 ab Datecode > 0810


von Tommes (Gast)


Lesenswert?

Hallo Zusammen!
Habe ein dickes Problem bei ATmega168 20AU ab bestimmten Datecode mit 
dem EEPROM. Bis Datecode 0810 lief alles perfekt! Alles was nun neuer 
ist, hat folgendes phänomen: bei 8 MHz internen RC-Oszillator werden 
sporadisch die Werte selbstständig geändert, nach dem 3ten bis 5ten mal 
neuen einschalten der Hardware. Nach Informationen des Verkäufers der 
ATmega168 soll es Probleme ab bzw. bis bestimmte Datecodes geben, die 
mit folgenden Maßnahmen korrigiert werden können: Adresse 0 vom EEPROM 
nicht benutzten, RC-Oszillator kalibrieren. Beides habe ich getan, ohne 
Erfolg. Hat jemand auch diese Erfahrung machen müssen und eine Lösung 
gefunden? Seltsam ist nur, dass bei 1 MHz internen RC-Oszillator das 
Problem nicht (bisher noch nicht) auftritt. Ich benötige aber leider 8 
MHz!
Es muss doch möglich sein, das EEPROM-Problem zu umgehen!

Kurze Zusammenfassung / Ausschnitte,
Ich arbeite mit AVRStudio4 und WinAVR:

unter Memory Setting habe ich folgenden Eintrag:
Memory Type Eeprom; Name .eeprom; Adresse 0x1 (0x01)
Damit wird erst ab Adresse 1 beschreiben. Habe es auch im MAP-File 
nachvollziehen können

#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <stdio.h>
#define BAUD_RATE 38400
#define F_CPU 8000000UL       // RC-Oscillator with 8.000 Mhz
OSCCAL = 0x91;  //  RC-Oszillator kalibrieren (Wert über Advanced / 
oscillator calibration byte ausgelesen!)

Variable:
  uint8_t  EEMEM   PNEUee = 1;

Speichern ins EEPROM:
  eeprom_write_byte(&PNEUee, 100); //Wert wird nicht bei jedem 
Programmstart abgespeichert, da ich per if das nur einmal am Anfang 
mache!

auslesen:
  PNEU = eeprom_read_byte(&PNEUee); // wieder auslesen nach Power an

Ausgabe des Wertes über UART
  printf("\nWert: %d\n\n",PNEU); // Wert sollte immer 100 sein! Wird 
aber nach einige male Power an plötlich zB. 38, -201 oder sonstiges!

Ich habe insgesamt 15 EEPROM-Werte. Dieses Probleme tritt bei allen 
Werten sporadisch und nicht gleichmäßig auf! Die meisten Werte werden 
nur einmal abgeschrieben und dann nur noch gelesen und ausgegeben.

Bin für jeden Tipp dankbar!

von Drachenbändiger (Gast)


Lesenswert?

Da Du die EEPROM-Werte zu Programmanfang (und sonst nicht) 
liest/schreibst, könntest Du vielleicht das Problem umgehen, indem Du 
nur dazu die effektive Taktfrequenz mittels CLKPR auf 1MHz 
heruntersetzt (und dann wieder hoch).

von Εrnst B. (ernst)


Lesenswert?

- Hardware OK? (Saubere 5V, genug Abblock-Kerkos, diese nahe am IC?)
- Brown-Out Detektor aktiv?

Wenn das passt, und du ein byte EEPRom übrig hast: Als Work-around das 
erste Byte im Eeprom als "Müll-Byte" benutzen.
Nach jedem Write/Read auf den "echten" Datenzellen einfach nochmal ein 
Read auf Adresse 0 machen, Ergebnis verwerfen.
=> Eeprom-Addresszeiger zeigt auf 0, wenn wieder was kaputt geht ist es 
höchstwarscheinlich diese Zelle => egal.

von (prx) A. K. (prx)


Lesenswert?

Wie sieht die Hardware aus, bzgl. Schaltung, Layout?

von Oliver (Gast)


Lesenswert?

Auch wenn es schon genannt wurde, die Stichworte "EEPROM, Datenverlust 
beim Ausschalten" führen IMMER zu der Frage:

Brown-Out aktiviert?

Oliver

von Peter D. (peda)


Lesenswert?

Tommes schrieb:
> Seltsam ist nur, dass bei 1 MHz internen RC-Oszillator das
> Problem nicht (bisher noch nicht) auftritt. Ich benötige aber leider 8
> MHz!

Setz doch einfach die Fuse auf 1MHz und dann schalte im Programm auf 
8MHz um.
Und für die EEPROM-Sachen schaltest Du solange auf 1MHz.

Ich weiß nicht, obs was bringt, Du kannst nach jeder EEPROM-Sache noch 
ein Dummy-Read von Adresse 0x00 ranhängen.
Dann sollte nur Adresse 0x00 zerstört werden bei einem ungewollten 
Schreiben.


Das BOD-Reset ist natürlich eingeschaltet?


Peter

von Tommes (Gast)


Lesenswert?

zu Autor: Drachenbändiger

auch während des Prozesses verändert/ins EEPROM geschrieben werden!
Hauptproblem ist doch der Verlust, wenn ich mehrmals nur ein und 
ausschalte, ohne etwas zu ändern!


zu Autor: Εrnst B und Autor: A. K.

Hardware sollte OK. sein, alle C,s und Spannung (5V Schaltnetzteil) laut 
Mindestanforderung vorhanden und mehr. Layout zwei-lagig mit GND Stern 
unterm Prozessor. Sie funktioniert auch korrekt mit Datecode 0810. NUR 
mit neuerem Herstellerdatum gibt es diese Probleme!

- Brown-Out Detektor ist nicht aktiv, werde es mal damit probieren!

von Peter D. (peda)


Lesenswert?

Tommes schrieb:
> - Brown-Out Detektor ist nicht aktiv, werde es mal damit probieren!

Dann hast Du bisher Lotterie gespielt und nun die Niete gezogen.

Steht aber auch ausdrücklich im Datenblatt.


Peter

von Tommes (Gast)


Lesenswert?

376 Seiten in Englisch lesen sich nicht so schnell durch! Aber erste 
Tests sehen viel versprechend aus. Und in der Lotterie hatte ich ja auch 
noch kein Glück.

Mir wurde geholfen. Danke an alle!

Jetzt ist nur noch das Problem, das bei einer Platine das Brown-Out 
nicht abgespeichert wird. Steht immer noch auf disable. Prozessor 
bereits defekt?

von Tommes (Gast)


Lesenswert?

Halt, auch erledigt. Hatte bei dieser Platine mal das Lockbit getestet 
und dann vergessen das Programm neu zu brennen! Also alles erledigt!

Danke für die schnelle Hilfe. Tolles Forum!

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.