[c]
ISR(INT0_vect) //ZUENDUNG, startet EEMEM Sicherung
{
if(merker) //erst nach einschwingzeit > 2s
{
cli(); //Interrupts aus
writetoDisplay(0, CLEAR);
writetoDisplay(333, SHOW);
ACSRA |= (1<<ACD); //Energie sparen))
ADCSRA &= ~(1<<ADEN); //Energie sparen))
//Leuchtreklame aus
BLINKER_PORT |= (1<<BLINKER); //LED AUS
// TACHO_PORT |= (1 << TACHO); //LED AUS
if(EEMEM_isSet != 1) //Nur beim ersten Ausführen speichern
eeprom_write_byte(&check_EEMEM, 1);
//Zähler für Ringpuffer nachstellen
if(cntr_EEMEM_temp < (N_BYTE-1))
{
cntr_EEMEM_temp ++;
eeprom_write_byte(&cntr_EEMEM, cntr_EEMEM_temp);
eeprom_busy_wait();
}
else
{
cntr_EEMEM_temp = 0; // Counter hat eine weitere Umrundung von 50
Byte hinter sich
eeprom_write_byte(&cntr_EEMEM, 0);
eeprom_busy_wait();
}
//Ringpuffer für km-Staende schreiben
uint8_t delta_km = 0;
//auf ganze km runden. sollte sich statistisch mitteln
if(meter_temp > HALB_km)
delta_km = 1;
//Ringpuffer km-Staende schreiben
eeprom_write_dword(&array_Gesamt_km_EEMEM[cntr_EEMEM_temp],
Gesamt_km_Stand + delta_km);
eeprom_busy_wait();
eeprom_write_dword(&array_Tages_km_EEMEM[cntr_EEMEM_temp],
Tages_km_Stand + delta_km);
eeprom_busy_wait();
//Ringpuffer für FAKTOR schreiben
eeprom_write_byte(&array_KF_EEMEM[cntr_EEMEM_temp], Kardan_Faktor);
eeprom_busy_wait();
eeprom_write_byte(&array_UF_EEMEM[cntr_EEMEM_temp], Umfang_Faktor);
eeprom_busy_wait();
//Programmende bei Wegfall der VCC
uint32_t SpannungWeg = 0;
uint8_t i_U = 0;
for(; i_U<5; i_U++)
{
for(; SpannungWeg<1000000; SpannungWeg++);
}
}
}
[c\]
Sorry, ich habe jetzt die ganze Routine dabei.
Ich schreibe auch 32Bit Werte nach dem gleichen Verfahren.
Das heißt, in meinem Fall würde mit
eeprom_write_dword(&array_Gesamt_km_EEMEM[cntr_EEMEM_temp],
Gesamt_km_Stand + delta_km); nur das erste Byte geschrieben?
Zur meiner Verwunderung past es einigermaßen, was ich nach Neustart des
Programms auslese - es ist zumindest kein unplauisibler Müll.