Der Arduino Nano, wie auch der Uno oder Mega, können auf externe Interrupts reagieren. Übersetzt heißt „Interrupt“ „Unterbrechung“. Genau darum geht es bei der Programmierung.
Das Hauptprogramm werkelt so vor sich und kümmert sich nicht um seine Umgebung.
Nun kommt ein Ereignis, auf das geachet werden sollte. Ein Taster wird betätigt, eine Lichtschranke unterbrochen oder ein Bewegungssensor meldet eine Bewegung.
Ohne Interrupts könnte das Hauptprogramm vielleicht gar nicht mitbekommen, dass etwas beachtet werden muss.
Wenn ich aber dem Mikrocontroller sage „Lasse alles stehen und liegen, wenn ein bestimmtes Ereignis eintritt!“, dann kann es auch nicht mehr übersehen werden. Dieses kleine Unterbrechungs- oder Interruptrogramm sollte nun so schnell wie möglich sein, da wärenddessen keine anderen Programmteile weitergeführt werden.
Die Interruptroutine nenne ich kurz ereignis()
void ereignis() { state = !state; }
Die Funktion „dreht“ eine Variable um. Aus HIGH wird LOW, aus TRUE ein FALSE oder genau umgekehrt. Die Variable selber definiere ich am Anfang so:
volatile byte state = HIGH;
Der Mikrocontroller muss jetzt nur noch wissen, dass das genau die Routine ist, die aufgerufen werden soll, wenn etwas passiert ist. Dafür gibt es die Funktion attachInterrupt(…) in der Arduinoentwicklungsumgebung. Dieser Funktion teile ich drei Angaben mit:
void setup() { ...... attachInterrupt(digitalPinToInterrupt(interruptPin), ereignis, RISING); }
Die Interruptroutine macht nun immer, wenn an meinem Pin der Pegel von 0V auf 5V steigt ein HIHG zu einem LOW oder ein LOW zu einem HIGH. Also immer abwechselnd. Dieses ist praktisch, weil ich damit in dem loop() einfach mit der Information digitalWrite(…) aufrufen kann.
void loop() { digitalWrite(ledPin, state); }
Jetzt fehlt nur noch, die Angabe, wo die LED, die blinken soll, angeschlossen ist. Im setup() teile ich dann dem Mikrocontroller mit, dass diese LED zu nutzen ist.
Hier der ganze Sketch:
const byte ledPin = 13; const byte interruptPin = 2; volatile byte state = HIGH; void setup() { pinMode(ledPin, OUTPUT); pinMode(interruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), ereignis, RISING); } void loop() { digitalWrite(ledPin, state); } void ereignis(){ state = !state; }
Wenn dieser Sketch compiliert und auf einen Uno oder Nano übertragen wird, passiert: Wenig.
Die LED geht an und bleibt an. Sie blinkt nicht. Logisch, es fehlt der Interrupt am PIN 2.
Seiten: 1 2