Hi, noch zwei Ergänzungen:
- wenn man einen Interrupt (durch SEI) unterbrechbar macht, muß auf potentielle Stacküberläufe etc geachtet werden - insbesondere wenn der IRQ sich selbst unterbrechen kann (es werden ja bei jedem Interrupt-Eintritt die Rücksprungadresse und diverse Register (SREG + Rechenregister - bei Bascom und ohne nosave alle 32) auf den Stack gepusht. und beim Austritt wieder runtergepoppt. Wenn der Interrupt aber selbst durch einen Interrupt unterbrochen wird, wächst der Stack sehr schnell - die Stacklogik stimmt zwar noch, aber der verwendbare SRAM (den sich der Stack ja auch mit den anderen Datenbereichen teilen muß ("Framesize", "SWSTACK",...) ist endlich. Wenn der Stack dann also irgendwelche, eigentlich anders genutzten Bereiche überschreibt, oder Deine Daten die im Stack eigentlich gesicherten Register, kommt es zu schwer nachvollziehbaren Fehlern, klar.
- Auf die Priorität der Interrupts (Vektortabelle) und die generelle Abarbeitung wurde ja bereits grob eingegangen.
(Wenn der entsprechende Interrupt aktiviert ist, führt ein Eintreten des entsprechenden Ereignisses zum Setzen des entsprechenden Interruptanforderungsflags.
Wenn das Globale Interrupt-Flag (I) gesetzt ist, und mindestens ein Interruptanforderungsflag, wird (nach Abarbeitung des aktuellen Befehls) das Programm unterbrochen, Interrupts global unterbunden (I-Flag gelöscht), die Rücksprungadresse auf den Stack usw. Dann wird der Interruptvektor mit der höchsten Priorität (und aktivem InterruptAnforderungsFlag) ausgeführt. Dabei wird automatisch das entsprechende Interruptanforderungsflag zurrückgesetzt. Beim (regulärem) Austritt wird die Rücksprungadresse vom Stack genommen, und angesprungen, und das I-Flag wieder gesetzt - fertig. Da die anderen, ggf gesetzten Interruptanforderungsflags nicht verändert wurden, können diese jetzt abgearbeitet werden (wie oben bereits gesagt können dabei aber Interrupts verschluckt werden).
ABER:
es gibt auch levelbasierte Interrupts (ich finde allerdings nur bei den externen Interrupts was dazu) - da bewirkt dann nicht ein Anforderungsflag den Interrupt, sondern (zB) der Zustand des Pins. Und der kann übersehen werden, da er sich ja währen unterdrückter Interrupts (I-Flag) ändern kann...