Code:
DEFINE OSC 8
DEFINE ADC_CLOCK 64
DEFINE ADC_BITS 10
DEFINE ADC_SAMPLEUS 50
OSCCON = %01110000
intcon.5=0
intcon.6=0
intcon.7=0
CCP1CON = 0
cvrcon = 0
TrisB = %00000000
TrisA = %01010000 'set ra4 input for analog in
ANSEL =%00010000 'AN 4
ADCON1.7 = 1 'set a/d to right justified
extra var portb.3 'Extra serial line, output
ir var porta.4
lednorun var portb.6
ledrun var portb.7
lednorun = 0 'turn stop led off
ledrun = 0 'turn go led off
i var word
i = 0
j var word
j = 0
irin var word
begin:
ADCIN 4, irin
pauseus 100
test:
If irin < 400 then
lednorun = 1
sound extra, [110,10]
lednorun = 0
Endif
If irin >401 then
ledrun = 1
sound extra, [60,10]
ledrun = 0
Endif
goto begin
And here's the bigger program to control the whole circuit:
Code:
'********************************************************************************************************
'
'
'Configuration Bit Definitions
@ __config _CONFIG1, _INTRC_IO 'sets the INTRC-OSC2 as RA6
'
'
'********************************************************************************************************
DEFINE OSC 8 'Configure internal 8mhz oscillator
DEFINE ADC_CLOCK 64 'Set clock source (RC = 3)
DEFINE ADC_BITS 10 'Set result to 10 bits
DEFINE ADC_SAMPLEUS 50 'Set sampling time to 50 microseconds
OSCCON = %01110000 'Set internal oscillator to 8mhz
intcon.5=0
intcon.6=0
intcon.7=0
CCP1CON = 0 'Turn off capture/compare
cvrcon = 0 'Disable comparators?
TrisB = %00100000 'Set B5 to input
TrisA = %01010000 'Set A4 and A6 to inputs
ANSEL =%00010000 'A/D converter on A4
ADCON1.7 = 1 'Set a/d to right justified
clock var porta.0 'Step C, clock signal, output
dir var porta.1 'Step D, direction, high CW, low CCW, output, probably keep high
reset var porta.2 'Step R, reset, low = home, ABCD = 0101, output
stepE var porta.3 'SD enable, motor enable, low = all low, output
ir var porta.4 'Input from IR, input
photo var porta.6 'Photo, encoder disk, feed to master control box and check for motor drive, input
menable var porta.7 'Master enable from master control box, output
henable var portb.0 'Brake enable, output
brakoff var portb.1 'Brake off, rat can run, output
brakon var portb.2 'Brake on, rat can't run, output
extra var portb.3 'Extra serial line, output, most likely will be used for buzzer
ser2 var portb.4 'Serial 2, output (when used with serin2 command, automatically set as output for overflow)
ser1 var portb.5 'Serial 1, input
lednorun var portb.6 'Turns on stop led (blue), output
ledrun var portb.7 'Turns on go led (green), output
RPM var word 'Assign rpm as a variable
signal var word 'Assign signal as a variable
i var word 'Empty variable
j var word 'Empty variable
freq var word 'Frequency variable
period var word 'Period variable
cnt var word 'Count variable for ramp up
down var word 'Variable for ramp down
irin var word 'Variable for analog ir signal
stepE = 0 'Motor not running, all low
clock = 0 'Clock to zero
reset = 0 'Reset motor
RPM = 60 'Set initial RPM to 0
signal = 2 'Initialize signal variable
i = 0 'Zero empty variable
j = 0 'Zero empty variable
freq = 0 'Zero frequency variable to clear old data (maybe move down to make sure old data is cleared)
period = 0 'Zero period variable to clear old data (maybe move down to make sure old data is cleared)
dir = 1 'Set clockwise motion
begin:
lednorun = 1 'Turn stop led on
ledrun = 1 'Turn go led on
henable = 1 'Enable brake and h bridge
brakon = 1 'Turn brake on to initialize
brakoff = 0 'Leave brake on
pause 500
brakoff = 1 'Leave brake on
reset = 0 'Reset motor everytime through program
stepE = 0 'Set enable low
serin2 11\10, 16780, 1000, timeout, [wait("start"), DEC2 RPM, DEC1 signal] 'Set up serial in on pin 11 (pin 10 is flow pin), assign transfered data as 2 digit decimal RPM variable and 1 digit decimal signal variable
if signal > 0 then 'Loops unless signal variable assigned, then checks
gosub check
endif
timeout:
while menable = 0 'Poll menable port until master control box activates
goto begin 'If no data from MCB, continue polling
wend
brakon = 0 'Remove brake, allow spin
pause 500
brakoff = 0
If RPM = 0 then
gosub freewheel 'Loops to freewheel if input = 0
goto begin 'Returns to beginning after freewheel program runs
endif
If RPM > 0 then 'Check to avoid division by zero, also used as loop to solve check problem
freq = 23*RPM + RPM/3 'Calculation of frequency
period = (62500/freq)*16 'Calculation of period
endif
cnt = 0 'Count variable
gosub signalon 'Go to checksignal subroutine
rampup:
reset = 1
If cnt < 2000 && menable = 1 then 'Conditionally start motor
cnt = cnt + 1 'Add 1 to the count variable
high stepE 'Enable motor
high clock 'Set clock high
pauseus (1000*period)/cnt 'Variable pause
low clock 'Set clock low
pauseus (1000*period)/cnt 'Variable pause
high clock 'Set clock high
pauseus (1000*period)/cnt 'Variable pause
low clock 'Set clock low
pauseus (1000*period)/cnt 'Variable pause
down = 1 'Initialize down variable
goto rampup 'Repeat until count variable exceeds 2000
Else
goto run
Endif
'Set up full run
run:
reset = 1
If cnt = 2000 && menable = 1 then 'Conditionally start regular run set
high stepE 'Enable motor
high clock 'Set clock high
pauseus period/2 'Pause
low clock 'Set clock low
pauseus period/2 'Pause
goto run 'Repeat forever?
Else
goto rampdown
Endif
'initialize cool down
rampdown:
reset = 1
If cnt <= 2000 && cnt > 0 && down = 1 then 'Conditionally start ramp down
cnt = cnt - 1 'Subtract 1 from count variable
high stepE 'Enable motor
high clock 'Set clock high
pauseus (1000*period)/cnt 'Variable pause
low clock 'Set clock low
pauseus (1000*period)/cnt 'Variable pause
high clock 'Set clock high
pauseus (1000*period)/cnt 'Variable pause
low clock 'Set clock low
pauseus (1000*period)/cnt 'Variable pause
goto rampdown 'Loop until conditions end
Endif
pause 100
gosub signaloff
henable = 1 'Enable h bridge for brake
brakoff = 0 'Turn off brake stop
brakon = 1 'Enable brake, stops wheel spin
pause 1000
brakon = 1 'Leave brake on
pause 100
brakoff = 0 'Leave brake on, kills power
pause 100
goto begin
end
'*******************************************************************************************************
'*
'*
'*
'*
'*SUBROUTINES
check:
serout2 11\10, 16780, 1000, timeout, [DEC2 RPM, DEC1 signal] 'Send variable data back to MCB to verify accuracy
return
freewheel:
'Allow time for user to disengage motor, should already be done, brake is off
'Build in ir sensor routine to make sure rat isn't cheating
gosub signalon 'Go to signal subroutine to determine signal method
goto free
free:
while menable = 1
goto free
wend
gosub signaloff 'Go to signal subroutine to signal stop
pause 4000 'Allow 4 seconds for rat to stop running
henable = 1 'Enable h bridge for brake
brakoff = 0 'Turn off brake stop
brakon = 1 'Enable brake, stops wheel spin
pause 1000
brakon = 1 'Leave brake on
pause 100
brakoff =0 'Leave brake on, kills power
pause 100
return
signalon:
ledrun = 0 'Start with run led off
lednorun = 0 'Start with stop led off
if signal = 1 then 'No light or sound
gosub nosignal
endif
if signal = 2 then 'Light for 2 seconds
gosub ledstart
endif
if signal = 3 then 'Sound for 1 second
gosub buzzerstart
endif
if signal = 4 then 'Both (light for 2 seconds, sound for 1 second)
gosub ledstart
gosub buzzerstart
endif
return
signaloff:
ledrun = 0 'Start with run led off
lednorun = 0 'Start with stop led off
if signal = 1 then 'No light or sound
gosub nosignal
endif
if signal = 2 then 'Light for 2 seconds
gosub ledstop
endif
if signal = 3 then 'Sound for 1 second
gosub buzzerstop
endif
if signal = 4 then 'Both (light for 2 seconds, sound for 1 second)
gosub ledstop
gosub buzzerstop
endif
return
nosignal: 'Empty subroutine to loop back to program with no signal
return
ledstart: 'Subroutine to activate run led
ledrun = 1
pause 2000
ledrun = 0
return
ledstop: 'Subroutine to activate stop led
lednorun = 1
pause 2000
lednorun = 0
return
buzzerstart: 'Subroutine to activate start buzzer
sound extra, [110,84]
return
buzzerstop: 'Subroutine to activate stop buzzer
sound extra, [60,84]
return
Thanks again in advance.
Bookmarks