Forum: Mikrocontroller und Digitale Elektronik Timer1-OCF1-Flag


von Stephan Keiß (Gast)


Lesenswert?

Hallo zusammen,

ich bin noch relativ unerfahren mit Timern. Nun bin ich auf ein Problem 
gestossen und finde keine Angaben,weder in den AppNotes noch in der 
uC-Beschreibung:

Ich verwende den Timer1 im Compare Mode, d.h. wenn der Timer einen 
bestimmten Wert erreicht hat, wird das OCF1-Flag im TIFR-Registzer 
gesetzt. Da ich das CTC1 Bit im TCCR1B-Reg. gesetzt habe, startet der 
Timer dann wieder von neu. Allerdings ist mir jetzt nicht bekannt, ob 
der uC das OCF1-Flag wieder cleared? Ich habe mein Programm mal im 
Debug-Modus gestartet und meine festgestellt zu haben, dass das 
OCF1-Flag einmal gesetzt immer gesetzt bleibt. Nun meine Frage: Muss man 
das Flag von Hand auf Null setzen?
(PS: Ich verwende einen AT90S4433)

Danke und Gruß Stepi

von crazy horse (Gast)


Lesenswert?

kommt drauf an: ist der entsprechende Interrupt freigegeben, wird das 
Flag beim Anspringen der ISR automatisch gelöscht. Tust du das nicht, 
mußt du es per Software löschen (sinnigerweise durch schreiben einer "1" 
in das betreffende Bit.

von Stephan Keiß (Gast)


Lesenswert?

Hallo,

ich frage das OCF1-Flag durch Polling ab, also gänzlich ohne 
Interrupt-Routinen. Demnach muss ich also das Flag durch schreiben einer 
"0" (weiso sollte ich eine "1" schreiben") wieder manuell löschen, bevor 
ich es wieder abfrage?

Gruß Stepi

von crazy horse (Gast)


Lesenswert?

arrgghhh...
du musst eine 1 schreiben, deswegen habe ich es ja ausdrücklich gesagt, 
aber wenn du es nicht glaubst, probier es aus, oder einfacher: schau ins 
Datenblatt.

von mikki merten (Gast)


Lesenswert?

@stephan
zum löschen von Flags ist definitiv das Zurückschreiben einer "1" 
erforderlich. Macht ja auch Sinn, da prozessorintern eine 
NAND-Verknüpfung stattfindet, und somit gezielt innerhalb eines Taktes 
Flag-Bits gelöscht werden können, ohne die anderen Bits im Register zu 
beeinflussen.

von Stepi (Gast)


Lesenswert?

Ich habe gestern nun ausprobiert, das Flag zu löschen aber weder mit 
sbi, noch mit ldi & out wollte sich das Flag zurücksetzen lassen. Kann 
mir jemand sagen, wie ich das machen soll?
Danke Stepi

PS: Was macht eigentlich die Anweisung
ldi R16,(1<<2)|(1<<3)
Die Bits 2 und 3 in R16 werden auf eins gesetzt und was passiert mit den 
restlichen Bits? Was genau bedeutet "<<" und "|"?

von Matthias (Gast)


Lesenswert?

Hi

die restlichen Bits auf 0.

x<<n kommt von C und bedeutet schiebe x um n Bitstellen nach links 
(entspricht eines Multiplikation mit 2^n)

| kommt von C und steht für eine bitweise logische Oderverknüpfung der beiden 
Argumente.

Matthias

von crazy horse (Gast)


Lesenswert?

sbi geht natürlich nicht, da das TIFR oberhalb von 0x1f lokalisiert ist.

ldi temp, (1<<OCF1A)
out TIFR, temp

funktioniert aber.

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.