Hallo zusammen,
ich habe ein Problem mit einer Whileabfrage.
Ich habe den Code schon soweit es ging gekürzt.
Der Code soll folgendes tun:
Es soll die Routine nur einmal kpl. durchlaufen werden, außer der Do -
While-Schleife!
Beim ersten Mal läuft das Programm in die Do - while-Schleife und soll
dabei solange darin bleiben, bis der Taster gedrückt wird.Mir ist klar,
das das mit den delays nicht gut ist, die kommen später raus aus dem
Code.
Ich stecke statt des Tasters deswegen einfach ein Kabel zwischen dem Pin
10 und GND.
Es passiert aber folgendes:
Ohne das dieser Tastereingang GND bekommt, läuft das Programm aus der
Do-While-Schleife raus und weiter. Es erscheint im seriellen Monitor:
drin raus raus raus..
Stecke ich das Kabel auf Pin 10 + GND und starte neu, läuft er
richtigerweise nicht durch diesen Zweig und druckt nur "raus".
Warum bleibt das Programm bei nicht angeschlossenem Kabel nicht in der
Do-While-Schleife??????
Hallo Michael,
wannliefer "digitalRead(Ref_Taste_X)" HIGH und wann LOW?
Und schaffst Du es, zwischen eintritt in die äußer Schleife und
Erreichen der inneren den Pegel zu wechseln?
Versuche es doch erstmal mit gleichem Pegel bei beiden.
> Warum bleibt das Programm bei nicht angeschlossenem Kabel nicht in der> Do-While-Schleife??????> if (digitalRead(Ref_Taste_X) == HIGH && (boolEinmalig) == false)
^^^^
> {
[..]
> do> {>> } while (digitalRead(Ref_Taste_X) == LOW);
^^^
HTH
> da das Kabel an Pin 10 nicht angeklemmt ist und der Eingang mit Pullup> auf high ist, darf das Programm doch nicht aus der Schleife!!
Doch. Ich formulier Dir mal vereinfacht um, was Du hingeschrieben hast:
1
falls:
2
Ref_Taste_X ist offen
3
dann:
4
mach eine Pause solange Ref_Taste_X geschlossen ist
Hallo Achim,
wannliefer "digitalRead(Ref_Taste_X)" HIGH und wann LOW?
Die Taste ist mit Pullup auf High und wird nur wenn ich das Kabel
anklemme auf LOW gehen.
Deswegen verstehe ich ja nicht, wenn ich das Kabel nicht anklemme, das
das Programm aus der do-whlie einfach weiterläuft...
Michael
> Deswegen verstehe ich ja nicht, wenn ich das Kabel nicht anklemme, das> das Programm aus der do-whlie einfach weiterläuft...
Die Bedingung, die Du angegeben hast, lautet "mach Pause solange die
Taste ∗geschlossen∗ ist". Was Du augenscheinlich haben willst ist "mach
Pause solange die Taste ∗offen∗ ist"
EOD
Hi g457,
okay.
Wie muß ich es denn schreiben, wenn ich es so will:
Beim Start des Programmes soll nur wenn der Taster High ist UND
boolEinmalig false ist in die do-while-Schleife gelaufen werden.
Dort soll das Programm solange in der do-while-Schleife bleiben, bis der
Taster (im Moment ein Kurzschlußkabel) LOW bekommt.
Wenn dieser LOW ist wird die Variable boolEinmalig auf True gesetzt und
dieser kpl. Programmteil wird nie wieder durchlaufen..
Michael
Nöö, ich nicht...
Verstehe auch deinen Code nicht.
Denn, würde es wohl anders angehen.
Du willst einen Ablauf konstruieren.
Dann nenne es auch Ablaufsteuerung, oder Schrittkette.
Oder einen "einfachen endlichen Automaten".
Einen Zustandsautomaten/Zustandsmaschine.
Genug Stichworte für Google?
Auch wichtig: Entprellen!
Hi Arduino Fanboy,
danke für deine Vorschlagliste, doch habe das Problem gelöst.
g457 hatte die Lösung:
> } while (digitalRead(Ref_Taste_X) == LOW);
^^^
Ich habe gedacht, das hinter While die Bedingung stehen muss, um die
Schleife zu verlassen.
Dabei ist das genau anders rum.
Viel Dank für die Tipps und die Lösung.
Michael
Michael L. schrieb:> Ich habe gedacht, das hinter While die Bedingung stehen muss, um die> Schleife zu verlassen. Dabei ist das genau anders rum.
Hm, so schwer ist es ja eigentlich nicht, die englischen Schlüsselworte
ins deutsche zu übersetzen:
Do
{irgendwas}
while
{diese Bedingung erfüllt ist}
lautet in deutsch:
mache
{irgendwas}
solange
{diese Bedingung erfüllt ist}
und sofort wenn "diese Bedingung nicht (mehr) erfüllt ist" springt die
do ... while Schleife aus der unendlichen Schleifendurchführung heraus.
und nun prüfe deinen Code noch mal, wann die Bedingung gegeben ist, und
wann nicht.
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang