Fixed Servo Repeat Object
Travis' Simple Capture and repeat to servo was very jerky, so I decided to fix it. I kind of stabbed in the dark and got it right! Instead of pushing pulsins to servo 32v3, I made them go directly to pulsout and it fixed the jerkiness.
The new code :
NOTE: I took out the original debug code, because 1) I didn't need it for my project, and 2) I have a Mac, which currently doesn't have a serial terminal (that I can get working)
The new code :
NOTE: I took out the original debug code, because 1) I didn't need it for my project, and 2) I have a Mac, which currently doesn't have a serial terminal (that I can get working)
{{
Origional Code: Travis
Modded By: Forrest (rubrchicken)
}}
CON
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
'Pin on Prop Chip for LED Indicator
PIN_LED = 15
'Pins on Prop Chip for Servo Input/Output
PIN_SERVO_IN = 0
PIN_SERVO_OUT = 1
var
long us
OBJ
'Debug : "FullDuplexSerial" 'standard from propeller library
SERVO : "Servo32v3" 'standard from propeller library
PUB Begin(in,out) | x,y,z
us := clkfreq / 1_000_000 ' Clock cycles for 1 us
'SERVO.Set(out,1422)
'SERVO.Start
y := PULSIN(in,1)
'SERVO.Set(out,(y * 2))
PULSOUT(out,y)
'waitcnt(clkfreq / 4 + cnt) '0.25 seconds
PUB PULSIN (Pin, State) : Duration | usa
usa := clkfreq / 1_000_000 ' Clock cycles for 1 us
Duration := PULSIN_Clk(Pin, State) / usa / 2 + 1 ' Use PulsinClk and calc for 2uS increments \
PUB PULSIN_Clk(Pin, State) : Duration
DIRA[noparse][[/noparse]pin]~
ctra := 0
if state == 1
ctra := (%11010 << 26 ) | (%001 << 23) | (0 << 9) | (PIN) ' set up counter, A level count
else
ctra := (%10101 << 26 ) | (%001 << 23) | (0 << 9) | (PIN) ' set up counter, !A level count
frqa := 1
waitpne(|< Pin, |< Pin, 0) ' Wait for opposite state ready
phsa:=0 ' Clear count
waitpeq(|< Pin, |< Pin, 0) ' wait for pulse
waitpne(|< Pin, |< Pin, 0) ' Wait for pulse to end
Duration := phsa ' Return duration as counts
ctra :=0 ' stop counter
PUB PULSOUT(Pin,Duration) | clkcycles
{{
Produces an opposite pulse on the pin for the duration in 2uS increments
Smallest value is 10 at clkfreq = 80Mhz
Largest value is around 50 seconds at 80Mhz.
BS2.Pulsout(500) ' 1 mS pulse
}}
ClkCycles := (Duration * us * 2 - 1250) #> 400 ' duration * clk cycles for 2us
' - inst. time, min cntMin
dira[noparse][[/noparse]pin]~~ ' Set to output
!outa[noparse][[/noparse]pin] ' set to opposite state
waitcnt(clkcycles + cnt) ' wait until clk gets there
!outa[noparse][[/noparse]pin]

Comments