PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : EEPROM Werte verändern sich



PcVirus
08.01.2009, 19:17
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


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).

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


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

:20000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFF00
:20002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFE0
:20004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFC0
:20006000FFFFFFFF24B81DFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF26BA25FFFFFFFFFF9C
:20008000FFFFFFFFFFFFFFFFFFFFFFFF2AA460FFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFF4F
:2000A0002BA460FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFF2E


Nach einigem mal Ein- und Ausschalten


:20000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFF00
:20002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFE0
:20004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFC0
:20006000FFFFFFFF24B81DFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF26BA25FFFFFFFFFF9C
:20008000FFFFFFFFFFFFFFFFFFFFFFFF2BA561FFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFF4C
:2000A0002BA35FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFF30


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

Besserwessi
08.01.2009, 20:17
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.

PcVirus
08.01.2009, 22:19
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.



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

Crazy Harry
08.01.2009, 22:38
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.

Besserwessi
09.01.2009, 12:35
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.

Ceos
09.01.2009, 12:43
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