Hallo Achim, Hallo Georg,
(aus Achims LED-Programm:)
ISR (TIMER2_COMP_vect) // wait1=1ms,
{
if( wait<9) // Takt 0,5s, bei 9 sind es 10ms
{ wait++; } // erhöht
else // wenn dann ...
{ wait=0; // setzt wait1 auf 0
wait10=0xFF; // Signal alle 10ms
}
}
"wait<9" und "bei 9 sind es 10ms"
Frage: Wann ist/wird wait = 9)???
Für "wait" gilt:
Start der Zeit bei 0ms.
Mit erreiche des Zählwertes 1 ist die 1. ms verstrichen.
Mit erreiche des Zählwertes 2 ist die 2. ms verstrichen.
Mit erreiche des Zählwertes 3 ist die 3. ms verstrichen.
Mit erreiche des Zählwertes 4 ist die 4. ms verstrichen.
Mit erreiche des Zählwertes 5 ist die 5. ms verstrichen.
Mit erreiche des Zählwertes 6 ist die 6. ms verstrichen.
Mit erreiche des Zählwertes 7 ist die 7. ms verstrichen.
Mit erreiche des Zählwertes 8 ist die 8. ms verstrichen.
Mit erreiche des Zählwertes 9 ist die 9. ms verstrichen.
Mit Erreichen des Zählwertes 10 ist die 10. ms verstrichen.
Erst jetzt darf "wait" wieder auf "0" gesetzt werden!
(Oder habe ich da einen Denkfehler?)
Ich würde das Programm so schreiben, das ist deutlich kürzer und übersichtlicher und das Inkrementieren in der Interruptfunktion benötigt weniger Zeit wie eine "if"-Abfrage:
ISR (TIMER2_COMP_vect) // Zeittakt=1ms,
{ timer01++; // timer01 um 1ms erhöhen
timer02++; // timer02 um 1ms erhöhen
// je nach Bedarf um weiter "timerxx"- Variablen erweitern
}
Im Programm startet man eine Zeit, in dem man an entsprechender Stelle die jeweilige "timerxx"-Variable auf "0" setzt.
Z.B. Abfrage "timer01" auf 0,5sec erfogt durch die Abfrage "if ( timer01 >= 500 )"
@Achim:
Nicht DU hast Fehler, DEIN PRORGAMM hat Fehler!