darxon69
11.02.2006, 21:20
Ich bin dabei eine Schrittmotorsteuerung zu implementieren. Dazu takte ich einen Schrittmotortreiber-IC. Der Takt wird über einen Timer erzeugt und in selbigem gleich der Schrittzähler mit hochgezählt bzw runter gezählt.
Das Problem dabei ist, daß zwar der Timer wunderschön läuft und auch die entsprechenden Variable "Actualposition" setzt, aber das Hauptprogramm schlicht die Abbruchbedingung nicht auswertet.
Beispiel:
Actualposition =0 (integer)
Value =10 (integer)
bedeutet, daß der Timer 10 mal aufgerufen werden muss, bis die aktuelle Position des Motors der gewünschten Position (in Value) entspricht. Wenn beide gleich sind, dann soll die Do-Loop-Until Klausel verlassen werden und der Timer gestoppt. Danach wird die aktuelle Position ausgegeben. Passiert aber nicht.
Ich habe das auch schon mit anderen Schleifen-Konstrukten wie While-Do usw. durchprobiert. Hat alles nix gebracht. Auch eine extra auswertung nochmal in der Schleife, wie im Codebeispiel hat mir nix gebracht. Die Abbruchbedingung wird nicht ausgeführt, sondern Actualposition läut munter weiter in die entsprechende Richtung.
Muss da irgendwo noch ein Wait rein?
$crystal = 6000000
Config Timer0 = Timer , Prescale = 256
On Timer0 Tim0_isr
Clock Alias Portc.2
Dirout Alias Portc.3
...
'Hauptschleife
Do
If Actualposition = Value Then 'nur zum test hier nochmal auswerten
Stop Timer0
End If
Loop Until Actualposition = Value 'solange ungleich
Stop Timer0
Print Actualposition
...
'ISR von Timer0
Tim0_isr:
Timer0 = Stepdelay ' zeit setzen
Clock = Not Clock ' negieren und damit takten'
If Dirout = 0 Then 'Richtung auswerten
Decr Actualposition
Else
Incr Actualposition
End If
Return
Das Problem dabei ist, daß zwar der Timer wunderschön läuft und auch die entsprechenden Variable "Actualposition" setzt, aber das Hauptprogramm schlicht die Abbruchbedingung nicht auswertet.
Beispiel:
Actualposition =0 (integer)
Value =10 (integer)
bedeutet, daß der Timer 10 mal aufgerufen werden muss, bis die aktuelle Position des Motors der gewünschten Position (in Value) entspricht. Wenn beide gleich sind, dann soll die Do-Loop-Until Klausel verlassen werden und der Timer gestoppt. Danach wird die aktuelle Position ausgegeben. Passiert aber nicht.
Ich habe das auch schon mit anderen Schleifen-Konstrukten wie While-Do usw. durchprobiert. Hat alles nix gebracht. Auch eine extra auswertung nochmal in der Schleife, wie im Codebeispiel hat mir nix gebracht. Die Abbruchbedingung wird nicht ausgeführt, sondern Actualposition läut munter weiter in die entsprechende Richtung.
Muss da irgendwo noch ein Wait rein?
$crystal = 6000000
Config Timer0 = Timer , Prescale = 256
On Timer0 Tim0_isr
Clock Alias Portc.2
Dirout Alias Portc.3
...
'Hauptschleife
Do
If Actualposition = Value Then 'nur zum test hier nochmal auswerten
Stop Timer0
End If
Loop Until Actualposition = Value 'solange ungleich
Stop Timer0
Print Actualposition
...
'ISR von Timer0
Tim0_isr:
Timer0 = Stepdelay ' zeit setzen
Clock = Not Clock ' negieren und damit takten'
If Dirout = 0 Then 'Richtung auswerten
Decr Actualposition
Else
Incr Actualposition
End If
Return