mikrocontroller.net

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


Autor: Beuth (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe ein Problem mit while-Schleife innerhalb eine endlose 
while-Schleife
while (1) {
 ...
 sharp = distance(AD1);
 i=0;
 while (sharp > 3.6 && sharp < 12.1) {
      
   P83 = 1;
   wait_10ms(i);

   i+=5;
   sharp = distance(AD1);
   if (i<20) {
     P80=0; P81=0; P81=0; P82=0; 
   } else {
     if (i < 40) {
        P80 = 1; P81 = 0; P82 = 0; P83 = 0;
     } else {
  if (i < 55) {
    P80 = 0; P81 = 1; P82 = 0; P83 = 0; 
  } else {
    P80 = 0; P81 = 0; P82 = 1; P83 = 0;
  }
     }
   } 
 }
 ...
}

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.

Autor: Robert K. (molch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
warum machst du nach deinem else eine geschweifte Klammer?
if (i<20) {
      P80=0; P81=0; P81=0; P82=0;
    } else {
      if (i < 40) {
         P80 = 1; P81 = 0; P82 = 0; P83 = 0;
      } else {
   if (i < 55) {
     P80 = 0; P81 = 1; P82 = 0; P83 = 0;
   } else {
     P80 = 0; P81 = 0; P82 = 1; P83 = 0;
   }

Ä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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
  while (1) {
    ...
    sharp = distance(AD1);
    i = 0;
    while (sharp > 3.6 && sharp < 12.1) {
      P83 = 1;
      wait_10ms(i);

      i += 5;
      sharp = distance( AD1 );

      if( i >= 20 )
         P83 = 0;
    }

    if (i < 20) {
      P80 = 0;
      P81 = 0;
      P82 = 0; 
    }
    else if (i < 40) {
      P80 = 1;
      P81 = 0;
      P82 = 0;
    }
    else if (i < 55) {
      P80 = 0;
      P81 = 1;
      P82 = 0; 
    }
    else {
      P80 = 0;
      P81 = 0;
      P82 = 1;
    }
  }


Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Fehler liegt fast immer an der Stelle:

Beuth schrieb:
>  ...

Autor: Beuth (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Robert K.
es war einen Schreibfehler.
      } else {
         if (i < 55) {
           P80 = 0; P81 = 1; P82 = 0; P83 = 0;
         } else {
           P80 = 0; P81 = 0; P82 = 1; P83 = 0;
         }
      }

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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.