-
So, habe es jetzt hin bekommen :
Code:
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 32
$framesize = 32
Config Portd.7 = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.6 = Output
Config Portc.2 = Output
Config Portc.3 = Output
Config Portc.4 = Output
Config Pinb.3 = Input 'Endschalter
Config Pinb.4 = Input 'Endschalter
Sw1 Alias Pinb.3
Sw2 Alias Pinb.4
Waitms 500
Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 2
Portd.3 = 1
Do 'Endschalterposition anfahren
Portd.6 = 0 : Waitus 1 : Portd.6 = 1
Waitms 10
Loop Until Sw1 = 1
Do 'Hauptprogramm
Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 2
Loop
End
Lag an der Programmierung : If Sw1 = 1 Then Exit Do
Wie willst du das mit Timern realisieren ?? Habe jetzt keine richtigen Vorstellungen davon ,da ich ja noch nicht so lange Progge.
Wäre für einen Lösungsansatz sehr dankbar. :)
-
Zum Thema Timer:
http://halvar.at/elektronik/kleiner_...timer_counter/
Zum Vorgehen zur Steuerung von Schrittmotoren:
Ich mache es so, dass ich in der ISR erst den Timer auf den neuen Zeitwert setze, dann den Ausgangsport High schalte, kurz warte (1µs) und ihn wieder auf Low setze. Vom übergebenen Zeitwert ist dann abhängig, wann die ISR dann das nächste mal aufgerufen wird. Die Berechnung des Zeitwerts kann man dann in die Hauptschleife verfrachten. Erweitern lässt sich das natürlich auch, zB. mit Schrittzähler, Beschleunigungsrampen oder Bresenhamalgorithmus zur linearen Interpolation von mehreren Motoren (damit nicht jeder einen Timer belegen muss). Wenn man mehrere Motoren so zwischen einzelnen Punkten interpoliert und die Abstände zwischen den Punkten recht klein wählt, dann dürften sich ziemlich runde Bahnen generieren lassen. Hab das aber selber auch noch nicht so vollständig getestet.
Hier nochmal ein bisschen Code zum Timer:
Code:
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
On Timer1 Isr1
Config Timer1 = Timer , Prescale = 8
Enable Timer1
Enable Interrupts
Config PortA = Output
PortA.1 = 0
Dim Zeit As Byte
Zeit = 100 'einzelner Schritt dauert 100*Prescaler/Quarzfrequenz= 50 µs
Do
!NOP 'Hauptschleife ist komplett frei, hier kann alles andere berechnet werden
Loop
Isr1:
Load Timer1 , Zeit
Toggle PortA.1
Waitus 1
Toggle PortA.1
Return
Mit dem Prescaler kann man dann die Quarzfrequenz skalieren. Mit niedrigen Werten kann man die Taktrate höher auflösen, dafür aber keine ganz niedrigen Geschwindigkeiten mehr fahren. Für mich hat sich ein Prescaler von 8 als ganz nützlich herausgestellt, aber natürlich kannst du damit selber ein wenig herumprobieren.
-
Danke für die Mühe. Werde ich mal drüberschauen. :)
Jetzt noch eine Frage an euch : Würde euch ein kleines Video mit nur zwei Achsen für den Anfang reichen ???
- - - Aktualisiert - - -
Hallo nochmal,
ich wollte nur noch sagen ,dass ich es endlich geschafft habe ein mini Video zu machen.
Hier fährt er die Ref-Positionen an. :) auch wenn es wenig ist ,aber ich freu mich.
http://www.youtube.com/watch?v=_CYCB6ip0Is
-
Das sieht schon sehr gut aus. Funktioniert das Programm schon mit Timern oder noch mit delays?
MfG Hannes
-
Ist noch nicht mit Timer. Dazu komme ich erst in paar Wochen.
Ich wollte übrigens noch zum Video etwas sagen: In diesem Video kann man sehen ,wie der Roboterarm die Nullposition anfährt.