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