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:
Viele GrüßeCode:EECR = (1<<EEMWE); EECR = (1<<EEMWE) | (1<<EEWE);
Andreas
Hallo,
ich habe hier ein Problem mit einem ATMega 162 und der EEPROM-Programmierung. Folgender Test schlägt leider fehl:
Beim auslesen erhalte ich immer den Wert 255 (0xFF), egal an welche Adresse oder welchen Wert ich ins EEPROM schreibe.Code: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 ();
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
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:
Viele GrüßeCode:EECR = (1<<EEMWE); EECR = (1<<EEMWE) | (1<<EEWE);
Andreas
Die Beispiele in den Datenblätter hatte ich oft angezweifelt, das hatte sich bisher (bei mir, den m162 kenn ich nicht) nie bewahrheitet.Zitat von Bumbum
Dein ursprünglicher Code heißt nach Deinen Angaben:
im Datenblatt 2513J–AVR–08/07 stehtCode:EECR = (1<<EEMWE); EECR |= (1<<EEWE);
? ? ? ?Code:EECR |= (1<<EEMWE); /* start EEPROM write */ EECR |= (1<<EEWE);
Ciao sagt der JoeamBerg
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.
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.
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
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:
Faszinierend ist, das nicht mal die letzte Variante funktioniert. Ich habe das EEPROM tatsächlich nur so beschreiben können:Code:EECR |= (1<<EEMWE); EECR |= (1<<EEWE); EECR |= (1<<EEMWE); EECR |= (1<<EEMWE) | (1<<EEWE);
Viele GrüßeCode:EECR = (1<<EEMWE); EECR = (1<<EEMWE) | (1<<EEWE);
Andreas
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
Hi Bumbum,
Ich gehe mal davon aus, dass Du mit AVR GCC programmierst. Dann lies Dir vielleicht mal das da durch?Zitat von _R2D2
Ciao sagt der JoeamBerg
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
Lesezeichen