Der loop-Teil jedes Programms wird schrittweise abgearbeitet. Es ist nicht möglich gleichzeitig einen anderen Befehl auszuführen.
Beispiel:
Jeder delay()-Befehl stoppt den Programmablauf für die angegebene Zeit. In dieser Zeit kann kein anderer Befehl ausgeführt werden.
Dennoch gibt es dafür eine Lösung:
Ein Taster kann einem Interrupt zugeordnet werden (attachInterrupt). Wenn der Taster betätigt wird, löst er den Interrupt aus.
Der normale Programmablauf wird unterbrochen und die festgelegte Funktion (Interrupt-Service-Routine) wird ausgeführt. Anschließend wird das Programm normal fortgesetzt.
attachInterrupt(digitalPinToInterrupt(TASTER), LEDSchalten, CHANGE);
Der Taster löst den Interrupt aus, die Interrupt-Service-Routine (ISR) LEDSchalten wird aufgerufen. Der Interrupt soll auf einen Wechsel des Tasterzustands (LOW oder HIGH) reagieren.
Es gibt verschiedene Ereignisse, die den Interrupt auslösen können:
RISING | FALLING | CHANGE |
---|---|---|
der Interrupt wird ausgelöst wenn sich der Status von LOW zu HIGH ändert | der Interrupt wird ausgelöst wenn sich der Status von HIGH zu LOW ändert | der Interrupt wird ausgelöst wenn sich der Status ändert |
![]() | ![]() | ![]() |
Mikrocontroller | Nutzbare Pins |
---|---|
UNO | 2, 3 |
Nano | 2, 3 |
Nano Every | alle digitalen Pins |
UNO WiFi Rev2 | alle digitalen Pins |
MKR Familie | 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
Nano 33 IoT | 2, 3, 9, 10, 11, 13, 15, A5, A7 |
Zusätzlich muss eine Variable, die im Hauptprogramm und in Interruptroutinen verwendet wird, als volatile (flüchtig) definiert werden.
Variable werden im ⇒SRAM und temporär in internen Registern des Prozessors gespeichert, bearbeitet oder verändert. Der Zugriff auf den SRAM ist aber relativ langsam, daher kann es vorkommen, dass der Wert der Variablen im SRAM durch eine neue Wertzuweisung für kurze Zeit nicht stimmt, da der letzte Wert zunächst nur in den Prozessorregistern liegt.
Das Schlüsselwort volatile weist das Programm an, die Variable immer aktuell im SRAM zu halten. Damit wird garantiert, dass der jeweils aktuelle Wert geladen wird.

⇒Weitere Informationen zur Speicherverwaltung
Außerdem sind bei der Programmierung einer Interrupt-Funktion einige Regeln zu beachten:
- Der Programmteil muss so kurz wie möglich sein.
- Verwende kein delay().
- Benutze auch kein Serial.print().
Im Beispielprogramm ist die LED beim Start ausgeschaltet.
Jeder Druck auf den Taster löst den Interrupt aus und solange der Taster gedrückt wird leuchtet die LED.
Beachte die Kommentare.
#define LED 7
#define TASTER 2
/*
je nach Zustand der Variable TasterStatus ist die LED ein- oder ausgeschaltet
beim Start des Programms ist sie ausgeschaltet
*/
volatile bool LEDStatus = LOW;
void setup()
{
pinMode(LED, OUTPUT);
// Eingangspegel des Tasters auf HIGH setzen
pinMode(TASTER, INPUT_PULLUP);
/*
wenn der Taster gedrückt wird
⇒ Funktion LEDSchalten aufrufen
CHANGE ⇒ es ist eine Veränderung eingetreten, der Taster
wurde gedrückt
*/
attachInterrupt(digitalPinToInterrupt(TASTER), LEDSchalten, CHANGE);
}
void loop()
{
// LED schalten
digitalWrite(LED, LEDStatus);
}
void LEDSchalten()
{
// LEDStatus "umdrehen"
// aus true wird false, aus false wird true
LEDStatus = !LEDStatus;
}
Letzte Aktualisierung: