while schleife innerhalb endloser while schleife

Gast #1251697
Lesenswert?

Ich habe ein Problem mit while-Schleife innerhalb eine endlose 
while-Schleife
1
while (1) {
2
 ...
3
 sharp = distance(AD1);
4
 i=0;
5
 while (sharp > 3.6 && sharp < 12.1) {
6
      
7
   P83 = 1;
8
   wait_10ms(i);
9

10
   i+=5;
11
   sharp = distance(AD1);
12
   if (i<20) {
13
     P80=0; P81=0; P81=0; P82=0; 
14
   } else {
15
     if (i < 40) {
16
        P80 = 1; P81 = 0; P82 = 0; P83 = 0;
17
     } else {
18
  if (i < 55) {
19
    P80 = 0; P81 = 1; P82 = 0; P83 = 0; 
20
  } else {
21
    P80 = 0; P81 = 0; P82 = 1; P83 = 0;
22
  }
23
     }
24
   } 
25
 }
26
 ...
27
}

Ich möchte alle if-Anweisung ausserhalb der while-Schleife verschieben, 
aber dieser Code gibt keine Ausgabe an Ports.
Wo liegt der Fehler?

Danke für die Hilfe.
Persönliche Seite #1251704
Lesenswert?

Hi,
warum machst du nach deinem else eine geschweifte Klammer?
1
if (i<20) {
2
      P80=0; P81=0; P81=0; P82=0;
3
    } else {
4
      if (i < 40) {
5
         P80 = 1; P81 = 0; P82 = 0; P83 = 0;
6
      } else {
7
   if (i < 55) {
8
     P80 = 0; P81 = 1; P82 = 0; P83 = 0;
9
   } else {
10
     P80 = 0; P81 = 0; P82 = 1; P83 = 0;
11
   }

Ändert in diesem Beispiel an der Logik des Ausdrucks nichts aber ein 
else if finde ich besser lesbar.

Ansonsten: Kompletten Code posten!
Hast du Pxx auch auf Ausgang gesetzt?

Grüße
#1251711
Lesenswert?

Beuth schrieb:

Ich geh mal davon aus, dass die Zuweisungen an P80, P81, P82 und P83 die 
Portausgaben sind.

> Ich möchte alle if-Anweisung ausserhalb der while-Schleife verschieben,

Wozu?
Der ganze if-else if Block dient nur dazu, den Messvorgang an den 
Portpins P80, P81 und P82 nach aussen zu transportieren. Wenn du den aus 
der Schleife rausziehst, kannst du ihn auch gleich löschen, weil er dann 
keine Funktion mehr erfüllt.

Edit:
OK, keine Funktion ist übertrieben. Er kann dann immer noch die Funktion 
erfüllen, über die Portpins zu dokumentieren wieviele 
Schleifendurchgänge notwendig waren, bis die Schleife verlassen wurde, 
sofern sie überhaupt mal verlassen wird
1
  while (1) {
2
    ...
3
    sharp = distance(AD1);
4
    i = 0;
5
    while (sharp > 3.6 && sharp < 12.1) {
6
      P83 = 1;
7
      wait_10ms(i);
8

9
      i += 5;
10
      sharp = distance( AD1 );
11

12
      if( i >= 20 )
13
         P83 = 0;
14
    }
15

16
    if (i < 20) {
17
      P80 = 0;
18
      P81 = 0;
19
      P82 = 0; 
20
    }
21
    else if (i < 40) {
22
      P80 = 1;
23
      P81 = 0;
24
      P82 = 0;
25
    }
26
    else if (i < 55) {
27
      P80 = 0;
28
      P81 = 1;
29
      P82 = 0; 
30
    }
31
    else {
32
      P80 = 0;
33
      P81 = 0;
34
      P82 = 1;
35
    }
36
  }
Gast #1252733
Lesenswert?

Hallo,

@Robert K.
es war einen Schreibfehler.
1
      } else {
2
         if (i < 55) {
3
           P80 = 0; P81 = 1; P82 = 0; P83 = 0;
4
         } else {
5
           P80 = 0; P81 = 0; P82 = 1; P83 = 0;
6
         }
7
      }
So sollte es sein.

Wenn diese If-Anweisung innerhalb in while-Schleife liegt, läuft das 
ganze Programm eigentlich fehlerfrei.
Aber diese Ausgänge sind mit einem Roboterarm angeschlossen, und möchte 
nur den letzten Wert von i überprüfen.
z.B: wenn i = 45 ist, möchte ich direkt P81=1 am Ausgang ausgeben, nicht 
erstmal P80=1, dann P81=1.
Versteht Ihr, was ich meinte?
Durch die Kodierung ist 3 unterschiedliche Greifpositionen programmiert:
P80=1 od. P81=1 od. P82=1

@Karl heinz Buchegger
Wenn P83=1 ist, beginnt das Hauptprogramm von dem Roboter.
Danke für die Korrektur.

Ich würde die Code mit else if verbessern, wie Ihr vorgeschlagen hast

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