Wen ein Interrupt-Eeignis auftritt (also z.B. die steigende Flanke am Eingang D2 bzw. INT0) passiert folgendes:
1. alle Register-Inhalte werden gesichert
2. das Hauptprogramm bleibt an der Stelle stehen, an der es gerade ist
3. die Interrupt-Routine wird ausgeführt (und weil sie das Programm tatsächlich unterbricht, sollte sie so kurz wie möglich sein!!)
4. nach Abarbeiten der Interrupt-Routine werden alle "gerretteten" Register-Inhalte wieder zurückkgeschrieben, und
5. das Hauptprogramm an der Stelle fortgeführt, an der es unterbrochen wurde
Wie gesagt - es gibt haufenweise Ereignisse, die einen Interrupt auslösen können (!), z.B. wenn ein Timer seinen maximalwert erreicht und "überläuft", wenn ein AD-Wandler fertig gewandelt hat, wenn über die UART-Schnittstelle Daten reinkommen usw., usw.
Damit das Hauptprogramm nicht alle Nase lang von diesen Interrupts unterbrochen wird, sind ALLE Interrupts erstmal AUS und müssen bei Bedarf aktiviert werden.
Du kannst das mit ´nem Sicherungskasten eines Hauses vergleichen (nur mit dem Unterschied, dass der Normalzustand dort "Ein" ist):
Wenn Du einzelne Zimmer stromlos machen möchtest um z.B. Lampen zu wechseln, kannst Du gezielt einzelne Sicherungen rausdrehen (entspricht dem enablen bzw. disablen einzelner Interrupts, also z.B. enable INT0).
Wenn Du aber ganz sicher und in ALLEN Zimmern keinen Strom mehr haben möchtest, brauchst Du nicht alle 17 Einzelsicherungen rauszudrehen, sondern drehst einfach die Hauptsicherung raus. Das wäre dann das globale Ein- und Ausschalten der Interrupts (enable bzw. disable Interrupts).
Wenn Du also einen Interrupt ausführen lassen möchtest, musst Du sowohl den Interrupt selber, als auch die globale Freigabe aktivieren.
Und wenn die Aufgabe nur die ist, "zufällig" jeweils eine der 6 Zielscheiben zu aktivieren, für 2 Sekunden die beiden Taster zu überwachen und ggf. 5 bzw. 10 Punkte zu verbuchen, dann kann das ein einzelner Mikrocontroller alleine!
Lesezeichen