PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem Timer <-> Hauptprogramm



darxon69
11.02.2006, 20: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

PicNick
12.02.2006, 08:30
Das mit dem Dirout ist ungünstig, da ja gesetzt wird Portc.3 und gelesen wird ja Pinc.3
Setz wo einen eigenen Schalter "dim direct as Byte" und setze den und frage den
Es ist besser, du machst die =value abfrage in der ISR, und der Timer macht dann Selbstmord.
wenn der mal drüber ist, geht's ewig.

darxon69
12.02.2006, 08:41
Nun ja die Abfrage in den Timer bauen hatte ich ja auch schon vor gehabt. Das problem ist nur, daß ich mehrere verschiedenen Bedingungen abbilden muss. Vielleicht muss ich halt da noch ein wenig Nachdenken reinstecken.

PicNick
12.02.2006, 12:41
Werte verändern und abfragen sollte nur entweder in der ISR ODER im Hauptprogramm passieren. Es sind sonst immer KOnflikte möglich