www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit CTC Interrupt


Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht 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:
                                                         // Timer 0 konfigurieren
OCR0 = 0x0F;                                             // CTC bei 15

TCCR0 |= (0<<WGM00) |(1<<WGM01)|(0<<COM01) |(1<<COM00);  // Betriebsart CTC // Toggle OC0 PON PB3        
TIMSK |= (1<<OCIE0);                                     // Compare Match Interrupt

TCCR0 |= (1<<CS01);                                      // Prescaler  = 8 und Start Timer
sei();                                                   // Global Interrupts aktivieren

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.