Gast
#2639659
Hallo, ich habe folgendes Problem mit meinem Code auf einem Atmega8, Timer1 16-bit. Ich messe die Zeit zwischen zwei Ereignisse und nehme die Differenz (Zeitdifferenz, größer 16-bit). Nach Ablauf dieser Zeit möchte ich ein Compare Match auslösen. Hierzu schreibe ich die gemessene Zeit in eine 32-bit Variable und addiere den aktuellen Timer-Stand (TCNT1) hinzu. Nun zähle ich diese Zeit im OVF-Vektor herunter bzw. inkrementiere immer um 65536 bis diese Zeit kleienr 16-bit ist. Dann schreibe ich diesen Wert in das OCR1A-Register und schalte das Compare Match Interrupt frei. Soweit so gut, hier der "gedankliche" Code dazu:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
Nun habe ich mir überlegt, sollte Zeitdifferenz z.B. vor dem Anspringen des OVF-Vekotr nur minimal größer sein als 16-bit, z.B. 65540, so wird das hier noch dekrementiert in der ersten if-Abfrage und OCR1A mit 5 vorgeladen. Nur wird der Timer während der Abarbeitung (dieser paar Anweisungen) bereits weiter als 5 gezählt sein und dadurch geht mir dieser Compare Match verloren bzw. wird erst 65536 Timerzyklen später ausgelöst. Liegt hier ein Denkfehler von mir vor? Ich glaube nicht oder? Und wenn es so wäre, wie löst man das am geschicktesten, um das Problem zu umschiffen?