Forum: Mikrocontroller und Digitale Elektronik Timer OCF0 Flag zurücksetzen


von Florian S. (sirius7)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche jetzt mit einer Aufgaben-Lösung klar zu kommen, die mir 
nicht ganz logisch erscheint. Es geht um Signal Erzeugung mit Timer0 in 
CTC Mode mit Atmega AVR.

Die Lösung ist als jpg Bild angehängt. Was mir dabei nicht klar ist, 
warum wird OCF0-Flag durch 1 setzen gelöscht?

wenn als erstes die Warteschleife durchgeht:

while(!(TIFR&(1<<OCF0))); wird sie ja schon abgebrochen wenn OCF0=1.

danach kommt aber die Zeile: TIFR = (1 << OCF0);

wozu, wenn der Flag schon sowieso 1 ist?

sollte es nicht ehe heißen: TIFR &= ~(1 << OCF0);// Flag 0 setzen?

wo liegt das Denkfehler bei mir?

würde mich sehr über ein Tipp freuen.

von Justus S. (jussa)


Lesenswert?

Alex S. schrieb:
> wo liegt das Denkfehler bei mir?

du hast das Datenblatt nicht gelesen

von Ingo L. (corrtexx)


Lesenswert?

Alex S. schrieb:
> wo liegt das Denkfehler bei mir?
Solche Flags werden durch Beschreiben mit einer 1 gelöscht

von Florian S. (sirius7)


Lesenswert?

Ingo L. schrieb:
> Alex S. schrieb:
>> wo liegt das Denkfehler bei mir?
> Solche Flags werden durch Beschreiben mit einer 1 gelöscht

achso.. habe ich mir gedacht. Danke schön!

von Dominik B. (odysseus1710)


Lesenswert?

Alex S. schrieb:
> warum wird OCF0-Flag durch 1 setzen gelöscht?

"OCF0A is cleared by hardware when executing the corresponding interrupt
handling vector. Alternatively, OCF0B is cleared by writing a logic one 
to the flag."
1
while((TIFR&(1<<OCF0))==0);

Das Programm bleibt solange an dieser Stelle bis das OCF0-Flag gesetzt 
wurde. Ist dies der Fall, wird ein Pin an PORTC getoggelt, das Flag 
zurückgesetzt und das ganze wiederholt.
Vermutlich wird in einem bestimmten Intervall eine LED 
ein-/ausgeschaltet.

von Peter D. (peda)


Lesenswert?

Alex S. schrieb:
> warum wird OCF0-Flag durch 1 setzen gelöscht?

Weil die AVR-Entwickler sich das eben so ausgedacht haben.
Ist eine beliebte Fallgrube.

von Florian S. (sirius7)


Lesenswert?

Dominik B. schrieb:

> Das Programm bleibt solange an dieser Stelle bis das OCF0-Flag gesetzt
> wurde. Ist dies der Fall, wird ein Pin an PORTC getoggelt, das Flag
> zurückgesetzt und das ganze wiederholt.
> Vermutlich wird in einem bestimmten Intervall eine LED
> ein-/ausgeschaltet.

genau so ist das

von Florian S. (sirius7)


Lesenswert?

Peter D. schrieb:

> Weil die AVR-Entwickler sich das eben so ausgedacht haben.
> Ist eine beliebte Fallgrube.

ok, das ist wirklich sehr gut zu wissen, vor der Klausur)) vielen Dank 
noch mal))

von Peter D. (peda)


Lesenswert?

Im Datenblatt unter Registerbeschreibung steht das für die 
entsprechenden Bits drin.
Meistens sind das die Interruptflags, aber nicht immer.

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.