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).
"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
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 :)
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.