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