Hallo! Ich möchte dem Timer1 in einem Atmega8 für eine Triac-Ansteuerung verwenden. Dazu soll er mit externen Interrupt aktiviert werden und gleichzeitig das Zählerregister für den Überlauf gesetzt werden, damit der Timer zeitgerecht ausgelöst wird. Nur leider löst der Timer-Interrupt direkt beim aktivieren aus. Momentan verwende ich zum Testen folgenden Code: SIGNAL (SIG_OVERFLOW1) { PORTD ^= 1; TIMSK &= ~(1<<TOIE1); //Interrupt wieder abschalten } SIGNAL (SIG_INTERRUPT0) { TCNT1H = 0xFC; TCNT1L = 0x00; TIMSK |= (1<<TOIE1); //Interrupt einschalten } Der ext. Interrupt und der Timer-Prescaler wird in main() gesetzt, die einzelnen Interrupts funktionieren. ich vermute, dass beim aktivieiren des Timers sofort ein Interrupt ausgelöst wird und er sich somit selbst deaktiviert. Um das zu umgehen, müsste ich doch eine Variable beim Timer-Interrupt hochzählen lassen und erst bei jedem zweiten Interrupt den Triac zünden?! Grüße Chris
Du solltest vor dem Aktivieren des Interrupts erstmal dessen Interrupt-Flag löschen: TIMSK = (1 << TOIE1); TIMSK |= (1 << TOIE1); Allerdings würde ich an deiner Stelle eher den compare match als den Overflow-Interrupt nehmen, da muss man nicht erst die Zahlen negieren.
Hallo Jörg, Irgendwie irritieren mich deine zwei Codezeilen - müsste es nicht TIMSK = ~(1 << TOIE1); TIMSK |= (1 << TOIE1); heißen? '73 Chris
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.