Mehrfachausführung von Code

Hallo,

der nachfolgende Code soll 1x die Funktion Kalibrierung() und 4x die Funktionen CuneiformTablet() und BewegungenFlachseite() ausführen.
Jetzt bricht er aber nach dem zweiten CuneiformTablet() ab obwohl die Zustände korrekt scheinen.

Kalibrierung_Done ==1,
Ende_Tablet_Y_Achse_bekannt ==1,
X_move_positiv ==1,

Hat jemand einen Tip?
Vielen Dank

ASPEAK.txt (48.3 KB)

Hallo, ich habe den Code nur kurz überflogen - aber die Zuweisung "Kalibrierung_Done = true" erfolgt nur ein einziges Mal, und zwar in diesem Bereich:

// endstops
if (digitalRead(Z_MIN_PIN_ENDSTOP) == LOW)
   {
     digitalWrite(statusLed, HIGH);
     Serial.println("X-Achse-Endstop reached! Terminate ...");
     runZ_Achse = false;
     Z_AchseInitialized = false;
     Z_Achse.setCurrentPosition(0); // set 0 position
     Kalibrierung_Done = true;
     //Serial.end();
   }

Möglicherweise erkennt er diesen Zustand nicht - und stoppt aus diesem Grund niemals die Kalibrierung... Ich würde diese Stelle mal genauer prüfen.

Hallo, vielen Dank.

Die Reihenfolge ist: Kalibrierung() dann CuneiformTablet() und dann BewegungenFlachseite(). Kalibrierung() brauche ich nur ein mal (deshalb reicht auch ein mal true), danach sollen CuneiformTablet() und BewegungenFlachseite() 4x ausgeführt werden.

  1. Kalibrierung,
  2. Cuneiformtablet(),
  3. BewegungenFlachseite(),

  4. Cuneiformtablet(), Hier bleiben die Motoren stehen.

  5. BewegungenFlachseite(),

  6. Cuneiformtablet(),

  7. BewegungenFlachseite(),

  8. Cuneiformtablet(),

  9. BewegungenFlachseite(),

Mag ja alles sein, aber wenn der Zustand

if (digitalRead(Z_MIN_PIN_ENDSTOP) == LOW)

nicht erreicht wird (aus welchem Grund auch immer) wird die Kalibrierung nie auf TRUE gesetzt - und somit bekommt dein Progi falsche Informationen.

Ist aber auch nur eine erste spontane Idee, evtl. liegt der Bock noch ganz woanders, wo man ihn nicht so schnell entdeckt.

Mhhh... :confused:

Der Zustand wird erreicht, ich habe am Ende der Kalibrierung ein (KalibrierungDone == true). Dort zickt nix rum.

Der Bock liegt woanders.... :o . Trotzdem vielen Dank...

Ich habe da einen Verdacht :slight_smile: .

Im ersten Durchgang wechselt previousHold zwischen “0” und “aktueller Zeit” wobei die Werte inkrementieren.(BewegungenFlachseichte_1.PNG)

im zweiten Durchgang bleibt der Wert gleich.(BewegungenFlachseichte_2.PNG )

Aber warum ist das so?

Aber warum ist das so?

Eine gute Frage, gibt es davon noch mehr? ;)

Im Ernst, vielleicht eine falsche (oder fehlende) Zuweisung an irgend eine Variable? In solchen Fällen gehe ich hin und kommentiere solche Blöcke ausführlicher als sonst, ist zwar lästig, aber manchmal dämmert es einem - und die Schuppen fallen von den Augen.

Was mir gerade aufgefallen ist: In dem mit "### Problem ###" gekennzeichneten Bereich ist ein "else" mehr drin als in den nachfolgenden Case-Blöcken ?!? Passt das zusammen ?!? Sieht aus als wenn sich die logische Struktur "verschiebt".

@RudiDL5: Schlecht Fragen konnte ich schon immer gut :) .

Was mir gerade aufgefallen ist: In dem mit "### Problem ###" gekennzeichneten Bereich ist ein "else" mehr drin als in den nachfolgenden Case-Blöcken ?!? Passt das zusammen ?!? Sieht aus als wenn sich die logische Struktur "verschiebt".

Der Code funktioniert so ganz gut. Es gibt noch etliche Sachen die gemacht werden müssen, aber es funktioniert. Zumindest bis zum Ende der ersten Runde. Danach wird PositionHold mein Problem. Ich habe keine Idee, warum PositionHold in der zweiten Runde immer einfriert und in der ersten Runde nicht.

Somewhere\CuneiformTablet\CuneiformTablet.ino: In function 'void BewegungenFlachseite()':

Somewhere\CuneiformTablet\CuneiformTablet.ino:1087:240: warning: suggest braces around empty body in an 'if' statement [-Wempty-body]

         if ((Edge_positiv_up == true && mitte_filtered > 120 && links_filtered - 3 > rechts_filtered) || (Edge_positiv_up == true && links_filtered - 3 > rechts_filtered) || (Edge_positiv_up == true && links_filtered - 3 > mitte_filtered)); //

                                                                                                                                                                                                                                                ^
Somewhere\CuneiformTablet\CuneiformTablet.ino:1131:172: warning: suggest braces around empty body in an 'if' statement [-Wempty-body]

         if ((Edge_negativ_up == true && mitte_filtered > 120 && rechts_filtered - 3 > links_filtered) || (Edge_negativ_up == true && rechts_filtered - 3 > links_filtered));// || (Edge_positiv_up == true && rechts_filtered - 3 > mitte_filtered));

Komplizierte Ausdrücke um die Ausführung von nichts ( ; ) zu steuern. :wink:

AlleWarnungen.png

Hallo Whandall,

meine Compiler-Warnungen waren auf "keine" eingestellt. Super Tip (schäm :confused: ):

Komplizierte Ausdrücke um die Ausführung von nichts ( ; ) zu steuern. ;)

Und jetzt funktioniert auch die zweite Runde...

Danke, danke danke.... :)

Mit deinen ellenlangen Zeilen trägst du dazu bei, solche Fehler zu verstecken. :wink:
Davon ist wirklich abzuraten.

Ohne den Compiler hätte ich das auch nicht so schnell gefunden.

Standardmäßig die Warnungen abzuschalten ist eine falsche Entscheidung des Arduino-Teams. IMHO

Du hast in der loop() ständig einen Aufruf von Kalibrierung(); dort passiert folgendes:

void Kalibrierung()
{
  Serial.begin(115200);
  //Schmalseite_1 = true;     //???????????Löschen????
  static int state = KameraAufrichten;

  switch (state)

=> "state" ist immer auf "KameraAufrichten"....

hajos118: => "state" ist immer auf "KameraAufrichten"....

Nein, denn eine static-Variable wird nur einmal initiiert und nicht bei jedem Aufruf.