www.mikrocontroller.net

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


Autor: Werner Hoch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Werner Hoch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke.

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

mfg
werner

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.