Forum: Mikrocontroller und Digitale Elektronik Problem mit CTC Interrupt


von Ingo L. (grobian)


Lesenswert?

Moin,Moin
wenn Ich die Betriebsart CTC konfiguriere wird sofort das Output Compare 
Flag gesetzt und und mein Programm springt  in die entsprechende ISR. 
Muss dass so sein ?
HW= MEGA 32


// Timer 0 konfigurieren
TCCR0 = (1<<CS01); // Prescaler  = 8
TCCR0 |= (0<<WGM00) |(1<<WGM01); // Betriebsart CTC
TCCR0 |= (0<<COM01) |(1<<COM00); // Toggle OC0 PON PB3
OCR0 = 0x0F;           // CTC bei 15
TIMSK |= (1<<OCIE0); // Compare Match Interrupt
sei();  // Global Interrupts aktivieren

Gruß aus Berlin
Ingo

von Karl H. (kbuchegg)


Lesenswert?

Ingo Laabs schrieb:
> Moin,Moin
> wenn Ich die Betriebsart CTC konfiguriere wird sofort das Output Compare
> Flag gesetzt und und mein Programm springt  in die entsprechende ISR.
> Muss dass so sein ?

Klar.

Die Reihenfolge deiner Konfiguration ist

  du startest den Timer (durch setzen eines Vorteilers)
  der läuft auch gleich mal los und hat den Timerwert 0

  Dann schaltest du CTC ein. Damit ist automatisch auch die
  Vergleichseinheit scharf geschaltet. Womit wird der Timerwert
  verglichen? Na mit dem Inhalt des OCR0 Registers. Welchen
  Wert hat dieses? Da du selber noch nichts gesetzt hast, ist der 0

  Bingo: Du hast einen Compare Match, der in Form eines gesetzten
  Interrupt Bits registriert wird

  Und erst dann setzt du den von dir gewünschten Compare Wert


Also entweder:
Reihenfolge der Initialisierungen in eine vernünftige Reihung bringen 
oder das "Compare Match Interrupt aufgetreten Flag" vor dem sei wieder 
löschen.


Persönlich finde ich, dass der Reihenfolge der Initialisierungen gerade 
bei Timern viel zu wenig Beachtung geschenkt wird. Ich denke den meisten 
ist gar nicht bewusst, dass der Timer loslegt, sobald ein Vorteiler 
gesetzt ist (dies daher als letztes gemacht werden sollte); das man 
Vergleichswerte in die entsprechenden Register schreibt noch ehe man den 
auswertenden Modus aktiviert etc.

Du ziehst ja deine Hose auch an, ehe du das Haus verlässt und nicht erst 
dann, wenn du schon unterwegs bist.

von Ingo L. (grobian)


Lesenswert?

Karl heinz Buchegger schrieb:
> Du ziehst ja deine Hose auch an, ehe du das Haus verlässt und nicht erst
> dann, wenn du schon unterwegs bist.

bisher Gott sei dank noch nicht...

// Timer 0 konfigurieren
OCR0 = 0x0F;           // CTC bei 15
TCCR0 = (1<<CS01); // Prescaler  = 8
TCCR0 |= (0<<WGM00) |(1<<WGM01); // Betriebsart CTC
TCCR0 |= (0<<COM01) |(1<<COM00); // Toggle OC0 PON PB3

so funktioniert es dann.
Danke

von STK500-Besitzer (Gast)


Lesenswert?

>TCCR0 = (1<<CS01); // Prescaler  = 8
Diese Zeile würde ich ans Ende setzen (das Verodern nicht vergessen) 
oder alle drei Zeilen in eine schreiben.
Den Kommentar kann man auch anders positionieren.

von Ingo L. (grobian)


Lesenswert?

STK500-Besitzer schrieb:
>>TCCR0 = (1<<CS01); // Prescaler  = 8
> Diese Zeile würde ich ans Ende setzen (das Verodern nicht vergessen)
> oder alle drei Zeilen in eine schreiben.
> Den Kommentar kann man auch anders positionieren.

hatte ich gerade gemacht und an die veroderung nicht gedacht und gleich 
den nächsten Fehler gesucht. So nun der Form halber:
1
                                                         // Timer 0 konfigurieren
2
OCR0 = 0x0F;                                             // CTC bei 15
3
4
TCCR0 |= (0<<WGM00) |(1<<WGM01)|(0<<COM01) |(1<<COM00);  // Betriebsart CTC // Toggle OC0 PON PB3        
5
TIMSK |= (1<<OCIE0);                                     // Compare Match Interrupt
6
7
TCCR0 |= (1<<CS01);                                      // Prescaler  = 8 und Start Timer
8
sei();                                                   // Global Interrupts aktivieren

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.