Forum: Mikrocontroller und Digitale Elektronik Compare Match Interrupt Pins high und low setzen


von Sven (Gast)


Lesenswert?

µ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

von Alex S. (thor368)


Lesenswert?

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

von Sven (Gast)


Lesenswert?

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?

von Alex S. (thor368)


Lesenswert?

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

von Sven (Gast)


Lesenswert?

Danke Thor, kapiche ;-)

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.