Reset als Stop?????

Hallo Gemeinde,

bitte schlagt mich nicht gleich!

Ich habe folgendes Problem: Ich habe einen gut funktionierenden Sketch mit While-Loops, die durch Endschalter oder einen Taster gestoppt werden.

Nun dauert ein Durchlauf der Schleife fast 8 Sekunden. Wenn ich jetzt das Programm mit dem Taster anhalten will, muss ich diesen also mindestens 8 Sekunden gedrückt halten (ohne Kontaktproblem!), um die Schleife mit Sicherheit zu beenden.

Ich habe jetzt die vermutlich schwachsinnige Idee, das über Rest zu machen, da das laufende Programm dann sofort gestoppt wird.

Eure Meinung?

Bernhard

Ich habe einen gut funktionierenden Sketch

Nein, hast du nicht. Wenn du Taster oder Endschalter hast, darf loop keine Sekunde lang dauern.

Wenn du while Schleifen oder so in loop hast, und da auf ein ereignis wartest, ist das Falsch !

Müll. Lerne non blocking Code zu schreiben. Das ganze dürfte mit millis statt delay schon fast gelöst sein. Mehr gibt die Glaskugel gerade nicht her.

Hier könnte ihr Code stehen

Poste mal deinen Sketch. Dann Antworten die "üblichen" Verdächtigen auch vernünftig. ;)

Gruß DerDani

bastler3: Ich habe jetzt die vermutlich schwachsinnige Idee, das über Rest zu machen, da das laufende Programm dann sofort gestoppt wird.

Eure Meinung?

Im Prinzip kannst Du ein Programm auch durch einen Reset stoppen und von Anfang an neu starten.

Allerdings dauert das nach dem Drücken von Reset dann auch noch 2 Sekunden, bis das Programm wieder startet, weil vorher noch der Bootloader läuft.

Ich habe hier schon selbst Stoppuhr-Code gepostet, der mit zwei Lichtschranken und dem Reset-Taster funktioniert: Lichtschranke-1 startet die Stoppuhr, Lichtschranke-2 stoppt die Stoppuhr, und der Reset-Taster stellt alles auf Null zurück. Das war für eine Geschwindigkeitsmessung bei Hundewettbewerben und es spielte da keine Rolle, dass das Zeitmesssystem dann erst nach ca. 2 Sekunden wieder messbereit auf Null bereit zum nächsten Rennen war, nachdem der Bootloader gelaufen ist.

Aber für ein interaktives Programm kannst Du natürlich auch auf "delay()" und sämtliche anderen blockierenden Funktionen im Sketch verzichten und andere Buttons zur Bedienung vorsehen, so dass ein loop-Durchlauf nicht 8 Sekunden sondern Bruchteile einer Millisekunde dauert und der Button dann innerhalb von maximal einigen Millisekunden eine Aktion ausführt. Das ist alles eine Frage der Programmstruktur, Datenstrukturen und verwendeten Algorithmen.

Sind schon einige nette Zeitgenossen hier! Schön, dass es auch Antworten gibt, die sich der Sache annehmen.

Ich möchte gerne mal den mechanischen Müll sehen, den manche Heroen hier ggf. abliefern würden.

  1. Arduino ist für mich kein Selbstzweck, sondern ein notwendiges Übel, um mechanische Komponenten zu betreiben.

  2. Mein Programm macht alles exakt so, wie ich mir das vorgestellt habe, mit o.g. Ausnahme. Diese Situation kommt im Übrigen auch nicht regulär vor, sondern nur ausnahmsweise, z.B., wenn ich noch einen Fehler ausserhalb des Einflussbereiches des Arduino sehe und ich deshalb das laufende Programm abbrechen will.

  3. @jurs: 2 Sekunden Wartezeit bis zum Neustart stören nicht im Geringsten, da ein Abbruch ja bedeutet, dass ich vorher in ein Setup ( Licht, Objekt, Kamera ) eingreifen muss. Das dauert garantiert länger.

Bernhard

hi, bernhard,

das sind keine unfreundlichen antworten, auch wenn es manchmal so wirkt. du hast ja auch nicht pampig geantwortet, auch wenn es so gewirkt hat...

delays, die den mc blockieren, gelten einfach als äußerst unschön. und sie sind es in den meisten fällen auch.

dem arduino schadet es überhaupt nicht, wenn Du das programm über reset beendest, außer (was aber ohnehin nicht sein sollte) wenn Du einen verbraucher dran hast, der auf dauer zuviel strom am arduino zieht. wenn der also im programm nur sehr kurz an, nach einem reset aber nicht zuverlässig aus ist. wäre ein sonderfall, aber wer weiß.

außerdem mußt Du dann nach einem reset im setup dafür sorgen, daß alles, was am arduino hängt, wieder in einem definierten zustand ist.

gruß stefan

Hallo,

Du blockierst Dir also Deine loop mit mehreren while Schleifen, diese warten jeweils auf ein Ereignis bevor es zur nächsten while springt? Das ist schon blöd programmiert, mußte selbst zugeben. Denn dann tritt genau der Effekt ein den Du jetzt als Problem hast. Auf ein anderes Ereignis kann die loop nicht reagieren, weil sie sich in den while langweilt und nicht raus darf. Denn wenn z.Bsp. ein Endschalter defekt ist, wird Deine while Bedingung nie erfüllt. Der µC hat sich dann vermeintlich aufgehangen. Da müßte noch ein Timeout rein um sowas abzufangen.

Mit while mag das zwar einfacher zu programmieren sein, aber mit nachgelagerten Problemen wie du merkst. Wenn Du dich entschließen würdest mit millis zu arbeiten und if Abfragen, wird die loop permanent durchlaufen und Du kannst immer innerhalb von wenigen ms auf irgendwas reagieren.

Wenn Du das alles so lassen möchtest, dann kannst Du den Taster nur per Interrupt einbinden. Dann wird darauf sofort reagiert. Das Problem in der loop wird damit aber nicht gelöst, nur umgangen.

bastler3: Sind schon einige nette Zeitgenossen hier! Schön, dass es auch Antworten gibt, die sich der Sache annehmen.

Ich möchte gerne mal den mechanischen Müll sehen, den manche Heroen hier ggf. abliefern würden. ...

Hallo Bernhard Nicht das suchen, was andere schlecht machen, sondern versuchen selbst besser zu werden. Man könnte Dir viel effektiver helfen, wenn Du Sketch, Schaltplan, Foto und Aufbau geliefert hättest.

Das hier ist ein Forum mit netten Umgangston. Das was gesagt wurde ist vieleicht etwas schroff und soll Dich aufrütteln, ist aber nicht beleidigend.

Dein Sketch ist falsch programmiert (falsche Programmlogik). Darum von einigen als "Müll" bezeichnet.

Anstatt in while Schleifen auf Ereignisse ( Endschalter ecc) zu warten arbeite mit einer Statusvariablen. zB status=1 warten auf Endschalter1 status=2 warten bis temperatur x erreicht ist ecc

So läuft die loop()-Funktion immer und auch der Stop-Taster kann dauernd abgefragt werden und das Programm zu einem bestimmten Status zurückgesetzt werden.

Grüße Uwe

Ich habe jetzt die vermutlich schwachsinnige Idee, das über Rest zu machen, da das laufende Programm dann sofort gestoppt wird.

Eure Meinung?

Ich stimme dir zu!

  1. Arduino ist für mich kein Selbstzweck, sondern ein notwendiges Übel, um mechanische Komponenten zu betreiben.

Wenn man einen Arduino einsetzen möchte, ist das programmieren lernen eine Notwendigkeit. Ins Besondere, wenns keine fertigen Programme für deinen Zweck gibt.

  1. Mein Programm macht alles exakt so, wie ich mir das vorgestellt habe, mit o.g. Ausnahme. Diese Situation kommt im Übrigen auch nicht regulär vor, sondern nur ausnahmsweise, z.B., wenn ich noch einen Fehler ausserhalb des Einflussbereiches des Arduino sehe und ich deshalb das laufende Programm abbrechen will.

Aus Sicht des Anwenders mag das eine Ausnahme sein. Aus Sicht des Programmierers nicht. Es eine Bedienung, ein User Input, mehr nicht.

Dein Reset Vorhaben mag für deinen konkreten Fall gerade hinreichend sein, aber eine optimale Lösung ist es nicht. Unter anderem, weil du (und einige unbedarfte Mitleser) genau das Falsche lernst. Ein dirty Hack. Selbst den Hack kann man noch optimieren: Durch töten des Bootloader reduziert sich die Startzeit auf ein paar ms.

Es gibt ein Code-Design-Pattern welches zu 100% auf deine Anforderungen zugeschnitten ist. Der: "Endliche Automat"

Darüber hinaus, stimme ich den anderen zu: Der konsequente Verzicht auf langanhaltende Delays wird dich zum Erfolg führen.