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 int TasterStatus = 0;

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

				
					// Der Taster wurde an Pin 2 angeschlossen
const int Taster = 2;

// Die LED wurde an Pin 7 angeschlossen
const int LED = 7;

// Variable die den Status des Taster ausliest
volatile int TasterStatus = 0;

void setup()
{
  pinMode(LED, OUTPUT);            // hier wird die LED als OUTPUT definiert
  pinMode(Taster, INPUT_PULLUP);   // hier wird der Taster als INPUT definiert

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

void loop() 
{
  // bleibt leer 
  // das Programm reagiert nur auf den Interrupt TasterUnterbricht()
}

void TasterUnterbricht()
{
  /*
   sobald die Unterbrechung "TasterUnterbricht"
   durch Drücken des Tasters aktiviert wird
   ändert sich der Wert am Pin 2 des Taster von HIGH zu LOW
   nun wird die LED an Pin 7 in den zuvor ermittelten  Tasterstatus (LOW) versetzt
   die LED wird ausgeschaltet
  */
  TasterStatus = digitalRead(Taster);
  digitalWrite(LED, TasterStatus);
}

				
			

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