BrianS
- 21st July 2014, 18:23
This code is written to choose between two time durations of 5 minutes and 30 seconds. A hardware switch is wired to RB4 which is pulled high. In one position the switch is open and the port is high. The other position pulls RB4 to ground. RB4 is coded for Interrupt on change. This switch will determine the time duration to use.
Ports RB0 and RB3 are outputs to leds. One will be on while the other is the off state. They switch states every time the timer reaches it's elapsed time of either 30 seconds or 5 minutes. whatever is set by RB4.
I had this code working for an 18F device and trying to get this same code to work for a 16F87 using DT_INTS-14. Nothing happens when running on the pic. The pic's clock it running fine. MCLR is pulled high as it should be. Would be appreciate it if someone could help.
DEFINE OSC 20
'Include "Modedefs.bas"
Include "DT_INTS-14.bas"
Include "ReEnterPBP.bas"
Include "Elapsed_INT.bas"
'#CONFIG
' __config _HS_OSC & _WDT_ON & _PWRTE_OFF & _BODEN_OFF & _LVP_OFF & _CPD_OFF
'#ENDCONFIG
TRISB = %11110110
TRISA = %111111
wsave VAR BYTE $70 SYSTEM
wsave1 VAR BYTE $A0 SYSTEM
wsave2 VAR BYTE $120 SYSTEM
wsave3 VAR BYTE $1A0 SYSTEM
PortsToggled var bit
Sel_Min var bit
Sel_Sec var bit
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR1_INT, _ClockCount, PBP, yes
INT_Handler RBC_INT, _RBC_INT_HANDLER, PBP, yes ; use for PBP type interrupts
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
@ INT_ENABLE TMR1_INT ; Enable Timer 1 Interrupts
@ INT_ENABLE RBC_INT
Gosub InitialState
Start:
if Sel_sec = 1 then
if SecondsChanged = 1 then
SecondsChanged = 0
If seconds = 30 then
Gosub TogglePorts
Gosub StopTimer
GoSub StartClock
endif
endif
else
if MinutesChanged = 1 then
MinutesChanged = 0
If Minutes = 5 then
Gosub TogglePorts
Gosub StopTimer
GoSub StartClock
endif
endif
endif
goto Start
end
RBC_INT_HANDLER:
PAUSE 10
Gosub StopTimer
GOSUB ResetTime
READ_SWITCH:
if Portb.4 = 0 then
Sel_Sec = 1
GoSub StartTimer
else
Sel_Sec = 0
GoSub StartTimer
endif
GOTO END_RBC_INT
PAUSE 5
GOTO READ_SWITCH
END_RBC_INT:
PAUSE 10
@ INT_CLEAR RBC_INT
@ INT_ENABLE RBC_INT
@ INT_RETURN
StartClock:
GOSUB ResetTime ' Reset Time to 0d-00:00:00.00
GOSUB StartTimer ' Start the Elapsed Timer
return
InitialState:
MinutesChanged = 0
SecondsChanged = 0
PortsToggled = 0
PortB.0 = 0
PortB.3 = 0
if Portb.4 = 0 then
Sel_Sec = 1
else
Sel_Sec = 0
endif
GoSub StartClock
return
TogglePorts:
if PortsToggled = 1 then
PortB.0 = 1
PortB.3 = 0
PortsToggled = 0
else
PortB.0 = 0
PortB.3 = 1
PortsToggled = 1
endif
return
Ports RB0 and RB3 are outputs to leds. One will be on while the other is the off state. They switch states every time the timer reaches it's elapsed time of either 30 seconds or 5 minutes. whatever is set by RB4.
I had this code working for an 18F device and trying to get this same code to work for a 16F87 using DT_INTS-14. Nothing happens when running on the pic. The pic's clock it running fine. MCLR is pulled high as it should be. Would be appreciate it if someone could help.
DEFINE OSC 20
'Include "Modedefs.bas"
Include "DT_INTS-14.bas"
Include "ReEnterPBP.bas"
Include "Elapsed_INT.bas"
'#CONFIG
' __config _HS_OSC & _WDT_ON & _PWRTE_OFF & _BODEN_OFF & _LVP_OFF & _CPD_OFF
'#ENDCONFIG
TRISB = %11110110
TRISA = %111111
wsave VAR BYTE $70 SYSTEM
wsave1 VAR BYTE $A0 SYSTEM
wsave2 VAR BYTE $120 SYSTEM
wsave3 VAR BYTE $1A0 SYSTEM
PortsToggled var bit
Sel_Min var bit
Sel_Sec var bit
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR1_INT, _ClockCount, PBP, yes
INT_Handler RBC_INT, _RBC_INT_HANDLER, PBP, yes ; use for PBP type interrupts
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
@ INT_ENABLE TMR1_INT ; Enable Timer 1 Interrupts
@ INT_ENABLE RBC_INT
Gosub InitialState
Start:
if Sel_sec = 1 then
if SecondsChanged = 1 then
SecondsChanged = 0
If seconds = 30 then
Gosub TogglePorts
Gosub StopTimer
GoSub StartClock
endif
endif
else
if MinutesChanged = 1 then
MinutesChanged = 0
If Minutes = 5 then
Gosub TogglePorts
Gosub StopTimer
GoSub StartClock
endif
endif
endif
goto Start
end
RBC_INT_HANDLER:
PAUSE 10
Gosub StopTimer
GOSUB ResetTime
READ_SWITCH:
if Portb.4 = 0 then
Sel_Sec = 1
GoSub StartTimer
else
Sel_Sec = 0
GoSub StartTimer
endif
GOTO END_RBC_INT
PAUSE 5
GOTO READ_SWITCH
END_RBC_INT:
PAUSE 10
@ INT_CLEAR RBC_INT
@ INT_ENABLE RBC_INT
@ INT_RETURN
StartClock:
GOSUB ResetTime ' Reset Time to 0d-00:00:00.00
GOSUB StartTimer ' Start the Elapsed Timer
return
InitialState:
MinutesChanged = 0
SecondsChanged = 0
PortsToggled = 0
PortB.0 = 0
PortB.3 = 0
if Portb.4 = 0 then
Sel_Sec = 1
else
Sel_Sec = 0
endif
GoSub StartClock
return
TogglePorts:
if PortsToggled = 1 then
PortB.0 = 1
PortB.3 = 0
PortsToggled = 0
else
PortB.0 = 0
PortB.3 = 1
PortsToggled = 1
endif
return