mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega ISR Priorität


Autor: Thomas L. (tom)
Datum:

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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
GIFR |= 1<<INTF1

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

Richtig ist daher nur:
GIFR = 1<<INTF1


Peter

Autor: Thomas L. (tom)
Datum:

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

Autor: Hagen (Gast)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

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.