Forum: Compiler & IDEs Timer1 als Auslöseverzögerung


von Chris (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Chris (Gast)


Lesenswert?

Hallo Jörg,

Irgendwie irritieren mich deine zwei Codezeilen - müsste es nicht

TIMSK = ~(1 << TOIE1);
TIMSK |= (1 << TOIE1);

heißen?

'73

Chris

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Errm, sorry:

TIFR = (1 << TOV1);
TIMSK |= (1 << TOIE1);

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.