Hallo! Arbeite gerade den Artikel durch und habe noch eine Frage: Warum steht am Anfang der ISR die Präprozessor-Anweisung: #if XTAL % DEBOUNCE // bei rest OCR1A = XTAL / DEBOUNCE - 1; // compare DEBOUNCE - 1 times #endif Die Zuweisung des Compare-Wertes erfolgt doch im Haupt-Programm, bzw. bei mir in der Initialisierungs-Phase des Timers. Dort wird doch bereits gerechnet. Die Präprozessor-Anweisung in der if-Anweisung ist mir klar, diese korrigiert die Abweichung der Quarzes. (Toleranz) Gruß Rick
@ Rick M. (rick00) >Warum steht am Anfang der ISR die Präprozessor-Anweisung: >#if XTAL % DEBOUNCE // bei rest > OCR1A = XTAL / DEBOUNCE - 1; // compare DEBOUNCE - 1 times >#endif Weil im Falle, dass XTAL modulo DEBOUNCE einen Rest ergibt, der Zähler einmal anders geladen werden muss, um den Fehler auszugleichen. MFG Falk
Hallo Falk! Ja, das ist mir klar, das wird aber in der if-Bedingung gemacht, oder hab ich da was übersehen?:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
Das -1 steht da nur, weil der Rücksetzvorgang des Timers einen Zyklus braucht.
Ich glaub jetzt hab ichs kapiert... Die 1. Anweisung dient sozusagen als Reset für den verlängerten Vergleichswert, welcher in der if-Anweisung steht und nur 1x pro Sekunde geladen wird. Stimmt das?
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.