- Labornetzteil AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: ATMEGA162 EEPROM

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716

    ATMEGA162 EEPROM

    Hallo,

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

    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 ();
    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    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:

    Code:
    EECR = (1<<EEMWE); 
    EECR = (1<<EEMWE) | (1<<EEWE);
    Viele Grüße
    Andreas

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.687
    Zitat Zitat von Bumbum
    ... 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:
    Code:
    EECR = (1<<EEMWE); 
    EECR |= (1<<EEWE);
    im Datenblatt 2513J–AVR–08/07 steht
    Code:
    EECR |= (1<<EEMWE); /* start EEPROM write */
    EECR |= (1<<EEWE);
    ? ? ? ?
    Ciao sagt der JoeamBerg

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    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.

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    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.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    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

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    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:

    Code:
    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:

    Code:
    EECR = (1<<EEMWE); 
    EECR = (1<<EEMWE) | (1<<EEWE);
    Viele Grüße
    Andreas

  8. #8
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    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

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.687
    Hi Bumbum,

    Zitat Zitat von _R2D2
    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?
    Ciao sagt der JoeamBerg

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test