Du hast offenbar etwas übersehen. Die von dir erwähnte abfrage TRIFTT dummerweise zu, wie du dem Screenshot entnehmen kannst. 
Dass
Code:
if (g_msec < 1000) {}
nach
Code:
if (g_msec > 999) {}
nicht zutreffen DARF, ist mir schon auch klar...
die Zeile entsprang nur meiner verzweiflung; und da die inkrementierung leider mehr als einmal aufgeführt wurde, versuche ich jetzt herauszufinden, wie es dazu kommen kann...
vielleicht flackert ja ein Bit im RAM, aber ich halte das für ehr unwahrscheinlich...
nachdem ich den ganzen µC jetzt noch einmal komplett gelöscht und auch die Fuses einmal (bis auf SPIEN) nicht gesetzt programmiert habe, bevor ich wieder zurück gewechselt habe, scheint der Fehler nicht mehr sehr häufig aufzutreten...
ich habe die "debug-Prüfung" etwas angepasst:
Code:
if (g_msec < 1000){
g_fail++; // volatile, int16
}
g_fail wird jetzt außerdem mit ausgegeben, die entsprechende Zeile (in main.c) ist:
Code:
sprintf(buffer, "\nT: %02d:%02d:%02d.%04d %04d\n", g_h, g_min, g_sec, g_msec, g_fail);
der Wert ist bei Laufzeit 00:01:04 (hh, mm, ss) des Programms auf 1 gesprungen (ja, wird immer mit 0 initialisiert) und mehr als eine Stunde so geblieben... scheint also ein (mittlerweile) ehr seltenes Phänomen zu sein... (das ist so auch reproduzierbar, er macht das immer wieder zu dem Zeitpunkt und dann geht es zumindest bisher ohne diesen Fehler weiter, bis ich neustarte)
Der Code der Timerroutine ist übrigens im Anhang dabei, ist aber auch nix weltbewegendes:
Code:
ISR(TIMER0_COMP_vect)
{
// hier wird der msec-zähler gesetzt. Die übrigen
// Programmteile müssen diese Aenderung "sehen":
// volatile -> aktuellen Wert immer in den Speicher schreiben
g_msec++;
}
zu früh gefreut:
00:01:43.-232 0003
Lesezeichen