Timer0 wird durch Timer1 "deaktiviert"

#3830938
Lesenswert?

Ich habe mit dem Atmega8, 8MHz ein Timer0/1 Problemchen. So ganz 
nachvollziehen kann ich es nicht, ich beschreibe mal was ich machen will 
und was die Symptome sind.
Ziel/Soll: Timer0 erzeugt einen Overflow, bei dem zwei Variablen jeweils 
um 1 erhöht werden (an sich nix besonderes). Timer1 ist als Input 
Capture Interrupt (ICP) konfiguriert und misst die Periodenlänge eines 
an PB0 anliegenden rechtecksignals (signalqualität ist echt gut).
Ergebniss/Ist: Nach der Initialisierung von Timer1 "hängt" das System 
ca. 10 sek bis dann der nächste Befehl abgearbeitet wird. Timer0 erzeugt 
keinen Overflow in dieser Zeit. TCNT0 per Display angezeigt ändert seine 
Werte aber nicht kontinuierlich nach oben, eher springen hoch runter. 
ICR1 zeigt einen relativ konstanten Wert die ganze Zeit an (~10-30). 
Ändert man das Signal, geht auch die Anzeige hoch und mit mal wird der 
Interrupt von Timer0 ausgeführt und alles funktioniert wie es soll. Geht 
die Frequenz wieder runter hängt der Timer0 plötzlich wieder. Warum ist 
das so?

void initTimer0 (void){
   TCCR0 |= (1<<CS00);
   TIMSK |= (1<<TOIE0);
}

void initTimer1 (void){
   TCCR1B |= (1 << CS10) | (1 << ICNC1);
   TIMSK |= (1<<TICIE1); // Input Capture Interrupt on ICP1 Pin event
}

ISR (TIMER0_OVF_vect) {
   Displayupdate++;
   DOGM_update++;
}


ISR (TIMER1_CAPT_vect) {
   TCNT1 = TCNT1 - ICR1;
   compare_register = ICR1;
}
Gast #3830962
Lesenswert?

>Ich würde mal sagen du müllst deinen Prozessor mit interrupts zu

Ja. Timer1 hat höhere Prio als Timer0.
Wenn der Interrupt für Timer1 feuert hat Timer0 keine Chance.

Konzept überdenken und neu machen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren