Do while - Problem

OP #4778327
Lesenswert?

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??????
1
int Ref_Taste_X = 10;                                  
2
bool boolEinmalig = false;                  
3
//
4
void setup() 
5
{
6
  pinMode(Ref_Taste_X, INPUT_PULLUP);                                   
7

8
  Serial.begin(9600); 
9
 }                                                                                                             
10
//                                                                                                              
11
void loop() 
12
{                                                                               
13
  if (digitalRead(Ref_Taste_X) == HIGH && (boolEinmalig) == false)       
14
  {                                                                                                                 
15
    Serial.println("drin" );
16
    delay(2500);     
17
      do 
18
      {
19

20
      }  while (digitalRead(Ref_Taste_X) == LOW);              
21
  }   
22
  delay(2500);                                                                            
23
  Serial.println("raus" );                                       
24
  boolEinmalig = true;                     
25
}

--

Bitte für Quelltext die [ c ] [ /c ] - Tags verwenden. Dann ist das 
ganze besser lesbar.
-rufus
Angehängte Dateien:
Gast #4778339
Lesenswert?

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.
Gast #4778340
Lesenswert?

> 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
Gast #4778356
Lesenswert?

> 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

Kleiner Widerspruch.

HTH
OP #4778357
Lesenswert?

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
Gast #4778361
Lesenswert?

> 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
OP #4778376
Lesenswert?

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
Gast #4778405
Lesenswert?

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!
OP #4778424
Lesenswert?

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
#4778513
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren