Forum: Mikrocontroller und Digitale Elektronik Do while - Problem


von Michael L. (looser13)


Angehängte Dateien:

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

: Bearbeitet durch User
von A. S. (Gast)


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.

von g457 (Gast)


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

von A. S. (Gast)


Lesenswert?

Und bei == und && in einer Zeile immer klammern! (hier aber kein 
Problem, sieht nur komisch aus bei "&& (boolEinmalig) == false)"

von Michael L. (looser13)


Lesenswert?

Hi g457,

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!!

Michael

von Michael L. (looser13)


Lesenswert?

Hi Achim S.

wie meinst du das.
Könntest du es richtig schreiben??

Danke schon mal.
Gruß

von g457 (Gast)


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

von Michael L. (looser13)


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

von g457 (Gast)


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

von Michael L. (looser13)


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

von Michael L. (looser13)


Lesenswert?

Hallo,

keiner eine Idee woran es liegen könnte????

Gruß

von Einer K. (Gast)


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!

von Michael L. (looser13)


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

von Wegstaben V. (wegstabenverbuchsler)


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.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Michael L. schrieb:
> Ich habe gedacht, das hinter While die Bedingung stehen muss, um die
> Schleife zu verlassen.

Dann nimm doch einfach do/until:
1
#define until(x) while(!(x))
2
3
void foo( void )
4
{
5
  do{
6
    PORTB++;
7
  }until( PORTB & 1<<7 );
8
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.