Interrupt im Programmablaufplan?
Hey, ich muss gerade für NWT einen PAP zeichnen.in dem Programm kommt auch der interrupt- Befehl vor. Ich weiß aber nicht wie genau ich ihn in den PAP einbauen soll. Der Interrupt-Befehl kommt im setup vor fällt er dann also unter start, so wie die ganzen Deklaration zum Beispiel auch? Wie würdet ihr das machen? Wohin geht der Pfeil dann nieder zurück vom unterprogramm?
meine Idee war diese hier (grobe Skizze, Befehle sind noch nicht eingetragen):
Das Programm hierzu ist übrigens das:
int warteZeit = 500;
int versagtZeit = 0;
int tasterStatus;
int tasterPin = 2;
int Pin;
int Signal = 0;
int startZeit = 500;
int LED1 = 4;
int LED2 = 5;
int LED3 = 6;
int LED4 = 7;
int LED5 = 8;
int DurchgangsZaehler = 0;
void setup() {
pinMode(tasterPin, INPUT_PULLUP);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(tasterPin), tempo, FALLING);
}
void loop() {
for ( Pin = LED1; Pin < LED5; Pin++) {
digitalWrite(Pin, HIGH);
delay(warteZeit);
digitalWrite(Pin, LOW);
if (Signal == 1) {
for (DurchgangsZaehler = 0; DurchgangsZaehler < 3; DurchgangsZaehler++) {
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
digitalWrite(LED5, HIGH);
delay(200);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
delay(200);
}
Signal = 0;
warteZeit=startZeit;
}
}
for ( Pin = LED5; Pin > LED1; Pin--) {
digitalWrite(Pin,HIGH);
delay(warteZeit); digitalWrite(Pin, LOW);
if (Signal == 1) {
for (DurchgangsZaehler = 0; DurchgangsZaehler < 3; DurchgangsZaehler++) {
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
digitalWrite(LED5, HIGH);
delay(200);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
delay(200);
}
Signal = 0;
warteZeit=startZeit;
}
}
Serial.print("Wartezeit=");
Serial.println(warteZeit);
}
void tempo() {
if (digitalRead(tasterPin) == 0 && Pin == 6) {
warteZeit = warteZeit - 50;
Serial.print("Richtig gedrückt, Wartezeit beträgt nun ");
Serial.print(warteZeit);
Serial.println(" Millisekunden");
}
else {
Signal = 1;
}
}
Danke schonmal, falls ihr trotz dieser langen Frage antwortet
1 Antwort
Die Interruptfunktion würde ich als seperates Unterprogramm zeichnen und nicht mit dem Hauptprogramm vermischen/verbinden. Du weisst schließlich nie, von wo dieses Unterprogramm aufgerufen wurde und wohin dann wieder zurückkehrt.
Im Hauptprogramm taucht denn lediglich die Initialisierung (Verbindung zur Taste) auf.
PS: Falls du das Programm auch geschrieben hast: Ich würde entweder die LED-Pins richtig in ein int-Array packen "int LED[5]={4,5,6,7,8};" oder aber grundsätzlich nur einzeln verwenden. Das "for ( Pin = LED5; Pin > LED1; Pin--) {" klappt nämlich nur, wenn die PINs wie bei dir fortlaufende PINs sind, aber das muss je nach Hardware nicht sein. Ein Unterprogramm setLED(int value) mit for (int i=0;i<5;i++) digitalWrite(LED[i], value); als weiteres Unterprogramm würde viel Tipparbeit sparen.