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 | ISR (TIMER1_COMPA_vect) |
2 | {
|
3 | |
4 | /*
|
5 | #if XTAL % SOFT_PRESCALER // Rest? wenn ja: OCR1A = normaler Vergleichswert
|
6 | OCR1A = XTAL / SOFT_PRESCALER - 1;
|
7 | #endif
|
8 | */
|
9 | |
10 | if(--soft_prescaler == 0) // zähle software_teiler (250) runter bei 0 ist |
11 | // eine sekunde vergangen
|
12 | {
|
13 | soft_prescaler = (uint8_t) SOFT_PRESCALER; // setze software_teiler wieder auf |
14 | // Anfangswert
|
15 | sekunde++; // erhöhe Variable für Sekunde |
16 | |
17 | |
18 | #if XTAL % SOFT_PRESCALER // Rest? wenn ja:
|
19 | //OCR1A = korrigierter Vergleiswert (nur 1x pro sec)
|
20 | OCR1A = (XTAL / SOFT_PRESCALER - 1) + XTAL % SOFT_PRESCALER |
21 | #endif
|
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?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.