Forum: Mikrocontroller und Digitale Elektronik AVR: Interrupt flag löschen


von Werner Hoch (Gast)


Lesenswert?

Hi,

die Frage klingt vielleicht seltsam, aber wie kann man zuverlässig und 
ohne Nebenwirkungen ein Interruptflag im TIFR bzw. GIFR löschen oder 
setzen?

in      temp, TIFR           ; delete timer interrupt
cbr     temp, (1<<TOV0)
out     TIFR, temp

funktioniert nicht.
Wird in der nach der 1. Zeile von der Hardware z.B. das TOV1 Flag 
geändert, so wirds mit dritten Zeile überschrieben und der Interrupt 
geht verloren.

any hints?

mfg
werner

von mikki merten (Gast)


Lesenswert?

Die Lösung des Problems ist ganz einfach. Jedes Flag lässt sich löschen 
indem ein logische 1 auf das entsprechende Bit zu Zurücksetzen 
geschrieben wird z.B.
ldi TMP,(1 << TOV0)
out TIFR,TMP
Auf den ersten Blick erschien auch mir die Lösung mit des 1 schreiben 
zum Löschen sehr unsinnig, ist aber sehr schnell da keine zusätzliches 
UND/ODER erforderlich und verhindert die Beeinflussung anderer Flags.

von Werner Hoch (Gast)


Lesenswert?

Danke.

ich dachte bisher, daß die Interrupt Flag Register lediglich invertiert 
angesprochen werden.

mfg
werner

von Peter D. (peda)


Lesenswert?

Mich stört das auch, daß man die Interruptbits so widersinnig löschen 
muß. Man muß da immer höllisch aufpassen, ob das nun ein "normales" Bit 
ist oder ein Interruptbit.

"Sehr schnell" ist das auch nicht, man spart gerade mal 1 Zyklus.

In C müßte man da wohl schreiben:

if( (TIFR = TIFR & ~(1<<TOV1)) & (1<<TOV0) )

D.h. die eingesparte Maskierung verbraucht man dann ja doch wieder, um 
nicht TOV1 versehentlich mit zu löschen.


Wesentlich praktischer hätte ich es gefunden, wenn man die Interruptbits 
zusammengefaßt und dann in den unteren IO-Bereich gelegt hätte, wo SBI 
und CBI geht. Dann wäre die ganze Aufpasserei und Maskiererei unnötig 
und Löschen mit 0 (CBI) logisch, schnell und einfach.


Peter

von mikki merten (Gast)


Lesenswert?

@peter
So hab ich auch mal gedacht, führt aber zu unnötigen 
Synchronisationsproblemen, da hier ja ein Read/Write Zyklus erforderlich 
wäre. Also ich finde die Lösung ganz ok, war allerdings für mich auch 
erst etwas schwer zu verstehen, da der AVR auch nicht mein erster 
Prozessor ist und dieser hier ein wenig aus der Reihe tanzt.

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.