gRaf-eny
23.03.2006, 11:31
Hi, ich habe hier momentan ein Programmier Problem, und ich hoffe ein Erfahrener Programmierer oder einer der sich mit Timern auskennt kann mir helfen:
Ich habe eine Karte auf der ein At-Mega 8 drauf ist, an ihm sind 2 Schrittmotoren angeschlossen und weiterhin 2 Poties (Ein alter Joystick).
Mein Plan war jetzt, dass wenn der Joystick neutral ist, sich kein Motor dreht.
Wenn die X Achse (ADC 1) einen Ausschlag nach links bekommt sich der Motor1 nach Links dreht und nach rechts, dann natürlich auch der Motor1 nach rechts.
Bei Vollausschlag links soll er sehr schnell laufen, bei kleinem Ausschlag entsprechend langsam. Die Übergänge möglichst mit seeeeeeeehr vielen Stufen.
Das gleiche gilt natürlich für die Y Achse und den anderen Motor.
Mein Problem ist jetzt aber, dass ich die Motoren Ansteuerung nicht parallel laufen lassen kann. Was bedeutet, dass die einzelnen Motoren nicht unabhängig voneinander ihre Geschwindigkeit verändern können.
(Ich hoffe jemand kennt das Problem, ich kann es nämlich sehr schlecht erklären…)
Jetzt hoffe ich das mir jemand mit sehr geschickter Programmierung helfen kann, oder mir jemand sagen kann ob und wie ich das Problem mit Timern umgehen kann.
Meine Idee wäre in den Timer 1 den Moter1 Code zu packen und in den Timer 2 den Code für den Motor 2, dann müsste ich in der Hauptsub „nur noch“ je nach Potiestellung das Timerintervall verändern.
Ist die Idee richtig und umsetzbar?
Eine „Lösung“ habe ich schon „fertig“, aber die hat nur 5 Unterschiedliche Geschwindigkeiten und das reicht bei weitem nicht… und sie belegt schon fast den gesamten Speicherplatz des Chips und ist von daher nicht erweiterbar.
Bin für jede Idee, ICQ-Nummer, etc. dankbar ;)
Gruß
Hagen
*hier noch ein paar daten...:
Schaltplan (das rote könnt ihr ignorieren)
http://www.bildfaenger-film.de/extern/plan.jpg
Motor B / 1
Sub Motorb
If Bdire = 1 Then
Btime = Btime + 1
Elseif Bdire = 2 Then
Btime = Btime - 1
End If
If Btime = 9 Then
Btime = 1
Elseif Btime = 0 Then
Btime = 8
End If
If Btime = 1 Then
B = B + 1
Portb.0 = 1
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
Elseif Btime = 2 Then
Portb.0 = 1
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Elseif Btime = 3 Then
Portb.0 = 1
Portb.1 = 1
Portb.2 = 0
Portb.3 = 0
Elseif Btime = 4 Then
Portb.0 = 0
Portb.1 = 1
Portb.2 = 0
Portb.3 = 0
Elseif Btime = 5 Then
Portb.0 = 0
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
Elseif Btime = 6 Then
Portb.0 = 0
Portb.1 = 0
Portb.2 = 1
Portb.3 = 0
Elseif Btime = 7 Then
Portb.0 = 0
Portb.1 = 0
Portb.2 = 1
Portb.3 = 1
Elseif Btime = 8 Then
Portb.0 = 0
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
End If
End Sub
Motor D / 2
Sub Motord
If Ddire = 1 Then
Dtime = Dtime + 1
Elseif Ddire = 2 Then
Dtime = Dtime - 1
End If
If Dtime = 9 Then
Dtime = 1
Elseif Dtime = 0 Then
Dtime = 8
End If
If Dtime = 1 Then
Portd.0 = 1
Portd.1 = 0
Portd.2 = 0
Portd.3 = 1
Elseif Dtime = 2 Then
Portd.0 = 1
Portd.1 = 0
Portd.2 = 0
Portd.3 = 0
Elseif Dtime = 3 Then
Portd.0 = 1
Portd.1 = 1
Portd.2 = 0
Portd.3 = 0
Elseif Dtime = 4 Then
Portd.0 = 0
Portd.1 = 1
Portd.2 = 0
Portd.3 = 0
Elseif Dtime = 5 Then
Portd.0 = 0
Portd.1 = 1
Portd.2 = 1
Portd.3 = 0
Elseif Dtime = 6 Then
Portd.0 = 0
Portd.1 = 0
Portd.2 = 1
Portd.3 = 0
Elseif Dtime = 7 Then
Portd.0 = 0
Portd.1 = 0
Portd.2 = 1
Portd.3 = 1
Elseif Dtime = 8 Then
Portd.0 = 0
Portd.1 = 0
Portd.2 = 0
Portd.3 = 1
End If
End Sub
Ich habe eine Karte auf der ein At-Mega 8 drauf ist, an ihm sind 2 Schrittmotoren angeschlossen und weiterhin 2 Poties (Ein alter Joystick).
Mein Plan war jetzt, dass wenn der Joystick neutral ist, sich kein Motor dreht.
Wenn die X Achse (ADC 1) einen Ausschlag nach links bekommt sich der Motor1 nach Links dreht und nach rechts, dann natürlich auch der Motor1 nach rechts.
Bei Vollausschlag links soll er sehr schnell laufen, bei kleinem Ausschlag entsprechend langsam. Die Übergänge möglichst mit seeeeeeeehr vielen Stufen.
Das gleiche gilt natürlich für die Y Achse und den anderen Motor.
Mein Problem ist jetzt aber, dass ich die Motoren Ansteuerung nicht parallel laufen lassen kann. Was bedeutet, dass die einzelnen Motoren nicht unabhängig voneinander ihre Geschwindigkeit verändern können.
(Ich hoffe jemand kennt das Problem, ich kann es nämlich sehr schlecht erklären…)
Jetzt hoffe ich das mir jemand mit sehr geschickter Programmierung helfen kann, oder mir jemand sagen kann ob und wie ich das Problem mit Timern umgehen kann.
Meine Idee wäre in den Timer 1 den Moter1 Code zu packen und in den Timer 2 den Code für den Motor 2, dann müsste ich in der Hauptsub „nur noch“ je nach Potiestellung das Timerintervall verändern.
Ist die Idee richtig und umsetzbar?
Eine „Lösung“ habe ich schon „fertig“, aber die hat nur 5 Unterschiedliche Geschwindigkeiten und das reicht bei weitem nicht… und sie belegt schon fast den gesamten Speicherplatz des Chips und ist von daher nicht erweiterbar.
Bin für jede Idee, ICQ-Nummer, etc. dankbar ;)
Gruß
Hagen
*hier noch ein paar daten...:
Schaltplan (das rote könnt ihr ignorieren)
http://www.bildfaenger-film.de/extern/plan.jpg
Motor B / 1
Sub Motorb
If Bdire = 1 Then
Btime = Btime + 1
Elseif Bdire = 2 Then
Btime = Btime - 1
End If
If Btime = 9 Then
Btime = 1
Elseif Btime = 0 Then
Btime = 8
End If
If Btime = 1 Then
B = B + 1
Portb.0 = 1
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
Elseif Btime = 2 Then
Portb.0 = 1
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Elseif Btime = 3 Then
Portb.0 = 1
Portb.1 = 1
Portb.2 = 0
Portb.3 = 0
Elseif Btime = 4 Then
Portb.0 = 0
Portb.1 = 1
Portb.2 = 0
Portb.3 = 0
Elseif Btime = 5 Then
Portb.0 = 0
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
Elseif Btime = 6 Then
Portb.0 = 0
Portb.1 = 0
Portb.2 = 1
Portb.3 = 0
Elseif Btime = 7 Then
Portb.0 = 0
Portb.1 = 0
Portb.2 = 1
Portb.3 = 1
Elseif Btime = 8 Then
Portb.0 = 0
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
End If
End Sub
Motor D / 2
Sub Motord
If Ddire = 1 Then
Dtime = Dtime + 1
Elseif Ddire = 2 Then
Dtime = Dtime - 1
End If
If Dtime = 9 Then
Dtime = 1
Elseif Dtime = 0 Then
Dtime = 8
End If
If Dtime = 1 Then
Portd.0 = 1
Portd.1 = 0
Portd.2 = 0
Portd.3 = 1
Elseif Dtime = 2 Then
Portd.0 = 1
Portd.1 = 0
Portd.2 = 0
Portd.3 = 0
Elseif Dtime = 3 Then
Portd.0 = 1
Portd.1 = 1
Portd.2 = 0
Portd.3 = 0
Elseif Dtime = 4 Then
Portd.0 = 0
Portd.1 = 1
Portd.2 = 0
Portd.3 = 0
Elseif Dtime = 5 Then
Portd.0 = 0
Portd.1 = 1
Portd.2 = 1
Portd.3 = 0
Elseif Dtime = 6 Then
Portd.0 = 0
Portd.1 = 0
Portd.2 = 1
Portd.3 = 0
Elseif Dtime = 7 Then
Portd.0 = 0
Portd.1 = 0
Portd.2 = 1
Portd.3 = 1
Elseif Dtime = 8 Then
Portd.0 = 0
Portd.1 = 0
Portd.2 = 0
Portd.3 = 1
End If
End Sub