Tiny2313: Timer0 - Seltsames Interruptproblem

OP #1321946
Hallo zusammen,

ich habe einen Servocontroller 8-Servo Servokontroller aufgebaut und bin 
zur Zeit noch in der Entwicklungsphase.
Ein großes Problem macht mir Timer0 mit dem A-Interrupt: Die Bedingung 
vom B-Interrupt gesetzt. Das komische dabei ist, dass wenn ich als 
Compare-Match-Wert für den B-Interrupt OCR0A=138 verwende geht es, 
drunter nicht mehr.
Wie kann ich das ohne Workaround fixen? Was mache ich falsch?

Die ganzen Sources findet ihr hier:
http://umfragen-service.de/avr/

Grüße und Danke

Michael
OP
Kurze Ablaufbeschreibung:
Nach der Inizialiserung (servo_init()), soll das erste Interrupt 
(COMPARE MATCH A) denn PORTB auf high setzen und COMPARE MATCH B 
inizialiseren.
COMPARE MATCH B soll genau nach 1ms aktiv sein. Die Interrupts werden 
nun deaktiviert. Jetzt soll der Treiber immer warten, bis er an ein 
gewisser Wert erreicht ist und dann die Servodaten ausgeben. Nun wird 
der Timer0 wieder gesetzt, dass er in 20ms mit COMPARE MATCH A weiter 
gemacht - so jedenfalls meine theoretischen Überlegungen.
Aber irgendwie wird der entweder COMPARE MATCH A oder COMPARE MATCH B 
übersprungen. Wie kann ich das richten?
1
ISR(TIMER0_COMPB_vect){
2
...
3
  do{
4
    // Warte ab, bis das es (das Flag) high ist
5
    loop_until_bit_is_set(TIFR,OCF0B);


Das ist Schwachfug. Du kannst nicht in einem Interrupt warten, bis er 
wieder zuschlägt. Damit hast du genau 0 Zyklen für andere Interrupts und 
das Main übrig.
Generell ist es dumm, in einem Interrupt überhaupt zu warten.


Schmeiß mal das ganze Gedöns mit der Timermanipulation aus den 
Interrupts raus, da sieht doch keiner mehr durch und außerdem ist es 
Unsinn.

Die Compareinterrupts sind doch genau dazu da, Dir den ganzen 
Timingablauf abzunehmen.
Den T0 laß einfach durchlaufen und wenn etwas passieren soll, setzt Du 
den OCR0A auf T0 + Startzeit, und OCR0B auf T0 + Endezeit. Dann beide 
Pending flags löschen, beide Interrupts freigeben und fertsch.

Und die beiden Interrupts machen dann nur das zu den beiden Zeiten 
gewünschte.
Wenn sie single-shot sein sollen, löschen sie noch ihre eigene 
Interruptfreigabe. Aber mehr machen sie nicht mit den Timern rum.


Peter

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.