Auf den externen Interrupt ist auch schon im Kapitel Atmel Studio eingegangen worden.

Die Regeln wie z.B. das Zeitverhalten gelten auch in der Arduino IDE. Die Programmierung ist allerdings deutlich einfacher als bei Atmel Studio. Der Interrupt wird durch "attachInterrupt(digitalPinToInterrupt(tasterPin), taster, RISING)" aktiviert. Durch das erste Attribut  "digitalPinToInterrupt(tasterPin)" wird gesagt, auf welchen Pin sich der Interrupt bezieht. Mögliche Pins für den Interrupt sind beim Arduino UNO digital Pin 2 und digital Pin 3. Das zweite Attribut gibt den Namen der aufzurufenden ISR an (hier: "taster"). Das dritte Attribut gibt an, bei welchem Signal ein Interrupt geworfen werden soll. Mögliche Modi sind:

  • LOW: Solange ein 0-Signal am Eingang anliegt, wird ein Interrupt ausgelöst.
  • CHANGE: bei einem Wechsel von 0 auf 1 oder von 1 auf 0 wird ein Interrupt ausgelöst.
  • RISING: bei einer steigenden Flanke wird ein Interrupt ausgelöst.
  • FALLING: bei einer fallenden Flanke wird ein Interrupt ausgelöst.
  • HIGH: bei einem 1-Signal wird ein Interrupt ausgelöst.

detachInterrupt() würde alle Interrupts deaktivieren. Diese Funktion wird allerdings im folgenden nicht verwendet.


Beispiel zu externem Interrupt:

Funktion:

Ein Taster soll ein externen Interrupt auslösen. Dieser Interrupt soll eine LED für 1s leuchten lassen.

Schaltung:

Bei der Schaltung ist zu beachten, dass der Taster einen Pull-Up-Widerstand benötigt. Um diesen hardwareseitig zu realisieren, muss der Taster nicht auf 5V sondern auf GND gelegt werden.

.

Abb.: Aufbau externer Interrupt Schaltung; Quelle: BBS2 Wolfsburg

Programmcode:

//Definition der Pins
#define tasterPin 2                                                                          //Taster ist fest an Pin 2 angeschlossen
#define buzzerPin 13                                                                         //Buzzer und LED sind fest an Pin 13 angeschlossen

//Variablen für Interrupts
volatile int state = 0;                                                                      //löst die Datenerfassung aus wenn >0

void setup()
{
  pinMode(tasterPin, INPUT_PULLUP);                                                          //Definition des Tasterpins als INPUT mit Software Pull-Up
  pinMode(buzzerPin, OUTPUT);                                                                //Definition des Buzzerpins als Output
  attachInterrupt(digitalPinToInterrupt(tasterPin), taster, RISING);                         //Aktivierung des externen (Taster) Interrupts
}

void taster()                                                                                //Funktion wird aufgerufen wenn der Taster gedrückt wird
{
  state++;
}

void loop()                                                                                  //Schleifenfunktion (immer nötig bei der Programmierung von Mikrocontrollern)
{
   if (state >= 1)
  {
    digitalWrite(buzzerPin, HIGH); 
    delay(1000);                                                                     
    state --;                                                                                // Rücksetzen der Ausleseanfrage
  }
  else
  {
    digitalWrite(buzzerPin, LOW);
  }
}

Mehr Informationen zur Verwendung von Externen Interrupts:
https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

Zuletzt geändert: Montag, 21. Februar 2022, 09:07