Moin allerseits,
ich versuche gerade mit interrupts klar zu kommen und in diesem Zusammenhang brauche ich auch anderen voids (neben void setup und void loop).
In Void loop soll ein Programm durchlaufen. Es soll jedoch jederzeit über einen Taster mit einem Interrupt auf DI 2 (Arduino UNO) unterbrochen werden können. Der Befehl
> attachInterrupt(digitalPinToInterrupt(0), interrupt, CHANGE)
erzeugt an DI 2 den Interrupt. Wenn sich also DI2 zu HIGH oder LOW ändert, wird void interrupt aufgerufen. So weit funktioniert alles wie es soll. Das Problem ist, dass der Code in void interrupt nicht ordentlich von oben nach unten durchlaufen wird sondern eher alles auf einmal. In dem void befinden sich z.b. mehrmals delay(500), wodurch eine LED blinken soll. Das wird völlig ignoriert. Auch im seriellen Monitor erscheint der Text, der sowohl zu beginn des voids als auch am Ende steht, zeitgleich.
Woran liegt das?
Während der Fehlersuche habe ich folgenden Beispielcode gefunden. Ich habe den Eindruck, ich stoße mit ihm auf den gleichen Fehler wie oben beschrieben. Und weil mein eigener Code ein ziemliches Wrack ist, glaube ich, dass sich dieser sehr kompakte Code besser eignet mein Problem zu finden und zu erklären:
// https://funduino.de/25-der-interrupt-befehl-attachinterrupt
const int Taster = 2; // Der Taster wurde an Pin 2 angeschlossen
const int LED = 13; // Die LED wurde an Pin 13 angeschlossen
volatile int TasterStatus = 0; // Variable die den Status des Taster ausliest, wird der sog. "Vektor" 0 zugewiesen
// Taster Anschluss an Pin 2 entspricht dem Vektor 0 (hier der Fall)
// Taster Anschluss an Pin 3 entspricht dem Vektor 1
void setup() {
pinMode(LED, OUTPUT); // Hier wird die LED als OUTPUT definiert
pinMode(Taster, INPUT); // Hier wird der Taster als INPUT definiert
attachInterrupt(0, TasterUnterbricht, CHANGE); // Hier findet die Einbindung unseres Interrupt-Befehls statt
Serial.begin(9600);
Serial.println("ende void setup");
}
void loop() {
Serial.println("void loop"); // Hier leer, der eigentliche loop() Teil findet nun in der "void TasterUnterbricht()" statt
}
void TasterUnterbricht() { // Sobald die Unterbrechung "TasterUnterbricht" (der Wert am Pin ändert sich [CHANGE])...
//Serial.println("void TasterUnterbricht");
TasterStatus = digitalRead(Taster); // ... wird der TasterStatus neu definiert ("volatile"). Die neue Definition geschieht durch das Auslesen des Tasters an Pin 2. ...
digitalWrite(LED, TasterStatus); // ... [digitalWrite(pin,Status)] Nun wird die LED (Pin13) in den zuvor definierten Tasterstatus versetzt.
}
Wenn ich den Code von der oben verlinkten Webseite kopiere funktioniert er. Die LED leuchtet und wenn ich den Taster drücke geht sie aus.
Um den Code besser zu verstehen (wann was abgearbeitet wird) habe ich begonnen Serial.print("...") - Befehle einzufügen. Und dabei stelle ich fest, die (jetzt auskommentierte) Zeile 40 mit //Serial.println("void TasterUnterbricht");
macht alles kaputt. Die LED blinkt auf einmal wie blöd und im Seriellen Monitor rauscht die Zeile "void TasterUnterbricht" mit einigen Unterbrechungen von "void loop" nur so durch.
Woran liegt das? Warum wird nicht wie bisher void TasterUnterbricht ordentlich abgearbeitet? Es muss doch möglich sein, dort ein paar Zeilen Code zu ergänzen?