Interrupts mit Arduino benutzen

Was sind Interrupts

Durch die Verwendung eines Interrupts wird der gerade laufende Code buchstäblich unterbrochen, egal ob er gerade eine Schleife abarbeitet, Eingaben über den Seriellen Port verarbeitet oder komplizierte Berechnungen durchführt. Stellen Sie sich vor, Sie haben einen Schalter mit dem Sie ein Licht einschalten wollen. Würde der Arduino nun gerade eine Schleife abarbeiten dann würde dieser überhaupt nicht mitbekommen dass Sie den Schalter betätigt haben und das Licht bliebe aus. Legen Sie nun einen Inter. wird auf den Pin, an dem Ihr Schalter angeschlossen ist, in dem Augenblick, in dem Sie den Schalter drücken, den normalen Programmablauf unterbrechen und die Funktion abarbeiten die Sie zugewiesen haben. Direkt danach würde der normale Programmablauf an genau der Stelle fortgesetzt werden an der er unterbrochen wurde.

Interrupts müssen in der Regel aktiviert werden. Dies macht man über “attachInterrupt(INTER, FUNKTION, MODUS)

INTER.
Welchen Interrupt Sie hier verwenden können, sehen Sie in der unteren Liste.

FUNKTION
Als Funktion, wählen Sie eine beliebige Funktion, die ausgeführt werden soll, sobald ein Ereignis eintritt. Diese Funktion benötigt keinen Rückgabewert. In dieser Funktion werden weder delay() noch millis() funktionieren.

MODUS
Der Modus definiert, wann der Alarm oder das Ereignis ausgelöst werden soll.

  • LOW = Löst aus wenn sich der Wert von HIGH auf LOW ändert
  • CHANGE = Löst aus wenn sich der Werte am Pin ändert
  • RISING = Löst aus wenn der Wert des Pins von LOW auf HIGH wechselt
  • FALLING = Löst aus wenn sich der Wert des Pins von HIGH auf LOW ändert
  • HIGH = Löst aus wenn sich der Wert von LOW auf HIGH ändert.
    (Nur beim Arduino Due)

 

Hier eine Liste der externen Interrupts
der gängigsten Arduino Boards.

Uno, Ethernet:

  • Inter. 0 = Digitaler Pin 2
  • Inter. 1 = Digitaler Pin 3

Leonardo:

  • Inter. 0 = Digitaler Pin 3
  • Inter. 1 = Digitaler Pin 2
  • Inter. 2 = Digitaler Pin 0
  • Inter. 3 = Digitaler Pin 1

Mega2560:

  • Inter. 0 = Digitaler Pin 2
  • Inter. 1 = Digitaler Pin 3
  • Inter. 2 = Digitaler Pin 21
  • Inter. 3 = Digitaler Pin 20
  • Inter. 4 = Digitaler Pin 19
  • Inter. 5 = Digitaler Pin 18

 

Beispiel ohne Interrupt

Wenn Sie bei diesem Beispiel den Button drücken dann wird sicher nichts passieren weil die Schleife eine ganze Zeit lang läuft. In dieser Zeit kann der Arduino einen Druck auf den Button nicht erkennen.

const int switchPin = 3;
int buttonState;

void setup()
{
  Serial.begin(9600);
  pinMode(switchPin, INPUT);
}

void loop()
{
  buttonState = digitalRead(switchPin);

  for (int i = 0; i < 1000; i++)
  {
    if (buttonState == HIGH) 
    {     
      Serial.println("AN");
    } 
    else 
    {
      Serial.println("AUS");
    }
    delay(100);
  }
}

 

Arduino - Interrupt - Fritzing

 

Beispiel mit Interrupt

Hier würde der Programmfluss sofort nach einem Druck auf den Button unterbrochen, die Funktion showTemperatures ausgeführt und direkt danach der Programmablauf an genau der Stelle, an der er unterbrochen wurde, fortgesetzt werden.

volatile int buttonState = LOW;

void setup()
{
  Serial.begin(9600);
  attachInterrupt(1, showTemperatures, FALLING);
}

void loop()
{
  for (int i = 0; i < 1000; i++)
  {
    delay(100);
  }
}

void showTemperatures()
{
  buttonState = !buttonState;

  Serial.println("Hallo");
}

 

Einen Interrupt entfernen Sie mit “detachInterrupt(interrupt)

 

Über Enrico S.

Programmierer, Webdesigner, Grafiker, Blogger, Screencaster, Arduino- und eMobility Enthusiast. nefilim3006 ist auch bei Google+ vertreten

2 Kommentare zu “Interrupts mit Arduino benutzen

  1. Hallo,

    welche Alternativen gibt es zu delay(), die in einer Interruptmethode verwendet werden können?

Kommentar verfassen