PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo braucht zu lange



RAM
11.11.2007, 13:32
Hallo zusammen,

hab da ein kleines Problem mit nem Servo. Wenn in meinem Fall Pin D6 auf High geht, soll der Servo nach 2 Sekunden nach links fahren, das funktioniert auch einwandfrei. Wenn der Pin auf Low geht, soll er die Mittelstellung anfahren. Und genau hier liegt mein Problem: Hier dauert es auch ungefähr 2 Sekunden, bis der Servo das macht. Sollte er aber gleich machen, wenn der Pin auf Low geht. Hab noch nicht so viel Erfahrung mit Bascom, weiß vielleicht jemand, wo mein Fehler liegt?


$regfile = "m32def.dat"
$crystal = 16000000
Config Servos = 1 , Servo1 = Portd.7 , Reload = 10
Ddrd = &B01111111
Config Pind.7 = Output
Config Pind.6 = Input
Enable Interrupts
Do
If Pind.6 = 1 Then
Wait 2
Servo(1) = 60
Else
Servo(1) = 120
End If
Loop
End

PicNick
11.11.2007, 14:38
Ich vermute (ohne gewähr):
Angenommen, Pind.6 geht auf 1
er wartet 2 sekunden, setzt dann das servo
dann checkt er sofort wieder den Input
logo, so hast du es ja geschrieben,

aaaaaaber

der Pin geht ja IRGENDWANN auf eins, mit großer Wahrscheinlichkeit grad dann, wenn grad WAIT 2 läuft. In der Zeit merkt er aber von nix
Es kann also auch max. 2 sekunden dauern, bis er wieder zu "DO" kommt und sieht, dass der Pin inzwischen auf "0" ist.

RAM
11.11.2007, 16:05
Hmmm...da könntest du recht haben. Hast du vielleicht ne Idee, wie man das programmiertechnisch anders lösen könnte?

PicNick
11.11.2007, 16:44
Ich nehm da eigentlich immer einen Timer mit 1 mS, der immer läuft (interrupt)
Wenn ich will, daß in zwei sekunden etwas passiert, lade ich einen Zähler mit 2000, der dann von dem Timer runtergezählt wird. Geht der Zähler von 1 auf null, passiert dann eben was, sonst nicht.
Die sonstige Zeit frag ich ununterbrochen und ohne Warten immer meine Pins ab, da versäum ich nix.

Noch 'ne Frage: wenn innerhalb der 2 Sekunden der Pin von 1 wieder auf 0 geht, soll dann das Abbiegen vorzeitig abgebrochen werden, oder macht er das trotzdem ?

RAM
11.11.2007, 16:53
Kannst du mir da vielleicht ein Beispiel für meinen Fall geben? Der Servo sollte schon in seine Stellung fahren, es muss also nicht vorzeitig abgebrochen werden.

PicNick
11.11.2007, 17:18
Schnell hingefetzes Beispiel, nicht getestet, ohne Gewähr und nix:
deine Pin- und Servo konfiguration kannst du selbst einfügen.



Const Tmr_c_prescale = xxx
Const Tmr_c_preload = xxx

Config Timer1 = Timer , Prescale = Tmr_c_prescale 'Timer 1mS


On Timer1 Interrupt_ticker ' Timer for Timer Queue

dim mycount as word

Enable Timer1


Enable Interrupts

Do
If Pind.6 = 1 Then
mycount = 2000
else
mycount = 0
Servo(1) = 120
End If
Loop
End
'-----------------------------------------------------
Interrupt_ticker:
Timer1 = Tmr_c_preload

if mycount > 0
then
decr mycount
if mycount = 0
then
Servo(1) = 60
end if
end if
Return


Prescale und Preload mußt du dir aus dem "$crystal = " ausrechnen.

Btw:
Du mußt übrigens Timer1 nehmen, weil Bascom timer0 für die Servos braucht.



Ich hoff', das klappt


EDIT: Bei Pin=0 MUSST du den Zähler zurücksetzen, sonst fetzt er dir ja vielleicht ins gerade-fahren rein.