Hallo alle zusammen,
ich verwende einen ATtiny1634 Baustein, um ein bestimmtes Protokoll auf
Basis der UART Schnittstelle zu implementieren.
Dabei möchte ich nach einem Ereignis (Startbit bei UART erkannt) eine
definierte Zeit warten und danach eine Aktion auslösen.
Für die Zeit habe ich den Timer1 so konfiguriert, dass er jeweils nach
270µs auslöst.
1 | TCCR1B = (1<<WGM12); // Clear Timer on Compare Match
|
2 | TCCR1B |= (1<<CS11); // Prescaler 8
|
3 | OCR1A = 269; // Liefert bei 8MHz ein 270us Intervall
|
Im Interrupt, der bei Erkennung eines Startbits ausgelöst wird, starte
ich den Timer
1 | ISR(USART0_RXS_vect)
|
2 | {
|
3 | TCNT1 = 0; // Counter auf 0 setzen
|
4 | TIMSK |= (1<<OCIE1A); // Compare Interrupt erlauben
|
5 | }
|
Im zugehörigen Timer Interrupt deaktiviere ich den Compare Interrupt
wieder
1 | ISR(TIMER1_COMPA_vect)
|
2 | {
|
3 | TIMSK &= ~(1<<OCIE1A); // Compare Interrupt deaktivieren
|
4 | ...
|
5 | }
|
Mein Problem ist jetzt, dass der Compare-Interrupt jedes mal direkt
ausgelöst wird, nachdem er aktiviert wurde. Also direkt nach dem
USART0_RXS_vect.
Natürlich kann ich jetzt immer den ersten Interrupt ignorieren, aber
dass kann's ja wohl nicht sein. Außerdem verstehe ich es nicht. Ich hab
auch schon versucht, direkt vor oder nach Aktivierung des Timers das
Output-Compare-Flag OCF1A zu löschen. Hab ich aber entweder nicht
richtig gemacht oder es hat nichts genutzt.
Kann mir da bitte jemand helfen bzw. es erklären?