Hallo kimmi
ich habe so den Verdacht, dass Dir die Interruptsachen nicht ganz klar sind? Mir kommt es so vor, dass wir alle manchmal aneinander vorbei"schreiben"...
Ich beschreibe mal auf Verdacht etwas die Funktionsweise ja? Und wenn es allzu großer Unsinn sein sollte werden die Kollegen hier es sicher schnell korrigieren Im wiki ist es zwar beschrieben, aber es tauchen doch viele wahrscheinlich verwirrende Begriffe auf...
Es gibt im wesentlichen zwei Möglichkeiten einen Controller auf Signale der realen physikalischen Welt reagieren zu lassen. Signale der Umwelt werden immer als Spannungspegel oder Spannungsänderung an einem Pin des Controllers angelegt.
Die erste Methode kennst Du ja schon. In einer while-Schleife einen Pin nach seinem Spannungspegel abfragen.
Im wesentlichen macht Radio.available() so etwas. Man läßt also sein Hauptprogramm so vor sich hinwerkeln und fragt dabei einen interessanten Pin nach seinem Pegel.
Je nachdem welcher Pegel anliegt macht dein Hauptprogramm wie gewohnt weiter oder behandelt das Eingangssignal. Dieses Verfahren nennt man auch polling.
Die andere Methode die Umwelt zu erfassen sind Interrupts!
Interrupt kann man ja als "unterbrechen" beschreiben/übersetzen. Genau das ist es auch.
Hier übernimmt die Hardware das Erkennen einer Änderung an einem Eingangspin des Controllers.
Du bastelst Dir eine Funktion, die nur dann ausgeführt werden soll, wenn sich an Pin 2 z.B. der Pegel ändert. In den Beispielen hier war es die Funktion void blink(void). Du sagst dem Controller ganz zu Anfang in deinem Programm
"Wenn an Pin 2 etwas wackelt, dann führe blink aus attachInterrupt(0,blink)
Nun fängt dein eigentliches Hauptprogramm an zu werkeln. Schön einen Befehl nach dem anderen.
Irgendwann, ganz plötzlich und unerwartet passiert an Pin2 etwas. Und jetzt das schöne! Ohne das Du noch etwas abfragen musst unterbricht der Controller dein normales Hauptprogramm. Irgendwo, wo es halt gerade war.
Zusätzlich merkt sich der Controller, wo er Dein Hauptprogramm unterbrochen hat.
Dann ab zu der vorher für diesen Fall bekannt gemachten Funktion blink (Du erinnerst Dich: attachInterrupt(0,blink) )
blink ist ein Beispiel für die von Bohne angesprochenen ISRs
(Interrupt Service Routine). Wenn blink jetzt abgearbeitet ist, erinnert sich die Hardware, wo sie dein Hauptprogramm unterbrochen hat und macht dann da weiter als wäre nix geschehen.
Der kleine Atmel kann Interrupts erzeugen, wenn außen etwas passiert (das kann er an Pin2 oder Pin3) oder Timer abgelaufen sind oder der A/D Wandler fertig ist usf.
Zusatz: (muss man nicht direkt verstehen, schadet aber auch nix :D)
Für jeden Interrupt gibt es einen Eintrag im RAM an einer speziellen, vom Hersteller festgelegten Adresse. Das ist die Interrupt Vektor Tabelle. Wenn nun an Pin 2 etwas passiert schaut die Hardware in dieser Tabelle nach, wohin verzweigt werden soll.
.org 0x000 ; kommt ganz an den Anfang des Speichers
rjmp RESET ; Interruptvektoren überspringen
; und zum Hauptprogramm
rjmp EXT_INT0 ; IRQ0 Handler <- Pin 2
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM2_COMP
rjmp TIM2_OVF
rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 CompareA Handler
rjmp TIM1_COMPB ; Timer1 CompareB Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
rjmp USART_RXC ; USART RX Complete Handler
rjmp USART_DRE ; UDR Empty Handler
rjmp USART_TXC ; USART TX Complete Handler
rjmp ADC ; ADC Conversion Complete Interrupthandler
rjmp EE_RDY ; EEPROM Ready Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp TWSI ; Two-wire Serial Interface Handler
rjmp SPM_RDY ; Store Program Memory Ready Handler
Vorteil: Du verpasst kein Ereignis, weil die Hardware drauf achtet und Du verschwendest keine Rechenzeit durch pollen, wenn nix passiert.
Vielleicht ist der Unterschied Pollen und Interrupt etwas klarer geworden?
Und sorry für langen Text....