Forum: Mikrocontroller und Digitale Elektronik Atmega ISR Priorität


von Thomas L. (tom)


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).

von peter dannegger (Gast)


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

von Thomas L. (tom)


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 :)

von Hagen (Gast)


Lesenswert?

@Peter,

gilt dies nur für GFIR oder auch zb. für  TIFR |= 1 << ICF1 ?
Und wo im Datenblatt kann man dies nachlesen ?

Gruß hagen

von johnny.m (Gast)


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

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.