#picaxe 20m2
start0: ;this task sets everything up ready and flashes an LED while waiting for the start button
suspend 3
;symbol ADCPIN = 4
symbol slvAddrWR = $A0 ' I2C write address
symbol slvAddrRD = $A1 ' I2C Read address
symbol ADCPIN = 4
symbol REDDISPLAY = 0x62 ;RED 4 DIGIT 7 SEG DISPLAY
SYMBOL bluedisplay = 0x64 ;BLUE 4 DIGIT 7 SEG DISPLAY
symbol CLEARDISPLAY = 2 ;2 = THE COMMAND TO CLEAR THE SCREEN
symbol NUMTODIGIT = 4 ;4 = THE COMMAND TO WRITE TO THE LCD
symbol DECIMALPOINT = 5 ;DECIMAL VERIABLE
symbol Y1 = C.0 ;FIRST YELLOW LIGHT
SYMBOL Y2 = C.3 ;SECOND YELLOW LIGHT
SYMBOL Y3 = C.2 ;3RD YELLOW LIGHT
SYMBOL G1 = c.4 ;GREEN LIGHT
SYMBOL R1 = C.4 ;BLUE START FAULT LIGHT
SYMBOL R2 = C.1 ;RED START FAULT LIGHT
SYMBOL R3 = C.4 ;BLUE PASS FAULT LIGHT CURRENTLY THE SAME AS THE START FAULT BUT REFERENCED SEPORATLY FOR FUTURE
SYMBOL R4 = C.1 ;RED PASS FAULT LIGHT CURRENTLY THE SAME AS THE START FAULT BUT REFERENCED SEPORATLY FOR FUTURE
SYMBOL REDPASS = B.2 ;RED START SENSOR
SYMBOL REDSTART = B.3 ;RED PASS SENSOR
SYMBOL BLUESTART = B.4 ;BLUE START SENSOR
SYMBOL BLUEPASS = B.6 ;BLUE PASS SENSOR
SYMBOL READYLED = C.7 ;READY LED
SYMBOL RESETBUTTON = C.5
symbol start_sw = pinb.1 ; define a input switch
symbol red_sec = 0
symbol blue_sec = 0
symbol timeincentiseconds = w3
symbol timeearly = w4 ; need Word if > 255 centi-secs
symbol fault = w10
symbol pass_red = w11
symbol pass_blue = w12
symbol start_ed = w13
PAUSE 200
i2cslave slvAddrWR, i2cslow, i2cbyte 'Initialize RTC
writei2c 0,(%00000100) ;timer function to 99 seconds
;to enable %xx0xx1xx
writei2c 8,(%00000100) ; alarm control registers and clock mode
;bit7 enable alarm interrupt
;bit6 timer alarm
;bit5/4 clock alarm 00= no clock alarm
;bit3 timer interrupt enable
;bit2/1/0 timer function 001= hundredths of a second
pause 500
writei2c 2,(%00000000) ;reset minutes
writei2c 1,(%00000000) ;reset seconds
writei2c 3,(%00000000) ;reset milliseconds
HI2CSETUP I2CMASTER, blueDISPLAY, i2cfast, i2cbyte ; Initiaize BLUE 4x7 segment display
pause 200
hi2cout (NUMTODIGIT, 0, 0) ;set 1st digit to 0
hi2cout (NUMTODIGIT, 1, 0) ;set 2nd digit to 0
hi2cout (NUMTODIGIT, 2, 0) ;set 3rd digit to 0
hi2cout (NUMTODIGIT, 3, 0) ;set 4th digit to 0
hi2cout (DECIMALPOINT, 1, 1)
HI2CSETUP I2CMASTER, redDISPLAY, i2cfast, i2cbyte ; Initiaize RED 4x7 segment display
pause 200
hi2cout (NUMTODIGIT, 0, 0) ;set 1st digit to 0
hi2cout (NUMTODIGIT, 1, 0) ;set 2nd digit to 0
hi2cout (NUMTODIGIT, 2, 0) ;set 3rd digit to 0
hi2cout (NUMTODIGIT, 3, 0) ;set 4th digit to 0
hi2cout (DECIMALPOINT, 1, 1)
;TURN ALL START LIGHTS OFF
low Y1
low Y2
low Y3
low G1
low R1
low R2
low R3
low R4
suspend 2
suspend 4
suspend 6
suspend 7
;monitors the rest switch if pressed on boot it does a little test
IF PINC.5=1 THEN gosub test
resume 3
FLASHLED: ; FLASH READY LED
high READYLED ;turn the ready LED on
waitforpress:;monitors the start button and runs sequence when pressed
if start_sw = 1 then startlights ;jump when start switch is pressed
goto waitforpress ;else loop back around waiting for the start button to be pressed
STARTLIGHTS:
restart 2
RESTART 6
low READYLED ;TURNS READY LED OFF TO BE SAFE AS IT MIGHT BE IN THE ON STATE WHEN THE START SWITCH IS PRESSED.
;reser the RTC to Zero
i2cslave slvAddrWR, i2cslow, i2cbyte ;Initialize RTC
writei2c 2,(%00000000) ;reset minutes
writei2c 1,(%00000000) ;reset seconds
writei2c 3,(%00000000) ;reset milliseconds
pause 1000 ;wait 1 second
high Y1 ;1stamber on
pause 1000 ;wait 1 second
low Y1 ;1st amber off
high Y2 ;2nd amber on
pause 1000 ;wait 1 second
low Y2 ;2nd amber of
high Y3 ;3rd amber on
pause 1000 ;wait 1 second
low Y3 ;3rd amber off
high G1 ;green on
suspend 2 ;suspend task2 red start fault monitor as no longer needed
SUSPEND 6
i2cslave slvAddrWR, i2cslow, i2cbyte ;Initialize RTC
writei2c 2,(%00000000) ;reset minutes
writei2c 1,(%00000000) ;reset seconds
writei2c 3,(%00000000) ;reset milliseconds
pause 500 ;wait 0.5 second
low G1 ;turn green light off
if fault > 0 then goSUB FLASHGREEN ; if there has been a fault during the start this jumps and flashes green
restart 4
restart 7
pause 2000 ; give 2 seconds before monitoring for early releases
;restart 6
hehre: ;puts fault ligt on if red pass sensor has not been activated
if pass_red = 0 AND pinb.3 = 1 THEN
high R2
PAUSE 2000
low r2
ENDIF
goto hehre
start2: ;this task monitors for red start faults
IF PinB.3 = 1 then gosub redstartfault
GOTO START2
start3: ;monitor for reset button
if PINC.5 = 1 THEN reset
endif
goto start3
start4: ;this task writes the time to the red display
if pinB.3 = 1 then gosub writered ;jump if the input is on red start
goto START4 ;else loop back around
start6: ;puts fault ligt on if red pass sensor has not been activated
IF PINB.4 = 1 THEN GOSUB bluestartfault
GOTO START6
;if pass_red = 0 AND pinb.3 = 1 THEN
;high R2
;high y2
;PAUSE 2000
;low r2
;low y2
;ENDIF
start7:
if pinb.2 = 1 then
pass_red = 1
pause 2000
pass_red = 0
end if
goto start7
;##############ALL GOSUBS BELOW HERE #########################
;START6: ;monitors the rest switch and resets the picaxe if pressed.
;IF PINC.5=1 THEN RESET
;ENDIF
;GOTO START6
redstartfault:
HIGH R2 ;TURN ON RED START FAULT LIGHT
fault = 1
i2cslave slvAddrWR, i2cslow, i2cbyte
readi2c $0, (b1,b2,b3,b4,b5) ;get time from the RTC
;b1=control/status
;b2=hundredths
;b3=seconds
;b4=minutes
;b5=hours
b22 = b2
;b3 = 2 ; Test value 2.53 seconds
;symbol timeincentiseconds = w3
;symbol timeearly = w4 ; need Word if > 255 centi-secs
b10 = b22 / 16
b11 = b22 // 16
b12 = b3 / 16
b13 = b3 // 16
timeincentiseconds = b13 * 10 + b10 * 10 + b11
timeearly = 400 - timeincentiseconds
b1 = timeearly / 100 ; Seconds
b0 = timeearly // 100 ; Centi-seconds
;sertxd(#b1,".",#b0) ; Beware missing zero if b0 < 10
b3 = b0 / 10
b0 = b0 // 10
HI2CSETUP I2CMASTER, redDISPLAY, i2cfast, i2cbyte
hi2cout (NUMTODIGIT, 0, 16) ;set 1st digit to 0
hi2cout (NUMTODIGIT, 1, b1) ;set 2nd digit to 0
hi2cout (NUMTODIGIT, 2, b3) ;set 3rd digit to 0
hi2cout (NUMTODIGIT, 3, b0) ;set 4th digit to 0
hi2cout (DECIMALPOINT, 1, 1)
suspend 2
return
nosec:
;b3 = 0 ; set seconds to 0
b21 = 0
return
bluestartfault:
fault = 1
RETURN
bluepassfault:
HIGH R1 ;jump if the input is on
pause 2000
low r1
return
redpassfault:
HIGH R2 ;jump if the input is on
pause 2000
low r2
return
writered:
i2cslave slvAddrWR, i2cslow, i2cbyte
readi2c $0, (b1,b2,b3,b4,b5)
BCDTOASCII b2,b10,b11
b10 =b10 - $30
b11 = b11 - $30
BCDTOASCII b3,b12,b13
b12 =b12 - $30
b13 = b13 - $30
HI2CSETUP I2CMASTER, redDISPLAY, i2cfast, i2cbyte
hi2cout (NUMTODIGIT, 0, b12) ;set 1st digit to 0
hi2cout (NUMTODIGIT, 1, b13) ;set 2nd digit to 0
hi2cout (NUMTODIGIT, 2, b10) ;set 3rd digit to 0
hi2cout (NUMTODIGIT, 3, b11) ;set 4th digit to 0
if pinB.6 = 0 THEN
GOTO ENDNOW
ENDIF
pause 2000
return
writeblue:
i2cslave slvAddrWR, i2cslow, i2cbyte
readi2c $0, (b1,b2,b3,b4,b5)
BCDTOASCII b2,b10,b11
b10 =b10 - $30
b11 = b11 - $30
BCDTOASCII b3,b12,b13
b12 =b12 - $30
b13 = b13 - $30
HI2CSETUP I2CMASTER, blueDISPLAY, i2cfast, i2cbyte
hi2cout (NUMTODIGIT, 0, b12) ;set 1st digit to 0
hi2cout (NUMTODIGIT, 1, b13) ;set 2nd digit to 0
hi2cout (NUMTODIGIT, 2, b10) ;set 3rd digit to 0
hi2cout (NUMTODIGIT, 3, b11) ;set 4th digit to 0
pause 2000
return
FLASHGREEN:
;DO
;LOW G1
;PAUSE 500
;HIGH G1
;PAUSE 500
;LOW G1
;LOOP
PAUSE 2000
LOW R2
RETURN
test:
suspend 3
LET B2=1
DO
HIGH Y1
HIGH Y2
HIGH Y3
HIGH G1
HIGH R1
HIGH R2
HIGH R3
HIGH R4
HIGH READYLED
PAUSE 1000
LOW Y1
LOW Y2
LOW Y3
LOW G1
LOW R1
LOW R2
LOW R3
LOW R4
LOW READYLED
PAUSE 1000
inc b2
loop while b2 <5
RETURN
ENDNOW: ;THIS IS A FAILSAFE LOCATION ADDED TO THE END OF EVERY TASK
SUSPEND 0
SUSPEND 2
SUSPEND 3
SUSPEND 6
SUSPEND 7
OPS: ;monitor for reset button
if PINC.5 = 1 THEN reset
endif
goto OPS