define onint_used 1
define OSC 4
include "modedefs.bas"
define debug_reg portC
define debug_bit 6
define debug_baud 9600
define debug_mode 1
define ADC_BITS 10
define ADC_CLOCK 3
define ADC_SAMPLES 50
trisa = %11111111
adcon1 = %10000010
pause 500
lf con 10
cr con 13
start:
tunestart var byte
tunestart = 0
tune var byte
tuneav var byte
anglevar Var byte
liftangle var byte
minangle CON 48
maxangle CON 240
liftstart CON 200
refreshperiod CON 20
anglevar = minangle
liftangle = maxangle-1
directionvar var byte
directionvar = 1
resetvar var byte
resetvar = 4
shake var byte
adjuster var byte
consumestart var byte
consumestart = 0
freqlength var byte
trisb.2 = 0
trisb.1 = 1
trisb.0 = 1
main:
' tuning average
ADCIN 0, tune
'debug "res", DEC tune, lf, cr
if tunestart = 11 then
tuneav = tuneav/11
debug "tune", DEC tuneav, lf, cr
if tuneav > 4 then
if consumestart = 0 then
gosub consume
consumestart = 1
endif
else
consumestart = 0
endif
tuneav = 0
tunestart = 0
else
'debug "tuneav", DEC tuneav, lf, cr
tuneav = tuneav + tune
tunestart = tunestart + 1
endif
'print servo angle
'debug "angle", DEC anglevar, lf, cr
'set servo direction with switches
if portb.0 = 1 then
directionvar = 1
endif
if portb.1 = 1 then
directionvar = 2
endif
'light direction indicator lights
if directionvar = 1 then
portb.2 = 0
else
portb.2 = 1
endif
'servo control
low portC.3
pulsout portc.3, anglevar
pause refreshperiod
'counterclockwise servo rotation angle
if directionvar = 1 then
if anglevar > maxangle then
resetvar = 1
gosub liftsub
else
anglevar = anglevar + 1
endif
endif
'clockwise servo rotation angle
if directionvar = 2 then
if anglevar < minangle then
resetvar = 1
gosub liftsub
anglevar = maxangle
else
anglevar = anglevar - 1
endif
endif
goto main
liftsub:
debug "liftsub", DEC liftangle, cr, lf
low portc.2
pulsout portc.2, liftangle
pause refreshperiod
if liftangle < liftstart then
liftangle=liftstart
gosub resetsub
'return to main
return
else
liftangle = liftangle - 1
endif
goto liftsub
resetsub:
if directionvar = 1 then
pulsout portc.3, anglevar
pause refreshperiod
if anglevar < minangle+20 then
gosub placesub
'return to liftsub
return
else
anglevar = anglevar - 5
endif
else
pulsout portc.3, anglevar
pause refreshperiod
if anglevar > maxangle then
gosub placesub
'return to liftsub
return
else
anglevar = anglevar + 5
endif
endif
goto resetsub
placesub:
pulsout portc.2, liftangle
pause refreshperiod
if liftangle > maxangle then
return
else
liftangle = liftangle + 2
endif
goto placesub
consume:
' if the station is tuned in the servo will first lift and then
'shake/50 times, readjust for put down and then put down
low portc.2
pulsout portc.2, liftangle
pause refreshperiod
if liftangle < liftstart then
for shake = 1 to 100
if shake // 50 > 25 then
ADCIN 0, tune
'freqlength = tune+1
freqout portc.4, (tune+1)*3, (tune * 800)
liftangle = liftangle - 1
pulsout portc.2, liftangle
pause refreshperiod
else
ADCIN 0, tune
'freqlength = tune+1
freqout portc.4, (tune+1)*3, (tune * 400)
liftangle = liftangle + 1
pulsout portc.2, liftangle
pause refreshperiod
endif
next shake
liftangle=liftstart
gosub adjust
gosub placesub
return
else
liftangle = liftangle - 1
endif
goto consume
' adjust for put down
adjust:
for adjuster = 1 to 12
if directionvar = 1 then
anglevar = anglevar - 1
low portc.3
pulsout portc.3, anglevar
pause refreshperiod
else
anglevar = anglevar + 1
low portc.3
pulsout portc.3, anglevar
pause refreshperiod
endif
next adjuster
return
goto adjust
back