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
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.
Danke. ich dachte bisher, daß die Interrupt Flag Register lediglich invertiert angesprochen werden. mfg werner
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.