AVR: Interrupt flag löschen

Gast #25885
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
Gast #25886
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.
#25888
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
Gast #25889
@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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.