PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATMEGA162 EEPROM



Bumbum
06.07.2009, 15:54
Hallo,

ich habe hier ein Problem mit einem ATMega 162 und der EEPROM-Programmierung. Folgender Test schlägt leider fehl:



cli ();
while (EECR & (1<<EEWE));

EEAR = 0;
EEDR = 100;
EECR = (1<<EEMWE);
EECR |= (1<<EEWE);

while (EECR & (1<<EEWE));

EECR = (1<<EERE);
LCD_Zahl (EEDR, 3);

sei ();


Beim auslesen erhalte ich immer den Wert 255 (0xFF), egal an welche Adresse oder welchen Wert ich ins EEPROM schreibe.

Ansonsten ist noch nicht viel im µC drin, außer die initialiserung der Ports und eine handvoll Routenen für die LCD-Ansteuerung.

Habe ich irgendwo einen Fehler in meinem Programm?

Viele Grüße
Andreas

Bumbum
07.07.2009, 20:10
Hallo,

ich habe das Problem selbst durch viel probieren gelöst. Der Beispielcode im Datenblatt des 162 ist falsch. Durch folgende Änderung funktioniert alles einwandfrei:



EECR = (1<<EEMWE);
EECR = (1<<EEMWE) | (1<<EEWE);


Viele Grüße
Andreas

oberallgeier
08.07.2009, 09:47
... Der Beispielcode im Datenblatt des 162 ist falsch ...Die Beispiele in den Datenblätter hatte ich oft angezweifelt, das hatte sich bisher (bei mir, den m162 kenn ich nicht) nie bewahrheitet.

Dein ursprünglicher Code heißt nach Deinen Angaben:

EECR = (1<<EEMWE);
EECR |= (1<<EEWE);
im Datenblatt 2513J–AVR–08/07 steht

EECR |= (1<<EEMWE); /* start EEPROM write */
EECR |= (1<<EEWE);
? ? ? ?

Bumbum
08.07.2009, 10:17
Oha, da habe ich wohl beim rumspielen, weil es nicht funktioniert hat irgendwann mal auf diese Version geändert. Sollte aber eigentlich keinen Unterschied machen, oder täusche ich mich? Bei Gelegenheit kann ichs ja mal probieren.

Hubert.G
08.07.2009, 10:43
Es macht schon einen Unterschied
EECR = (1<<EEMWE); setzt das Bit EEMWE im EECR Register und löscht alle anderne Bits.
EECR |= (1<<EEMWE); setzt das Bit EEMWE im EECR Register und lässt alle anderne Bits wie sie sind.

Bumbum
08.07.2009, 17:07
Hallo Hubert,

der Unterschied ist mir schon klar. Ich meinte nur im Bezug auf die Anwendung (schreiben eines Bytes ins EEPROM) sollte es keinen Unterschied machen. Blöderweise habe ich es jetzt total vergessen zu probieren, ob es mit dem Original-Beispiel funktioniert. Muss ich morgen mal nachholen.

Viele Grüße
Andreas

Bumbum
09.07.2009, 08:41
Guten Morgen,

ich habe gerade noch mal getestet. Es funktioniert tatsächlich nur mein oben als Lösung geposteter Code. Folgende zwei Varianten habe ich gerade ohne Erfolg probiert:



EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);

EECR |= (1<<EEMWE);
EECR |= (1<<EEMWE) | (1<<EEWE);


Faszinierend ist, das nicht mal die letzte Variante funktioniert. Ich habe das EEPROM tatsächlich nur so beschreiben können:



EECR = (1<<EEMWE);
EECR = (1<<EEMWE) | (1<<EEWE);


Viele Grüße
Andreas

BurningWave
09.07.2009, 17:18
In der Datei eeprom.h (einbinden mit #include <avr/eeprom.h>) gibt es auch einige interesante Funktionrn um konfortabel einzelne Werte, aber auch ganze Strukturen / Arrays lesen bzw. schreiben kann

mfg

oberallgeier
09.07.2009, 17:25
Hi Bumbum,


In der Datei eeprom.h (einbinden mit #include <avr/eeprom.h>) gibt es auch einige interesante Funktionrn ...Ich gehe mal davon aus, dass Du mit AVR GCC programmierst. Dann lies Dir vielleicht mal das da durch? (http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html)

Bumbum
09.07.2009, 19:47
Puh, das ist ganz schön harter Stoff. :-) C ist normalerweise nicht meine Programmiersprache und ich nutze sie nur, wenn ich ein etwas umfangreicheres Projekt mit µC realisieren möchte. Ansonsten nutze ich hier auch mal eben Assembler. Aber beim nächsten EEPROM-Problem werde ich mir das bestimmt mal genauer anschauen. (Zumindest so, das ich auch alles verstehe, was dort steht.)

Das EEPROM mit einer Datei fülllen macht in meinen Augen wenig Sinn. Eigentlich macht es nur Sinn, wenn der Flash-Speicher für das Programm voll ausgenutzt ist und man ein paar Strings oder andere Daten auslagern muss.

Ich nutze das EEPROM in meiner Anwendung um Einstellungen zu speichern, ich muss also zur Laufzeit ändern können.

Viele Grüße
Andreas

oberallgeier
09.07.2009, 20:06
Hallo Andreas


... schön ... Stoff ... das EEPROM ... zur Laufzeit ändern ...Du kennst sicher die erste Seite des Docs zu Deinem m162!?

Features
...
• High Endurance Non-volatile Memory segments
...
– Write/Erase cycles: 10,000 Flash/100,000 EEPROM

Ich will damit nur andeuten: das EEPROM ist kein SRAM - aber daran denkst Du sicher !

Bumbum
09.07.2009, 20:12
Äh, ja! Einstellungen werden vom Benutzer normalerweise einmal vorgenommen und bleiben dann. ;-)