-         

Ergebnis 1 bis 6 von 6

Thema: EEPROM Werte verändern sich

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.02.2005
    Ort
    Hannover
    Beiträge
    174

    EEPROM Werte verändern sich

    Anzeige

    Hi,
    ich möchte das interne EEPROM von einem Mega644 nutzen um mir 4 Structs darin abzupeichern. Jedoch verändern sich von 2 Structs ab und zu nach dem mehrfachen Ein- und Ausschalten jeweils das erste Byte im Struct (der hue-Wert).


    Structdefinition
    Code:
    struct hsv_pixel{
    	uint8_t	hue;
    	uint8_t	sat;
    	uint8_t	val;
    };
    Funktion zum Schreiben des Structs in das EEPROM, eine von 4 Funktionen (unterscheiden sich nur in der Adresse).
    Code:
    void setColorValuesGreen(hsv_pixel koerper){
    	//Interrupts sichern
    	uint8_t tmp_sreg = SREG;
    	cli();
    	
    	while(!eeprom_is_ready()){}	//Warten bis EEPROM bereit
    	eeprom_write_block((const void*)&koerper, (void*)EE_GREEN, 3);		//Koerperwert schreiben
    	
    	SREG = tmp_sreg;	//Interrupts wiederherstellen
    }
    Code zum Auslesen der Werte
    Code:
    hsv_pixel ee_green;
    	hsv_pixel ee_green_leg;
    	hsv_pixel ee_silver;
    	hsv_pixel ee_silver_leg;
    	
    	//Interrupts sichern
    	uint8_t tmp_sreg = SREG;
    	cli();
    	
    	//Werte aus dem EEPROM holen
    	while(!eeprom_is_ready()){}	//Warten bis EEPROM bereit
    	eeprom_read_block((void*)&ee_green, (const void *) EE_GREEN, 3);
    	
    	while(!eeprom_is_ready()){}	//Warten bis EEPROM bereit
    	eeprom_read_block((void*)&ee_green_leg, (const void *) EE_GREEN_LEG, 3);
    	
    	while(!eeprom_is_ready()){}	//Warten bis EEPROM bereit
    	eeprom_read_block((void*)&ee_silver, (const void *) EE_SILVER, 3);
    	
    	while(!eeprom_is_ready()){}	//Warten bis EEPROM bereit
    	eeprom_read_block((void*)&ee_silver_leg, (const void *) EE_SILVER_LEG, 3);
    	
    	SREG = tmp_sreg; 	//Interrupts wiederherstellen
    EEPROM-Inhalt nach dem einspeichern
    Code:
    :20000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
    :20002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
    :20004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
    :20006000FFFFFFFF24B81DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26BA25FFFFFFFFFF9C
    :20008000FFFFFFFFFFFFFFFFFFFFFFFF2AA460FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F
    :2000A0002BA460FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E
    Nach einigem mal Ein- und Ausschalten
    Code:
    :20000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
    :20002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
    :20004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
    :20006000FFFFFFFF24B81DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26BA25FFFFFFFFFF9C
    :20008000FFFFFFFFFFFFFFFFFFFFFFFF2BA561FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C
    :2000A0002BA35FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30
    Die Werte werden bei Bedarf per Tastendruck gespeichert.

    In den Fuses ist auch eingestellt, dass das EEPROM beim flashen erhalten bleibt. Außerdem wurde der Controller zwischendurch nicht neu geflasht.
    Woran kann es liegen?

    MfG Jörn

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die EEPROM Zelle 0 wird am leichtesten überschrieben, wenn der Controller wegen mangelnder Spannung etwas undefiniertes Ausführt. Als Abhilfe sollte man den Browout-detektor anschalten und wenn möglich die EEPROM Speicherstelle 0 nicht nutzen.

    Die hier gezeigten änderung sehen aber extrem aus. Üblich sind änderungen in Adresse 0 nach einigen 10-100 mal Ein/Aus , was aber besonders schwer zu finden ist.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.02.2005
    Ort
    Hannover
    Beiträge
    174
    Ich habe ja schon recht hohe Speicheradresse gewählt. Die Adresse 0 ist ja sehr weit entfernt. Ich habe auch schon einen anderen Mega644 ausprobiert mit dem gleichen Ergebnis. Ich verwende WinAVR-20081205.

    Code:
    #define EE_GREEN	100			
    #define EE_GREEN_LEG	120		
    #define EE_SILVER	140			
    #define EE_SILVER_LEG	160

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von Crazy Harry
    Registriert seit
    15.01.2006
    Ort
    Raum Augsburg - Ulm
    Beiträge
    1.192
    Ich kenne Fälle bei denen sich nicht nur das erste Byte sondern große Teile verändern. Das kommt daher, wenn sich das EEPROM in einem Spannungsbereich bis 1V befindet. d.h. eine "Restladung" von einem großen Elko kann da ausreichen.
    BrownOut bring da nichts, da das doch nur den µC selber überwacht - nicht das EEPROM. Das kann ürigens auch bei externen EEPROMs auftreten, da das ein generelles Problem von den "Dingern" ist.

    Eine Hammermethode wäre, beim unterschreiten einer bestimmten Spannung den µC abzukoppeln und die Vcc/GND kurzzuschließen - und das möglichst schnell.
    Ich programmiere mit AVRCo

  5. #5
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Mit brownout hatte ich bsher noch keinen Probleme mit dem EEPROM. Ohne allerdings auch nur bei Adressse 0.
    Der Brownout detektor sollte da schon etwas bringen. Die Probleme mit dem EEPROM sind ja ein Hauptgrund für den Brownout detektor überhaupt. Bei Controllern ohne internen Brownoutdetektor wird eine externer Brownout (auch Spannungsüberwachung genannt) empfohlen um genau solche Problemem zu vermeiden.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    andere haben es hier im forum mit dummybytes gelöst, bevor erste operationen auf dem EEPROM geschieht 1-2 dummybytes lesen ob der erfolg so dauerhaft war haben sie nicht gesagt

Berechtigungen

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