Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo braucht zu lange
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
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.
Hmmm...da könntest du recht haben. Hast du vielleicht ne Idee, wie man das programmiertechnisch anders lösen könnte?
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 ?
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.
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.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.