Suche den Fehler in While...

Sorry... Wo ist hier der Fehler? Ich möchte einen Schrittmotor so lange fahren lassen, bis zecho unter bzw = 40 ist.

if (quickmode==4)
{
  while(zecho >= 40)
  {
      stepper.setSpeed(600);
      stepper.runSpeed();
  }
  stepper.setSpeed(0);
  stepper.setCurrentPosition(0);
  Serial.println("Homed");
  quickmode=1;
}

Was passiert momentan? Der Motor fährt zwar los, hält aber nicht mehr an, obwohl zecho unter 40 ist.

Der Fehler ist meistens while überhaupt zu verwenden :stuck_out_tongue:

Die Schleifenvariable in der Schleife mal zu verändern hilft auch

Ich habs mittlerweile mal so versucht...

if (quickmode==4)
{
  if(zecho >= 41)
  {
  stepper.setSpeed(600);
  stepper.runSpeed();
  }

 if(zecho<= 40)
  {
  stepper.setSpeed(0);
  stepper.runSpeed();
  stepper.setCurrentPosition(0);
  Serial.println("Homed");
  quickmode=1;
  }

}

tut sich trotzdem nix außer das der Motor vorwärts läuft.

Weil du die Variable "zecho" nicht änderst.
Das hatte dir Serenifly auch schon geschrieben.

Was ist denn dein ominöses 'zecho'? Das wird in den gezeigten Auschnitten ja garnicht verändert. Wie soll sich da bei der Abfrage was ändern?
Mit solchen Fragmenten kann man nichts anfangen.

Auuuuuuu^^

Gut alles klar... Habt Ihr recht. Hab den Code oben nochmal kontrolliert. Ich bin nie in quickmode 4 gewesen sondern in quickmode 3. Macht nix anderes als Motor drehen... Hab ich oben nicht geändert. So was blödes.

Und stimmt demnächst am Besten den ganzen Code... zecho ist der input eines Ultraschallsensors.

mrzortrax:
Ich habs mittlerweile mal so versucht...

Als was hast Du denn zecho definiert?
Warum kommst Du nur mit einem Bruchstück, der nicht aussagekräftig ist?
Was passiert sonst mit den variablen quickmode und zecho?

Ich hätte das <=40 als else gebaut
Das wäre dann evtl. die Lösung für meine erste Frage.

if (quickmode == 4)
  {
  if (zecho >= 41)
    {
    stepper.setSpeed(600);
    stepper.runSpeed();
    }
  else
    {
    stepper.setSpeed(0);
    stepper.runSpeed();
    stepper.setCurrentPosition(0);
    Serial.println("Homed");
    quickmode = 1;
    }

mrzortrax:
Auuuuuuu^^

Gut alles klar... Habt Ihr recht. Hab den Code oben nochmal kontrolliert. Ich bin nie in quickmode 4 gewesen sondern in quickmode 3. Macht nix anderes als Motor drehen... Hab ich oben nicht geändert. So was blödes.

Und stimmt demnächst am Besten den ganzen Code... zecho ist der input eines Ultraschallsensors.

Und was heißt das jetzt genau ?

Fehler gefunden ?

mrzortrax:
Und stimmt demnächst am Besten den ganzen Code... zecho ist der input eines Ultraschallsensors.

Rein aus Interesse: Erzähl mal was Du bauen willst
Abstandmessung auf der z-achse hört sich nach 3D an - für nen Drucker aber zu ungenau....

mrzortrax:
Auuuuuuu^^

Gut alles klar... Habt Ihr recht. Hab den Code oben nochmal kontrolliert. Ich bin nie in quickmode 4 gewesen sondern in quickmode 3. Macht nix anderes als Motor drehen... Hab ich oben nicht geändert. So was blödes.

Und stimmt demnächst am Besten den ganzen Code... zecho ist der input eines Ultraschallsensors.

Was hat quickmode mit zecho zu tun?

Das While ist wie wenn Du mit Deinem Freund ausmachst, daß er Dich anruft um Dich abzuholen aber Du Dein Händy nicht mit hast.

Grüße Uwe

Hallo,
@Uwe,
kannst Du nicht mal mit den Entwicklern des Compilers reden , Sie sollen eine Warung für while generieren:

"Willst du wirklich "while" einsetzten "if" is oft besser geeignet" :wink:

Heinz

Es gibt durchaus sinnvolle Anwendungen für while und der GCC ist kein Arduino-Compiler (er wird nur am Rande dafür genutzt).

Gruß Tommy

While ist eine Kontrollstruktur wie viele andere.
Das Problem ist wenn man es falsch verwendet.

Es passiert bei IF seltener aber der TO hat es zusammengebracht den gleichen Fehler mit if nachzuahmen.

Wenn eine Variable auf einen bestimmten Wert / Bereich/Grenzwert kontrolliert wird, diese aber nicht neu eingelesen oder nie verändert wird, wird while zu einer Endlosschleife. Das ist dann ein Programmierfehler wie viele andere.

Soll ich etwa auch fragen ob "==" abzuschaffen, ist weil Anfänger "==" mit "=" verwechseln und darum if Bedingungen nicht funktionieren.

Der Compiler den die Arduino IDE verwendet ist der Compiler der vom Hersteller des ATmega bereitgestellt wird, um die Controller zu programmieren. Nein, ich weiß nicht mit wem ich bei Microchip Technology reden kann. Ich glaube die würden mich auch auslachen wenn ich jetzt nach fast 50 Jahren von einem Problem mit while diskutieren möchte. (C wurde 1972 erfunden).

Sie sollen eine Warung für while generieren:

 while(zecho >= 40)
  {

ist ein syntaktisch korrekte Anwendung von while.

eine andere Endlosschleife ist:
for( ; ; )
auch for (int a=0; a<2;)
ist syntaktisch richtig.

Grüße Uwe

Soll ich etwa auch fragen ob "==" abzuschaffen, ist weil Anfänger "==" mit "=" verwechseln und darum if Bedingungen nicht funktionieren.

Ein = in einem If wirft eine Warnung, wenn der Compiler sensibel eingestellt wird.
(das finde ich schon nervig genug, wenn es denn Absicht ist)

combie:
Ein = in einem If wirft eine Warnung, wenn der Compiler sensibel eingestellt wird.

Vielleicht eine ganz blöde Frage, aber rein Interesse halber:
Gibt es keine Möglichkeit im Code dem Compiler mitzuteilen, das - für diesen speziellen Teil - keine Warnungen ausgegeben werden sollen?
Ähnlich der indent-Switches im Style, die das Formatieren abschalten?

Vielleicht eine ganz blöde Frage, aber rein Interesse halber:

Einfach mal die Warnung lesen, da steht die Lösung drin!

warning: suggest parentheses around assignment used as truth value [-Wparentheses]

Beispiel:

if(a=1) ; // wirft Warnung
if((a=1)) ; // stumm

Gibt es keine Möglichkeit im Code dem Compiler mitzuteilen, das - für diesen speziellen Teil - keine Warnungen ausgegeben werden sollen?

Ja!
Über #pragma kundig machen

combie:
Über #pragma kundig machen

Danke!

Nachtrag:
wer das "ichbinaberkeinenglishman" mit den Styles irgendwie begriffen hat, bekommt auch das hin

sich da durchzuwurschteln.

Ich habe demnächst Lesestoff - nicht um zu wissen wie es geht, sondern um ggfls. nachschlagen zu können.

Nochmals Danke.

void setup()
{

  int a{0};

  if (a = 1) ; // wirft 2 Warnungen

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wempty-body"

  if (a = 1) ; // wirft 1 Warnung

  if ((a = 1)) ; // stumm

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wparentheses"
  if (a = 1) ; // stumm
#pragma GCC diagnostic pop

#pragma GCC diagnostic push
#pragma GCC diagnostic error "-Wparentheses"
  if (a = 1) ; // error
#pragma GCC diagnostic pop

#pragma GCC diagnostic pop


}

void loop()
{

}

Nochmal zum "Was ich damit mache"

Wär soweit richtig. Für 3D Drucker Anwendung zu ungenau. Wird eine Aushärtungseinheit für mit UV Harz gedruckte 3D Objekte. :wink: Aber halb gut geraten.

Und der Sensor misst den Abstand zwischen der Decke und dem Tisch. Für die Zwecke sollte das ausreichen. Ggf geht das mit Infrarot auch. Ich versuchs erstmal so. Zwei weitere Sensoren sollen dann in der horizontalen die Objekte auf dem Tisch erkennen wenn der Abstand zur Decke zu knapp wird.

mal sehn^^

Aber: Doch manchmal kommen warum auch immer auf einmal Falschmessungen vom Ultraschallsensor zurück. Meist nur kurz aber diese Fehlmessungen muss ich irgendwie aussortieren... Jemand eine Idee wie ich das schnell und ohne mega Programmieraufwand bewerkstelligen kann?

Hatte die Idee vielleicht aus 20 Messungen einen Mittelwert zu ziehen, oder Messwerte die auf einmal über einen gewissen Prozentsatz zum vorherigen fallen oder steigen zu ignorieren. Da allerdings die Frage das können manchmal schon einige Fehlmessungen am Stück sein. Die dann "meist" zu nah dran sind. Müsste ich höchstens dann mal beobachten, wenn ich den Sensor dort verbaut habe wo er sein soll anstatt neben den Tisch liegen zu haben.