Forum: Mikrocontroller und Digitale Elektronik Do while - Problem


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Michael L. (looser13)


Angehängte Dateien:
  • preview image for 1.JPG
    1.JPG
    10,7 KB, 235 Downloads

Bewertung
-1 lesenswert
nicht 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 Moderator
von A. S. (achs)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (achs)


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

: Bearbeitet durch User
von Michael L. (looser13)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Hi Achim S.

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

Danke schon mal.
Gruß

von g457 (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruß

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht 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!

: Bearbeitet durch User
von Michael L. (looser13)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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
}

Antwort schreiben

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

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.