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);
}