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;
}
Ach, ich habe ganz vergessen: Wird die externe Signalquelle deaktiviert dann funktioniert der Timer0 auch plötzlich wieder...
Ich würde mal sagen du müllst deinen Prozessor mit interrupts zu
das Signal hat ~400kHz. Ist das zu viel? Was wäre denn die Grenze bei 8MHz Taktfrequenz?
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.