Forum: Mikrocontroller und Digitale Elektronik Timer0 wird durch Timer1 "deaktiviert"


von Tino K. (blumengiesser)


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;
}

von Tino K. (blumengiesser)


Lesenswert?

Ach, ich habe ganz vergessen: Wird die externe Signalquelle deaktiviert 
dann funktioniert der Timer0 auch plötzlich wieder...

von Max D. (max_d)


Lesenswert?

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

von Tino K. (blumengiesser)


Lesenswert?

das Signal hat ~400kHz. Ist das zu viel? Was wäre denn die Grenze bei 
8MHz Taktfrequenz?

von holger (Gast)


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.

von Tino K. (blumengiesser)


Lesenswert?

holger schrieb:
>>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.

In der Tat! Daran hat es gelegen. Signalquelle habe ich "optimiert" und 
es geht! Danke!

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.