Datum:
µ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:
TCCR1A |= (1<<COM1A0) | (1<<COM1A1); OCR1A = 100; 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:
ISR (TIMER1_COMPA_vect){
TIMSK &= ~(1 << OCIE1A);
TCCR1A &= ~(1 << COM1A0); // Bit löschen, sodass beim nächsten mal auf low geschaltet wird
TCCR1A |= (1 << FOC1A); // Force Output schaltet Bit wieder auf low
TCCR1A |= ~(1 << COM1A0); // würde beim nächsten erreichen wieder high werden
}
|
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
Datum:
Tach Sven, ich bin selbst nicht in der Syntax drin aber ich verstehe was du meinst. Natürlich arbeitet der tiemr auch ohne interrupt. Du brauchst also keinen interrupt, damit der OC das bit wiederum cleart. Thor
Datum:
Nabend Thor! Ok, erst einmal danke! Das heißt im Klartext, wenn ich nicht möchte, dass das OC cleared, genügt es nicht, das Flag OCIE1A im TIMSK Register zu löschen (TIMSK &= ~(1 << OCIE1A)), sondern ich muss auch COM1A0 und COM1A1 löschen (TCCR1A &= ~(1 << COM1A0) | COM1A1)), sonst wird der Pin jedes Mal bei der Übereinstimmung gesetzt. Ist das so richtig verstanden?
Datum:
Ja, so in etwa. Wenn du allerdings die COM bits löscht, dann wird wieder das Port register dominant. Es gibt mehrere Lösungen für das Problem: Wenn du die COM bits löscht, dann musst du das Port Register auf den gewünschten Wert setzen. Möglichst (versteht sich) vorher sonst hast du da nervöses Gezappel auf dem Pin. Da kannst aber auch den timer anhalten, indem du den prescaler auf 0 setzt. Dann wird kein weiterer OC mehr auftreten. Wenn es dich nicht stört, dass weitere OCs auftreten du aber möchtest, dass das bit dabei gesetzt bleibt kannst du auch einfach die COM bits so konfigurieren, dass sie das bit immer weiter setzen. Dann findet auch keine weitere Änderung mehr statt. Thor
Datum:
Danke Thor, kapiche ;-)