Um Code zu posten, hat es extra Code Tags dann wird der Post keinen halben Kilometer lang.
Einfach unter [Erweitert].
An sonsten, könnte es hier eventuell um Aruino C++ und als Board um einen ArduinoMega 2560 gehen?
void loop() lässt sich übrigens nicht stoppen (außer man dreht den Saft ab)
Aber Tastendruck per IRQ erkennen ist der richtige Weg.
Und in der ISR dann eine Variabel setzen oder toggeln.
Danach kommt einfach eine Auswertung auf den Status dieser Variable (IF variable == 1) und entsprechende Verzweigung die verhindert das der gesammte Rest der Befehle ausgeführt wird.
Sei es überspringen der entsprechenden Bereiche, oder eine While schleife die solange durchlaufen wird wie die Merkervariable gesetzt (WHILE variable==1) ist. in der Schleife kann mann dann noch einen delay von z.B. 100ms ausführen.
Wenn also die Variable wieder zurückgenommen wird, würde das System nach spätestens 0,1s wieder reagieren.
ERGÄNZUNG
So, habe mal einen Code, für einen Arduino Nano mit IRQ Auswertung einer Taste, von mir gefunden.
void Button() ist die ISR die nichts anderes macht wie die Variable f_press auf Low zu setzen.Code://int f_tast = 2; int a_rot = 3; int a_gelb = 4; int a_gruen = 5; int f_rot = 8; int f_gruen = 9; int f_lamp_tast = 13; int s_licht = A0; byte f_press = HIGH; void setup() { pinMode(f_tast, INPUT); pinMode(a_rot, OUTPUT); pinMode(a_gelb, OUTPUT); pinMode(a_gruen, OUTPUT); pinMode(f_rot, OUTPUT); pinMode(f_gruen, OUTPUT); attachInterrupt(0, button, LOW); //Serial.begin(9600); } void loop() { int sensorValue = analogRead(s_licht); //Serial.println(sensorValue); // Blinker code zum Prüfen ob Programm läuft digitalWrite(f_lamp_tast, HIGH); //Blinker an Taste fuer Fussgaenger delay(500); digitalWrite(f_lamp_tast, LOW); delay(500); if (sensorValue > 500){ //Dämmerungswert für Nachtschaltung digitalWrite(a_rot, LOW); digitalWrite(a_gelb, HIGH); //Autos Gelb für Blinker digitalWrite(a_gruen, LOW); digitalWrite(f_rot, LOW); digitalWrite(f_gruen, LOW); delay(500); digitalWrite(a_gelb, LOW); } else { digitalWrite(a_rot, LOW); digitalWrite(a_gelb, LOW); digitalWrite(a_gruen, HIGH); //Autos gruen digitalWrite(f_rot, HIGH); //Fussgaenger rot digitalWrite(f_gruen, LOW); } // if (digitalRead(f_tast) == LOW){ //Taste Fussgaenger abfragen if (f_press == LOW){ //Statusvariable Taste Fussgaenger abfragen delay(500); digitalWrite(13, HIGH); //Taste Fussgaenger ist gedrueckt worden digitalWrite(f_rot, HIGH); //Fussgaenger rot digitalWrite(a_gruen, LOW); digitalWrite(a_gelb, HIGH); //Autos gelb delay(1000); // Autos Gelbphase digitalWrite(a_gelb, LOW); digitalWrite(a_rot, HIGH); //Autos rot delay(1000); // Fussgaenger Wartezeit damit kein Auto mehr fährt digitalWrite(13, LOW); digitalWrite(f_rot, LOW); digitalWrite(f_gruen, HIGH); //Fussgaenger gruen delay (6000); //Fussgaenger gruenphase digitalWrite(f_rot, HIGH); //Fussgaenger rot digitalWrite(f_gruen, LOW); delay(1000); //Autos Wartezeit damit kein Fussgaenger mehr laeuft digitalWrite(a_gelb, HIGH); //Autos gelb delay(1000); // Autos Gelbphase f_press = HIGH; } } void button(){ f_press = LOW; }
attachInterrupt(0, button, LOW)
Ordnet den Interrupt dem Eingang 0 und die ISR Button zu.
if (f_press == LOW) ist dann die Abfrage der Variablen und löst den entsprechenden Programmteil aus.
(in dem ich dann auch dafür sorgen muß das die Variable wieder zurückgesetzt wird: f_press = HIGH).
f_tast ist auskommentiert, wenn das anstelle der IRQ Variante genutzt wird, wird genau einmal pro Zyklus die Taste abgefragt (die liegt dann an Eingang 2).
Das ganze ist bewust mit delay() ausgeführt, da es genau die Problematik der Tastenauswertung ohne IRQ, bei längeren Zykluszeiten, verdeutlichen soll.







Zitieren

Lesezeichen