Timerersatz funktioniert nicht

Ich bin schon etwas verzweifelt:
Es sollen vier Schrittmotoren angesteuert werden, die möglichst synchron eine Hebebühne bilden sollen. Dazu verwende ich die MobaTools Library. Interessant wird auch der noch nicht gelöste Teil der Balance-Software für die vier Schrittmotoren und einem MPU6050 Gyrosensor. Hat auf einem MKS Gen 1.4 schon recht gut funktioniert --- bis ich die Platine mit einem herumhängenden Kabel zerstörte :grimacing:
Jetzt fange ich grad wieder neu an.....
Diesesmal versuche ich es auf einem Arduino Mega 2560 mit Huckepack CNC Shield und TMC2290 Treibern. Die Serielle Ansteuerung der TMC2290 habe ich mal auf ein anderes Projekt verschoben. Ich fahre quasi im A4988 Emulationsmodus (dir/step).
Die Motoren laufen zwar langsamer als mit A4988, aber das liegt wahrscheinlich an der Stepper-Auflösung. Schrittmotoren laufen sehr ruhig..
Mein (für mich Mega) Problem:
ich wollte zum Testen einfach die vier Motoren mit dem "Timerersatz" (if(millis() > oldTime + wtime ) ....) einfach hin und her bewegen.
Der Timerersatz geht partout nicht :tired_face:
Aktuell verwende ich diesen absolut kurzen Code ohne irgendwelche Ansteuerung der Motoren. Es geht nur um die Timerfunktion:

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  int direction = -1;  // Initialrichtung der Schrittmotoren
  unsigned long wtime = 1000; // jede Sekunde reicht auch 
  unsigned long oldTime=0;  // Vergleichwert für millis
    if(millis() > oldTime + wtime ) {     // eine Sekunde vorbei ? 
      oldTime = millis(); 
      direction = direction * -1;  // Richtungswechsel der Motoren MobaTools
      Serial.print("direction/oldtime/millis/time: ");
      Serial.print(direction);
      Serial.print("/");
      Serial.print(oldTime);
      Serial.print("/");    
      Serial.print(millis());
      Serial.print("/");
      Serial.println(wtime);
    } 
}

und das liefert die Konsole:
00:10:28.795 -> direction/oldtime/millis/time: 1/891151/891193/1000
00:10:28.861 -> direction/oldtime/millis/time: 1/891206/891248/1000
00:10:28.928 -> direction/oldtime/millis/time: 1/891261/891302/1000
00:10:28.961 -> direction/oldtime/millis/time: 1/891317/891358/1000
00:10:29.027 -> direction/oldtime/millis/time: 1/891372/891413/1000
00:10:29.094 -> direction/oldtime/millis/time: 1/891426/891468/1000
00:10:29.127 -> direction/oldtime/millis/time: 1/891482/891524/1000
00:10:29.193 -> direction/oldtime/millis/time: 1/891537/891579/1000
00:10:29.260 -> direction/oldtime/millis/time: 1/891592/891633/1000
usw.
Es wird als genau einmal die direction umgekehrt (von -1 auf 1), dann nie wieder ?? Warum?
Obwohl die If Bedingung nur alle 1000ms anspringen dürfte, durchläuft der Rechner jedesmal den Schleifenkörper..... ?? versteh ich nicht.

Ich vermute schon fast einen defekt meines MEGA, habe aber in meinem provisorischen Bastelraum keinen Ersatz, da ich dummerweise in Covid Quarantäne bin und nicht rausdarf.

Vielleicht springt grad ein Virus in mir hin und her und verblendet meine Sicht.

Kann mir wer von euch helfen??
danke im Voraus
Kris

Das ist sind lokale Variablen die am Ende der Funktion aufhört zu existieren. Nur wenn du die static deklarierst behalten sie ihren Wert

Außerdem solltest du "millis() - oldTime >= interval" machen

1 Like

Guten Morgen!

Ein Versuch:

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop()
{
  // put your main code here, to run repeatedly:
  int direction = -1;  // Initialrichtung der Schrittmotoren
  const unsigned long wtime = 1000; // jede Sekunde reicht auch
  static unsigned long oldTime = 0; // Vergleichwert für millis
  if (millis() - oldTime >= wtime )      // eine Sekunde vorbei ?
  {
    oldTime += wtime;
    direction = direction * -1;  // Richtungswechsel der Motoren MobaTools
    Serial.print("direction/oldtime/millis/time: ");
    Serial.print(direction);
    Serial.print("/");
    Serial.print(oldTime);
    Serial.print("/");
    Serial.print(millis());
    Serial.print("/");
    Serial.println(wtime);
  }
}
1 Like

Ja: "Gültigkeitsbereiche von Variablen und Konstanten" war glaub ich das Thema :sunglasses:
Hab jetzt die Variablen so definiert:

  static int direction = -1; 
  const unsigned long wtime = 1000; // jede Sekunde reicht auch 
  static unsigned long oldTime=0;

und schon klappt es:
01:00:39.817 -> direction/oldtime/millis/time: -1/224230/224230/1000
01:00:40.812 -> direction/oldtime/millis/time: 1/225231/225231/1000
01:00:41.807 -> direction/oldtime/millis/time: -1/226232/226232/1000
01:00:42.803 -> direction/oldtime/millis/time: 1/227233/227233/1000

Danke für die prompte Antwort !!!!
gute Nacht

Kris

1 Like

Ach der auch noch.. :wink:

Gerne - machste den noch zu?
Danke!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.