INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Loop-Teil mit Interrupt für bestimmte Zeit stoppen
22.12.2019, 16:56
Beitrag #1
Loop-Teil mit Interrupt für bestimmte Zeit stoppen
Hallo zusammen,

ich bin neu hier im Forum. Habe zwar hier und da schon ein wenig mitgelesen , aber noch keine eigenen Beiträge erstellt. Ich bin jetzt seit einiger Zeit auf Rente Shy und habe ein früheres Hobby, “Elektronik-Basteln“ wieder aufleben lassen. Dabei bin ich dann auf den Arduino gestoßen und seit ein paar Monaten mit Begeisterung am Experimentieren. Die Möglichkeiten sind ja quasi unbegrenzt und im Vergleich zu früher, sind elektronische “Spielereien“ wesentlich einfacher umzusetzen.
Ich versuche zunächst die Basics zu erlernen, um dann später einige Projekte zu realisieren. Im Augenblick probiere ich gerade die INTERRUPTs zu verstehen. Das heisst, ich konnte das soweit umsetzen, aber an einer Sache beiße ich mir gerade meine dritten Zähne aus. Weshalb ich um eure Unterstützung bitten wollte.

Ich habe hier ein Experiment aufgebaut, in dem ein paar LEDs als Lauflicht im Loop ein- und ausgeschaltet werden. Mit einem Interrupt greife ich in diesen Prozess ein und schalte eine zusätzlich LED über einen Taster ein. Damit konnte ich die Interrupt Geschichte sehr gut nachvollziehen...! Jetzt kommt allerdings der Knackpunkt. Ich möchte erreichen, dass der Loop-Teil beim (ISR) Tastendruck für eine bestimmte Zeit stoppt und danach weiter läuft. Ja, was soll ich sagen, ich krieg's nicht hin.

Wer kann helfen?
Hier mein Sketch:

Code:
int ledPins[5] = {8,9,10,11,12};  //LED Array an den Pin's 8-12
const int taster = 2;             // Taster an Interrupt-Pin 2
int timer = 1000;                 // Delay-Zeit
int tasterLed = 7;                //Die LED, die mit dem Taster angehen soll
volatile int tasterStatus = 0;    // Variable die den Status des Taster ausliest


void setup() {
pinMode (taster, INPUT_PULLUP);
pinMode (tasterLed, OUTPUT);
attachInterrupt(0, button, CHANGE);   //Interrupt Routine, ACHTUNG: Der ISR-Pin 2 wird mit "0" angegeben

for (int index = 0; index < 5; index++) {
pinMode(ledPins[index], OUTPUT);
}
}

void loop() {
for (int index = 0; index < 5; index++) {
    digitalWrite(ledPins[index], HIGH);
    delay(timer);
        digitalWrite(ledPins[index], LOW);
}
  }
void button() {
  tasterStatus = digitalRead(taster);   //Abfrage tastaturStatus
if (tasterStatus == LOW){
digitalWrite(tasterLed, HIGH);}
else {
  digitalWrite(tasterLed, LOW);
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.12.2019, 17:02 (Dieser Beitrag wurde zuletzt bearbeitet: 22.12.2019 17:12 von hotsystems.)
Beitrag #2
RE: Loop-Teil mit Interrupt für bestimmte Zeit stoppen
Dann willkommen im Forum.

Da du allerdings eine Frage stellst, die Software betrifft, passt diese nicht in den Bereich für Projekte, sondern eher in den Bereich "Software bzw. Programmierung".

Was dein Problem betrifft, musst du mit einer Statusvariable arbeiten, die entsprechend deiner Pausenvorgabe das Lauflicht anhält. Diesen Ablauf musst du mittels der Funktion millis() programmieren, damit das ganze nicht blockiert.
Sieh dir dazu BlinkWithoutDelay aus den Beispielen der IDE an.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.12.2019, 17:37
Beitrag #3
RE: Loop-Teil mit Interrupt für bestimmte Zeit stoppen
(22.12.2019 17:02)hotsystems schrieb:  Da du allerdings eine Frage stellst, die Software betrifft, passt diese nicht in den Bereich für Projekte, sondern eher in den Bereich "Software bzw. Programmierung".
Ups, muss ich jetzt selber was unternehmen, oder bleibt das jetzt so?

Das mit dem “blink without delay“ hatte ich mir deswegen auch schon angesehen. Ich habe auch versucht, etwas mit der “while Schleife“ zu probieren, aber ich habe keinen Schimmer. Vielleicht kann mir jemand einen passenden Code-Schnippsel vorschlagen und ich werde mir das dann hinterher verinnerlichen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.12.2019, 17:41 (Dieser Beitrag wurde zuletzt bearbeitet: 22.12.2019 17:44 von Tommy56.)
Beitrag #4
RE: Loop-Teil mit Interrupt für bestimmte Zeit stoppen
(22.12.2019 17:37)Alter Fritz schrieb:  
(22.12.2019 17:02)hotsystems schrieb:  Da du allerdings eine Frage stellst, die Software betrifft, passt diese nicht in den Bereich für Projekte, sondern eher in den Bereich "Software bzw. Programmierung".
Ups, muss ich jetzt selber was unternehmen, oder bleibt das jetzt so?

Das mit dem “blink without delay“ hatte ich mir deswegen auch schon angesehen. Ich habe auch versucht, etwas mit der “while Schleife“ zu probieren, aber ich habe keinen Schimmer. Vielleicht kann mir jemand einen passenden Code-Schnippsel vorschlagen und ich werde mir das dann hinterher verinnerlichen.

Das wird ein Moderator verschieben. Das Lernen der Grundlagen kann Dir keiner abnehmen. Irgendwelche eigene Schleifen sind meist ein Irrweg. Du hast eine große Schleife: loop.

BlinkWithoutDelay solltest Du Dir nicht nur anschauen, sondern verstehen. Dabei können Dir die "Nachtwächtererklärung" und auch Beiträge in "Tutorials und Literatur" beim Verständnis helfen.

Interrupts solltest Du weiter nach hinten verschieben, wenn Du die nötigen Kenntnisse dafür hast.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.12.2019, 18:46
Beitrag #5
RE: Loop-Teil mit Interrupt für bestimmte Zeit stoppen
(22.12.2019 16:56)Alter Fritz schrieb:  Ich versuche zunächst die Basics zu erlernen.....

Kleiner Tipp am Rande!

Nutze die Automatische Formatierung in der Arduino IDE.

Werkzeuge -> Automatische Formatierung
oder
Strg+T

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.12.2019, 21:58
Beitrag #6
RE: Loop-Teil mit Interrupt für bestimmte Zeit stoppen
(22.12.2019 18:46)Fips schrieb:  Kleiner Tipp am Rande!

Nutze die Automatische Formatierung in der Arduino IDE.

Werkzeuge -> Automatische Formatierung
oder
Strg+T

Gruß Fips

Super, Danke, werde ich in Zukunft machen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.12.2019, 22:10 (Dieser Beitrag wurde zuletzt bearbeitet: 22.12.2019 22:24 von Franz54.)
Beitrag #7
RE: Loop-Teil mit Interrupt für bestimmte Zeit stoppen
Wenn du eine Ausführung stoppen willst, oder auch alles was im Loop läuft, stoppen willst, dann mache das, indem du eine Taste drückst, die wird erkannt, und du sagte einem Merker, dass er jetzt statt "0" auf "1" gehen soll. Den Merker fragst ganz am Anfang des Loops ab, und daraufhin wird alles was nicht mehr laufen soll übersprungen, weil der Merker auf 1 ist.

Also oben im Loop eine if abfrage ob der Merker auf 0 ist, wenn ja laufe alles ganz normal durch, wenn aber der Merker auf 1 ist, überspringe den ganzen if Abfrage Bereich. Wenn die Tastenabfrage nicht in diesem if Abfragebereich ist, kannst du wieder die Taste drücken und sorgst damit dafür, dass der Merker wieder auf 0 geht. Oben in der if Abfrage ist dann der Merker wieder auf 0 also werden alle Bereiche im if Abfragebereich wieder durchlaufen und somit läuft das Programm wieder.

Du kannst auch eine Zeitabfrage einbauen mit Millis. Wenn der Merker 1 ist, wird die Zeit gestartet, in der Zeit wird der if Bereich wieder übersprungen, weil der Merker auf 1 ist, wenn dann die Zeit abgelaufen ist, wird automatisch der Merker auf 0 gestellt, und die Programmteile im If Abfrage Bereich werden wieder bedient. Du kannst es auf Zeit auch mit nem Delay(Zeit in ms) stoppen. Dann macht das Programm auch überhaupt nichts mehr solange wie eben diese delay Zeit ist. delay(60000) ist eine Minute (60000ms) totale Pause. Aber man will ja in der Regel, dass die CPU schon noch auf ihren Herrn hört. In der delay Zeit ist aber wirklich Pause. Da macht die CPU dann wirklich nichts mehr. Deshalb ist das in der Regel die schlechteste Option.

Den Loop stoppen kannst du natürlich auch. Einfach mit dem Hammer auf den Arduino hauen, und alles stoppt, das ist noch intensiver wie die delay PauseTongue . Du kannst auch einen WatchDock einbauen, dann wird der Arduino neu gestartet, also ganz kurz der Loop aus und dann sofort wieder an. Den Loop stoppen ist nicht gut, denn dann bist du draussen. Dein Prgramm läuft im Loop, wenn der steht macht kein Programm der Welt noch irgendwas.

https://www.youtube.com/watch?v=Fnzn85oWM_Q
Hier was zum Thema Deutsche Politik Angry
Und hier zum Thema richtige Politik Big Grin
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.12.2019, 09:16 (Dieser Beitrag wurde zuletzt bearbeitet: 23.12.2019 09:17 von MicroBahner.)
Beitrag #8
RE: Loop-Teil mit Interrupt für bestimmte Zeit stoppen
(22.12.2019 16:56)Alter Fritz schrieb:  Ich versuche zunächst die Basics zu erlernen, um dann später einige Projekte zu realisieren. Im Augenblick probiere ich gerade die INTERRUPTs zu verstehen.
Ich würde mal sagen, das widerspricht sich. Die Interrupts gehören ganz gewiss nicht zu den Basics und werden von vielen Einsteigern falsch eingeschätzt und falsch eingesetzt.
Die braucht man im Sketch eigentlich nur sehr selten und in wenigen speziellen Fällen. Für den Einstieg in den Arduino solltest Du die jetzt einfach mal vergessen. Viel wichtiger ist es, blockierungsfrei (ohne delay() ) programmieren zu lernen. Da hast Du ja schon ein paar Tips bekommen. Ich persönlich mag die direkten millis()-Abfragen im Sketch nicht so sehr, und verwende da lieber etwas 'handlichers' wie den EggTimer in meinen MobaTools. Aber das ist Geschmacksache - das Grundprinzip ist immer dasselbe: Du darfst den loop() nicht anhalten, sondern musst im loop die Teile, die Du gerade nicht ausführen willst, überspringen.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Lauflicht mit Interrupt senseman 18 1.025 09.12.2019 22:37
Letzter Beitrag: senseman
  AT90CAN Interrupt wird nicht ausgelöst slsb02 5 380 19.11.2019 15:04
Letzter Beitrag: slsb02
  Probleme mit Blinklicht auf bestimmte Zeit Prospekteur 15 834 20.10.2019 17:08
Letzter Beitrag: Tommy56
  Aktivierung nur in einer bestimmten Zeit Prospekteur 48 2.855 14.09.2019 12:57
Letzter Beitrag: MicroBahner
  Interrupt vs. LCD Nasenbär 10 1.125 22.08.2019 16:30
Letzter Beitrag: @Thomas
  Kennt jemand einen Stepper Closed Loop Sketch? Holzwurm56 16 1.840 17.06.2019 22:37
Letzter Beitrag: georg01
  delay Zeit falsch golex 9 1.485 24.05.2019 21:18
Letzter Beitrag: GuaAck
  For-Loop verschluckt Ausgabe am seriellen Monitor TimeMen 5 688 14.04.2019 17:59
Letzter Beitrag: Tommy56
  Wasserverbrauchszähler, statische Variablen, komisches Verhalten in der loop() pzYsTorM 14 1.410 19.03.2019 20:33
Letzter Beitrag: Hilgi
  Zeit vom Nextion Enhanced mit Arduino auslesen MarkoM 47 6.487 06.03.2019 18:08
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste