Atmega ISR Priorität

OP #312133
Lesenswert?
• ▲
▼
Hallo :)

Eine kleine Frage ist bei mir heute aufgetaucht - Wie handlet der
Atmega eigentlich gleichzeitig auftretende Interrupts.
Sprich: IRQ 1 tritt auf, während der noch läuft tritt IRQ2 auf. Was
passiert mit IRQ2 - Wird der nach hinten gereiht? Wird er verworfen
(ich hoffe doch nicht).
Gast #312134
Lesenswert?
• ▲
▼
"Wird er verworfen"

Keine Angst, jeder Interrupt hat sein Flag und solange Du es nicht
zurücksetzt, wartet er darauf ausgeführt zu werden und wenns 10 Jahre
dauert.

Prioritäten hat der AVR nicht, also heißt es warten, bis ein Interrupt
fertig ist, ehe der nächste ran darf.
Welcher dann zuerst ran darf, ist der mit der niedrigeren Adresse.


Beim AVR gibt es noch ne tückische Fallgrube, wenn man Interruptquellen
pollt und sie manuell zurücksetzen will:
1
GIFR |= 1<<INTF1

löscht nicht nur INT1, sondern auch INT0 und INT2 !

Richtig ist daher nur:
1
GIFR = 1<<INTF1


Peter
OP #312135
Lesenswert?
• ▲
▼
Gut :)

Verworfen hätte mich geärgert, aber wenn er darauf wartet ist das gut.
Die fehlende Priorisierung wie z.B. beim C167 ist zwar - nunja, es
fehlt halt - aber in meinem Fall nicht schlimm.

Danke für die Antwort, dann liegt der Fehler also wahrscheinlich sonst
irgendwo in meinem Programm :)
Gast #312137
Lesenswert?
• ▲
▼
Ich antworte mal an Peters Stelle:

Das gilt für alle Register, die Interrupt Flags enthalten, die mit
einer '1' gelöscht werden. Die Anweisung

GIFR |= 1 << INT0;

wird in Assembler zu (Beispiel aus der Praxis, WINAVR-Compiler)

in r24, 0x3a     ;r24 = GIFR (Adresse 0x3a)
ori r24, 0x40    ;r24 | (1 << INT0) [0b01000000 oder 0x40]
out 0x3a, r24    ;GIFR = r24

Das bedeutet, dass das GIFR zunächst in ein Register (z.B. r24) geladen
wird, inkl. aller Flag-Zustände. Dann wird das 'OR immediate' mit der
Bitmaske (1 << INT0 [oder andere]) durchgeführt und zum Schluss der
Inhalt des Registers r24 wieder in GIFR geschrieben. Da in diesem
Moment alle Bits, die beim Auslesen gesetzt waren, mit einer '1'
geschrieben werden, werden alle gesetzten Flags gelöscht. Das gilt
genau so für TIFR und andere Register, die Interrupt Flags enthalten.
Im Datenblatt steht das so nicht drin, da es eigentlich trivial ist.
Viele denken jedoch einfach nicht dran.

Gruß

Johnny

Antwort schreiben

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.

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.