ich bin die ganze Zeit am rumprobieren einen Not-Aus in die Programmierung rein zu nehmen.
Probiert habe ich auf Grund meines Anfängerwissens nur mit While- Do- und If sachen.
Ziel ist es, das Programm nahezu jeder Zeit zu stoppen.
Bisher scheitert es aber immer daran, dass er enweder das Programm einmal komplett durchspielt bevor die While/Do schleife greift oder das ich überall im Code reinschreiben müsste "If "Notaus" dann Stopp, ansonsten Programm Fortsetzten"
Gibt es eine Möglichkeit den Notaus ständig abzufragen und das Programm an jeder stelle zu stoppen?
Gibt es sowas auch, dass es innerhalb eines delay funktioniert?
Ein echtes Notaus sollte immer in Hardware erfolgen, nie in Software.
Falls es nur um ein schnelles Unterbrechen geht, dann kann man das realisieren, indem man nicht blockierend programmiert. Also keine delay(), keine eigenen (while,for,do while) Schleifen - es gibt ja schon loop.
Dammit erreichst Du, dass ein loop-Durchlauf sehr schnell ist. Im loop kannst Du dann immer Deinen Aus-Taster abfragen und darauf reagieren.
Zeitsteuerungen musst Du dann mit millis() machen. Schau Dir dazu BlinkWithoutDelay an und verstehe es. Dabei kann Dir die Nachtwächtererklärung helfen.
Für genauere Hinweise fehlen alle Informationen von Deiner Seite.
Gibt es sowas auch, dass es innerhalb eines delay funktioniert?
Klar!
Hier ein Fragment aus meiner Wühlkiste:
const byte stoppPin = 2;
void __attribute__((noreturn)) halt()
{
cli();
while(1){}; // halt
}
void yield()
{
if(not digitalRead(stoppPin)) halt();
}
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
pinMode(stoppPin,INPUT_PULLUP);
}
void loop()
{
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Ja, yield kann man auch nehmen, ich halte es aber nicht unbedingt für den sinnvollen Anfängerweg, da es gerade die schnell vom Erlernen eines sauberen Programmierens abhalten kann.
Och...
Dann verstehe ich nicht, was du mir sagen möchtest...
Irgendwie will mir nicht einleuchten, dass yield() unsauberen Code fördert.
Eher im Gegenteil.
Auch: yield() ist ein Ansatzpunkt, um sich mit Nebenläufigkeiten zu beschäftigen.
Ein tragfähiges Konzept, was sich in jedem, wirklich in jedem, Multitasking System auf irgend eine Art wiederfinden lässt. Und sei es noch so primitiv.
Es geht quasi gar nicht ohne.
PS:
Dass es für unseren Felix1510 noch viel zu lernen gibt, dürfte außer Frage stehen!
An den TO war meine Bemerkung auch eher gerichtet. Ich denke, er sollte erst mal ohne delay und eigenen Schleifen lernen zu programmieren, bevor er sich mit Nebenläufigkeiten beschäftigt.
Aber dass muss er letztendlich selbst entscheiden. Die Ansätze für beide Wege hat er ja jetzt.
Da steckt er ja schon mit beiden Beinen drin, wenn er einen Ablauf haben möchte und asynchron dazu eine Taste abfragen möchte und damit dann das ganze anhalten.
Eigentlich würde ich ja mal gerne den Problem Code sehen....
Du kannst natürlich auch in einer ISR eine Variable setzen 'abbruch=true;'.
Diese musst Du aber in jeder noch so fitzeligen Schleife als Abbruch-Bedingung aufnehmen - darin sehe ich keinen wirklichen Sinn.
Wenn noch delay() benutzt wird, könnte man in yield() 'Zählwert=Endwert' auslösen, damit auch Das direkt abgebrochen wird.
Der Code, hinter dem delay(), wird dann direkt ausgeführt und wir kämen wohl recht schnell zur Abbruch-Prüfung.
Das wäre bei der State-Maschine aber wohl identisch, denn auch hier wird der State erst abgearbeitet.
Dann lieber ein Mal in den sauren Apfel beißen und sich die millis()-Geschichte aneignen, also State-Maschine/Endlicher-Automat.
DAS braucht man eh immer wieder - JEDES Problem lässt sich so abarbeiten, Häppchenweise.
loop() ist rasend schnell und man kann 'direkt' auf Alles nur Denkbare reagieren.
... klar, auch in einer ISR, Die ist Dann aber meist nicht mehr nötig, da der Sketch eh 'alle Nase lang' vorbei kommt und den Pin/das Ereignis auch selber erfassen kann.
Natürlich kann man das auch in eine ISR stopfen. (wenn man sonst keine Probleme hat)
[OT]
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...
Hmmm ....
Du meinst dieses? Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,