Suche

Der Interrupt-Befehl attachInterrupt()

Aufgabe Nr. 25 : Das Leuchten einer LED durch einen Tastendruck unterbrechen

In dieser Aufgabe möchten wir das durchgehende Leuchten einer LED mit Hilfe eines Tasters unterbrechen.
Anschließend soll das Leuchten der LED fortgesetzt werden.

Der Schaltplan

Unser Taster wird an Pin 2 des Arduinos angeschlossen.
Unsere LED wird an Pin 7 des Arduinos angeschlossen.

 

Das Programm im Film

Erklärung des Programms

Bisher haben wir eine LED entweder ein- oder ausgeschaltet (zum Beispiel mit einem delay), doch nie eine bestehende Aktion unterbrochen. Dies gelingt uns nun mit dem sogenannten Interrupt-Befehl.

Es gibt ver­schie­de­ne Ereig­nis­se, die den Inter­rupt aus­lö­sen können:

Erklärung zum Befehl attachInterrupt

attachInterrupt(digitalPinToInterrupt(Taster), TasterUnterbricht, CHANGE);

Der Tas­ter wird einem Inter­rupt zuge­ord­net (attach­In­ter­rupt).
Mit digitalPinToInterrupt  wird der Pin des Tasters dem Interrupt zugewiesen.
Wenn der Tas­ter betä­tigt wird, löst er den Inter­rupt aus. Als Bedingung wird CHANGE definiert, der Interrupt wird also ausgelöst, wenn der Zustand sich von HIGH zu LOW ändert.
Der nor­ma­le Pro­gramm­ab­lauf wird unter­bro­chen und die fest­ge­leg­te Funk­ti­on (Interrupt-Service-Routine) TasterUnterbricht wird aus­ge­führt. Anschlie­ßend wird das Pro­gramm nor­mal fortgesetzt.
Der Tas­ter muss zwin­gend am Pin 2 oder Pin 3 ange­schlos­sen wer­den.
Zusätz­lich muss eine Varia­ble, die im Haupt­pro­gramm und in Inter­rupt­rou­ti­nen ver­wen­det wird, als vola­ti­le defi­niert wer­den.
Es kann vor­kom­men, dass der Wert einer Varia­blen im Speicher durch eine neue Wert­zu­wei­sung für kur­ze Zeit nicht stimmt.
Das Schlüs­sel­wort vola­ti­le weist das Pro­gramm an, die Varia­ble immer aktu­ell im Speicher zu hal­ten. Damit wird garan­tiert, dass der jeweils aktu­el­le Wert verwendet wird.
Die Definition einer Variablen muss also mit dem Schlüsselwort volatile erweitert werden:
volatile bool LEDStatus = LOW;

attachInterrupt(digitalPinToInterrupt(Taster), TasterUnterbricht, CHANGE); Der Tas­ter wird einem Inter­rupt zuge­ord­net (attach­In­ter­rupt). Mit digitalPinToInterrupt wird der Pin des Tasters dem Interrupt zugewiesen. Wenn der Tas­ter betä­tigt wird, löst er den Inter­rupt aus. Als Bedingung wird CHANGE definiert, der Interrupt wird also ausgelöst, wenn der Zustand sich von HIGH zu LOW ändert. Der nor­ma­le Pro­gramm­ab­lauf wird unter­bro­chen und die fest­ge­leg­te Funk­ti­on (Interrupt-Service-Routine) TasterUnterbricht wird aus­ge­führt. Anschlie­ßend wird das Pro­gramm nor­mal fortgesetzt. Der Tas­ter muss zwin­gend am Pin 2 oder Pin 3 ange­schlos­sen wer­den. Zusätz­lich muss eine Varia­ble, die im Haupt­pro­gramm und in Inter­rupt­rou­ti­nen ver­wen­det wird, als vola­ti­le defi­niert wer­den. Es kann vor­kom­men, dass der Wert einer Varia­blen im Speicher durch eine neue Wert­zu­wei­sung für kur­ze Zeit nicht stimmt. Das Schlüs­sel­wort vola­ti­le weist das Pro­gramm an, die Varia­ble immer aktu­ell im Speicher zu hal­ten. Damit wird garan­tiert, dass der jeweils aktu­el­le Wert verwendet wird. Die Definition einer Variablen muss also mit dem Schlüsselwort volatile erweitert werden: volatile int TasterStatus = 0;

Das Programm

				
					#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;
} 
				
			

Funduino - Dein Onlineshop für Mikroelektronik

  • Dauerhaft bis zu 10% Rabatt für Schüler, Studenten und Lehrkräfte
  • Mehr als 3.500 Artikel sofort verfügbar!
  • Über 8 Jahre Erfahrung mit Arduino, 3D-Druck und co.
SALE

Alle Modelle der hier gezeigten Modelle sind hier zum Download  in einer kompakten Zip Datei verfügbar.