Code:
'************************ 16F628A Configuration Fuses **************************
@ __CONFIG _BOREN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
' Brown-Out Detect - _BODEN_OFF, _BODEN_ON, _BOREN_OFF, _BOREN_ON
' Code Protection - _CP_OFF, CP_ON
' Data Code Protect - _DATA_CP_OFF, DATA_CP_ON
' Power-On Timer - _PWRTE_OFF, _PWRTE_ON
' Watchdog Timer - _WDT_OFF, _WDT_ON
' Low-Voltage Program - _LPV_OFF, _LVP_ON
' RA5/MCLR Function - _MCLRE_OFF, _MCLRE_ON
' Oscillator Selection - _RC_OSC_CLKOUT, _RC_OSC_NOCLKOUT, _ER_OSC_CLKOUT,
' _ER_OSC_NOCLKOUT, _INTOSC_OSC_CLKOUT, _INTOSC_OSC_NOCLKOUT,
' _INTRC_OSC_CLKOUT, _INTRC_OSC_NOCLKOUT, _EXTCLK_OSC,
' _HS_OSC, _XT_OSC, _LP_OSC
'
'*******************************************************************************
'---------------------------- Port Assignments --------------------------------
' porta.0 Output 3 LED
' porta.1 Output 1 LED
' porta.2 Run LED
' porta.3 Output 2 LED
' porta.4 Unused
' porta.5 Unused
' porta.6 Unused
' porta.7 Unused
' portb.0 Input 3
' portb.1 Input 2
' portb.2 Input 1
' portb.3 HPWM Output
' portb.4 Up Button
' portb.5 Down Button
' portb.6 Program Button
' portb.7 Debug Output
'---------------------------- EEPROM Locations --------------------------------
' 0 Output 1 Setting
' 1 Output 2 Setting
' 2 Output 3 Setting
'---------------------------- Debug Settings ----------------------------------
DEFINE DEBUG_REG PORTB ' Debug port
DEFINE DEBUG_BIT 4 ' Debug port bit
DEFINE DEBUG_BAUD 9600 ' Debug baud rate
DEFINE DEBUG_MODE 1 ' Debug mode 1 = inverted
DEFINE DEBUG_PACING 300 ' Delay 'in micro sec' between characters sent
i con 254 ' Control byte
clr con 1 ' Clear the display
line1 con 128 ' Move cursor to home position on line 1
line2 con 192 ' Move cursor to home position on line 2
'------------------------------- Variables -------------------------------------
StillPressed var bit
x var byte
Output1 var word
Output2 var word
Output3 var word
StartupDelay var byte
TimeOut var byte
Mode var byte ' Timer mode - 0 = 1-Shot Off Start
' 1 = 1-Shot On Start
' 2 = Repeating Off Start
' 3 = Repeating On Start
OffTimeUnits var byte[4]
OnTimeUnits var byte[4]
OffTime var word ' Off time dependant on units selected
OnTime var word ' On time dependant on units selected
OffTimeUnitSelect var byte ' Off time unit selector
OnTimeUnitSelect var byte ' On time unit selector
SetOnTime var word ' Programmed time to be on
SetOffTime var word ' Programmed time to be off
RelayOutput var bit ' Flag indicated relay status
'------------------------ Miscellaneous Variables ------------------------------
' porta.0
' porta.1
' porta.2
' porta.3
' porta.4
' porta.5
' portb.0
' portb.1
ProgramButton var portb.2
' portb.3
' portb.4
' portb.5
' portb.6
Relay var portb.7
'--------------------------- Port Initialization ------------------------------
TRISA = %10110000
TRISB = %11110111
CMCON = %00000111 ' Disable comparator
CCP1CON = %00000000 ' Enable PWM mode
OPTION_REG.7 = 0 ' Enable portb pull-ups
RCSTA.7 = 0 ' Disable serial port
DEFINE OSC 4
'----------------------------- Main Program Loop -------------------------------
data 65,129,194
include "Elapsed.pbp"
gosub ResetTime ' Reset Time to 0d-00:00:00.00
pause 250
clear
OffTimeUnitSelect = 0 ' 0=secs,1=mins,2=hrs,3=days,4=weeks
OnTimeUnitSelect = 0 ' 0=secs,1=mins,2=hrs,3=days,4=weeks
Mode = 2 ' 0=0-Shot Off Start
' 1=1-Shot On Start
' 2=Repeating Off Start
' 3=Repeating On Start
SetOffTime = 30 ' 30 seconds off
SetOnTime = 50 ' 50 seconds on
RelayOutput = 0 ' Relay is off
StartMenu:
Start:
gosub StartTimer ' Start the Elapsed Timer
gosub InitialState
if Mode = 1 then OneShotOnStart
if (Mode = 2) or (Mode = 3) then Repeating
OneShotOffStart:
gosub OffUnits
gosub OnUnits
if OnTime => SetOnTime then
low Relay
RelayOutput = 1
gosub StopTimer
gosub ResetTime
end
goto StartMenu
endif
goto OneShotOffStart
OneShotOnStart:
gosub OffUnits
gosub OnUnits
if OffTime => SetOffTime then
high Relay
RelayOutput = 0
gosub StopTimer
gosub ResetTime
end
goto StartMenu
endif
goto OneShotOnStart
Repeating: ' Repeating mode
gosub OffUnits
gosub OnUnits
if (OffTime => SetOffTime) and (RelayOutput = 1) then
lcdout $fe,1,"TIME LEFT ON "
gosub DisplayData
high Relay
RelayOutput = 0
gosub ResetTime
goto Repeating
endif
if (OnTime => SetOnTime) and (RelayOutput = 0) then
lcdout $fe,1,"TIME LEFT OFF "
gosub DisplayData
low Relay
RelayOutput = 1
gosub ResetTime
goto Repeating
endif
gosub DisplayData
goto repeating
InitialState:
if (Mode = 1) or (Mode = 3) then
RelayOutput = 1 ' Turn relay on
low Relay
else
RelayOutput = 0 ' Turn relay off
high Relay
endif
return
OffUnits:
select case OffTimeUnitSelect
case 0
OffTime = AccuSeconds
OffTimeUnits[0] = "S" : OffTimeUnits[1] = "E" : OffTimeUnits[2] = "C" : OffTimeUnits[3] = "S"
case 1
OffTime = AccuMinutes
OffTimeUnits[0] = "M" : OffTimeUnits[1] = "I" : OffTimeUnits[2] = "N" : OffTimeUnits[3] = "S"
case 2
OffTime = AccuHours
OffTimeUnits[0] = "H" : OffTimeUnits[1] = "R" : OffTimeUnits[2] = "S" : OffTimeUnits[3] = " "
case 3
OffTime = AccuDays
OffTimeUnits[0] = "D" : OffTimeUnits[1] = "A" : OffTimeUnits[2] = "Y" : OffTimeUnits[3] = "S"
end select
return
OnUnits:
select case OnTimeUnitSelect
case 0
OnTime = AccuSeconds
OnTimeUnits[0] = "S" : OnTimeUnits[1] = "E" : OnTimeUnits[2] = "C" : OnTimeUnits[3] = "S"
case 1
OnTime = AccuMinutes
OnTimeUnits[0] = "M" : OnTimeUnits[1] = "I" : OnTimeUnits[2] = "N" : OnTimeUnits[3] = "S"
case 2
OnTime = AccuHours
OnTimeUnits[0] = "H" : OnTimeUnits[1] = "R" : OnTimeUnits[2] = "S" : OnTimeUnits[3] = " "
case 3
OnTime = AccuDays
OnTimeUnits[0] = "D" : OnTimeUnits[1] = "A" : OnTimeUnits[2] = "Y" : OnTimeUnits[3] = "S"
end select
return
DisplayData:
if RelayOutput = 1 then
lcdout i,line2,dec (SetOnTime-OnTime)," ",OnTimeUnits[0],OnTimeUnits[1],OnTimeUnits[2],OnTimeUnits[3]
else
lcdout i,line2,dec (SetOffTime-OffTime)," ",OffTimeUnits[0],OffTimeUnits[1],OffTimeUnits[2],OffTimeUnits[3]
endif
return
Bookmarks