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