Präprozessoranweisung bei Artikel: "Die genaue Sekunde"

OP #2228047
Lesenswert?

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
#2228118
Lesenswert?

@  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
OP #2228145
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren