Forum: Mikrocontroller und Digitale Elektronik while schleife innerhalb endloser while schleife


von Beuth (Gast)


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.

von Robert K. (molch) Benutzerseite


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

von Karl H. (kbuchegg)


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
  }

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Der Fehler liegt fast immer an der Stelle:

Beuth schrieb:
>  ...

von Beuth (Gast)


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

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.