µC Atmel Atmega8
Ich habe eine Frage, die ich hier in einem kleinen Beispiel
veranschaulichen möchte.
Ich betreibe auf dem Atmega8 den Timer 1 16-bit.
Nun möchte ich bei einem Compare Match den Pin PB1 (OC1A) auf high
setzt.
Im Programm schreibe ich an der Stelle also dies:
1 | TCCR1A |= (1<<COM1A0) | (1<<COM1A1);
|
2 | OCR1A = 100;
|
3 | TIMSK |= (1 << OCIE1A);
|
In dem Beispiel wird bei erreichen also des Timers von TCNT1=101 das
Compare Match A ausgelöst und diese ISR aufgerufen:
1 | ISR (TIMER1_COMPA_vect){
|
2 | TIMSK &= ~(1 << OCIE1A);
|
3 | TCCR1A &= ~(1 << COM1A0); // Bit löschen, sodass beim nächsten mal auf low geschaltet wird
|
4 | TCCR1A |= (1 << FOC1A); // Force Output schaltet Bit wieder auf low
|
5 | TCCR1A |= ~(1 << COM1A0); // würde beim nächsten erreichen wieder high werden
|
6 | }
|
Die ISR schaltet den Compare Match wieder aus, bis er hypothetisch
irgendwann wieder eingeschaltet wird (an einer Stelle des Programms).
Wird jetzt aber bei erreichen des Timers von 101 beim nächsten mal der
Pin wieder auf low gesetzt?
Ich meine, die ISR wird nicht angesprungen, klar, weil ja im TIMSK
Register das entsprechende Flag gelöscht ist. Aber durch die gesetzten
COM1A0 und COM1A1 schaltet die Hardware dann trotzdem den Pin um?
Danke.
Ach ja, ich habe das jetzt so aus dem Kopf geschrieben nur als Bsp, d.h.
nicht compiliert. Evtl. sind noch kleine Fehler drin... aber vom Prinzip
her sollte es durchsichtig sein.
LG
Sven