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.
Lesezeichen