Forum: Mikrocontroller und Digitale Elektronik Präprozessoranweisung bei Artikel: "Die genaue Sekunde"


von Rick M. (rick00)


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

von Falk B. (falk)


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

von Rick M. (rick00)


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
}

von Rick M. (rick00)


Lesenswert?

Das -1 steht da nur, weil der Rücksetzvorgang des Timers einen Zyklus 
braucht.

von Rick M. (rick00)


Lesenswert?

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
Noch kein Account? Hier anmelden.