Ansteuerung von Steppermotoren, nach Ausführung einer Funktion hält der Motor an

Ich versuchen einen Floppotron zu bauen. Und trotzdem es dafür fertige Programme gibt versuche ich das alles selbst zu bauen und zu programmieren. Bis jetzt konnte ich mit einem einzigen Floppy Driver(von jetzt an nur noch FD) "Alle meine Entchen" spielen. Jetzt habe ich angefangen 4 FD's (0 - 3) aufzubauen und zu verbinden. Das Problem, nach der ersten run() Funktion (individuelle Deklaration) stoppt das Programm einfach vollständig und es ist zumindest für mich nicht ersichtlich, warum. Vom Dynamischen Speicher sind noch 98% / 2007 Bytes frei.
void setup() {

  //Deklarationen für ~~~
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);  FD0
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);  FD1
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);  FD2
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);  FD3

  digitalWrite(2,LOW);  FD0
  digitalWrite(4,LOW);  FD1
  digitalWrite(6,LOW);  FD2
  digitalWrite(8,LOW);  FD3
}

boolean dir[4] = {false,false,false,false};     Array für die Fahrtrichtung des Lesekopfes (false)=vorwärts und (true)=zurück
boolean mov[4] = {true, true, true, true};
int dit[4] = {0,0,0,0};     Array für die Zählung der Bereits gemachten Steps
int pse = 30;                 Variable für die Pause zwischen den Noten(!) in ms
int sd[4] = {8,8,8,8};     Array für die Delays, auf die die Durchlaufdelays nach Ablauf zurückgestzt 
                                  werden
int rd[4] = {8,8,8,8};     Array für die Durchlaufdelays(running delay = rd). Rd's werden in jeder ms 
                                  um einen verringert, wird null erreicht, so wird ein Step gemacht

void direc(int i){            Methode zur Richtungsänderung -ANFANG-
  if(dit[i] == 80){          Abfrage, ob die maximale Anzahl an Steps erreicht wurde
    if(dir[i] == false){     Abfrage, in welche Richtung, sich der LK bisher bewegte und wechsel in die entgegengestzte Richtung
      digitalWrite((i+1)*2,HIGH);
      dir[i] = true;
      dir[i] = 0;
    }
    else{
      digitalWrite((i+1)*2,LOW);
      dir[i] =  false;
      dit[i] = 0;
    }
  }
  return;
}   Methode zur Richtungsänderung -ENDE-

void fd(int drive,char t){   Methode zur Tonzuweisung der FD's -ANFANG-
  switch(t){
    case 'c':
    sd[drive] = 15;
    mov[drive] = true;
    break;
    case 'd':
    sd[drive] = 14;
    mov[drive] = true;
    break;
    case 'e':
    sd[drive] = 12;
    mov[drive] = true;
    break;
    case 'f':
    sd[drive] = 11;
    mov[drive] = true;
    break;
    case 'g':
    sd[drive] = 10;
    mov[drive] = true;
    break;
    case 'a':
    sd[drive] = 9;
    mov[drive] = true;
    break;
    case 'b':
    sd[drive] = 8;
    mov[drive] = true;
    break;
    case 'n':
    mov[drive] = false;
    break;
    default:
    //Fehlermeldung
    break;
  }
  rd[drive] = sd[drive];
  return;
}  Methode zur Tonzuweisung der FD's -ENDE-

void run(int duration){
  for(int red = duration;rd >= 0;red--){
    for(int drive = 0;drive <= 3;drive++){
      if(mov[drive] == true){
        digitalWrite((drive+1)*2+1,LOW);  Setzt den Pin zum steppen für FD des Durchlaufs 'drive' auf LOW
        rd[drive]--;
        if(rd[drive] == 0){
          direc(drive);
          digitalWrite((drive+1)*2+1,HIGH);  Setzt den Pin zum steppen für FD des Durchlaufs 'drive' auf HIGH
          rd[drive] = sd[drive];
          dit[drive]++;
        }
      }
    }
    delay(1);
  }
  return;
}

void loop() {

  delay(200);
  fd(0,'c');
  fd(1,'e');
  fd(2,'g');
  fd(3,'b');
  run(200);
  delay(100);
  run(200);
  delay(100);
  fd(0,'e');
  run(200);
  delay(100);
  run(200);
  fd(0,'d');
  run(200);
  delay(100);
  run(200);
  delay(100);
  fd(0,'e');
  run(200);
}

Versuche haben ergeben, dass die FD's mit der gewünschten Frequenz angespielt werden können und die anzusteuernden FD nach belieben ausgewählt werden kann.
Allerdings läuft die FD dann für exakt 2 Sekunden statt den gewünschten 200ms. Auch wenn andere Zeiten probiert werden laufen die FD's noch immer absolut verlässlich 2 Sekunden. Danach hört es einfach auf irgendwas zu machen.
Das Problem scheint also innerhalb der run() Funktion zu bestehen

UPDATE: Es gab einen Fehler in der direc() Funktion, sodass das wieder nach oben laufen nicht funktioniert hat. Allerdings befindet sich in der run() Funktion eine Endlosschleife.

void in Verbindung mit Werten in der Klammer?
darf das ?

Ich frag mal vorsichtig, da hab ich mich noch nicht
heran getraut...

FunctionDeclaration

Stefan

for(int red = duration;rd >= 0;red--){

Ist das nicht ein Feld? Dann wäre rd ein Zeiger.

Du solltest deinen Sketch auch unbedingt in Code-Tags setzen. Was Du gemacht hast scheinen mir eher 'Quote'-Tags zu sein. Da werden manche Dinge als Formatierungszeichen interpretiert, und man kann den Code nicht mehr richtig lesen. Z.B. verschwinden dann Array-Indizierungen mit der Variablen 'i'

StefanBoth:
void in Verbindung mit Werten in der Klammer?
darf das ?

Ich frag mal vorsichtig, da hab ich mich noch nicht
heran getraut...

FunctionDeclaration

Stefan

@StefanBoth: Meinst Du sowas?

void meineFunktion(int zahl) {....}

Klar geht das. Warum sollte das nicht gehen? Das void sagt doch nur aus, dass es keinen Rückgabewert gibt.

int quadrat(int zahl) {
  return zahl * zahl;
}

Sagt, dass die Funktion ein int zurückgibt.

Oder hast Du was völlig anderes gemeint?

Gruß Tommy

StefanBoth:
void in Verbindung mit Werten in der Klammer?
darf das ?

Ich frag mal vorsichtig, da hab ich mich noch nicht
heran getraut...

FunctionDeclaration

Stefan

Du meinst sowas?

void direc(int i)

Wieso nicht. Das ist eine Funktion mit einem Eingabewert aber keinem Rückgabewert. Wieso soll es sowas nicht geben/ funktionieren / richtig sein?

Grüße Uwe

Danke für die Info :slight_smile:
Wie ich schon schrieb,
hab mich noch nicht dran getraut :wink:

Stefan