PIC 16F18877
Timer1 at 50ms intervals
Timer3 at 150ms intervals
Code:
Code:
'***************************************************************************************************
' *
' Generate trace on Interrupt on Logic Probe *
' *
' PIC 16F18877 *
' *
'***************************************************************************************************
#CONFIG
__config _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT32 & _CLKOUTEN_OFF & _CSWEN_OFF & _FCMEN_ON
__config _CONFIG2, _MCLRE_ON & _PWRTE_OFF & _LPBOREN_OFF & _BOREN_ON & _BORV_LO & _ZCD_OFF & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF
__config _CONFIG3, _WDTCPS_WDTCPS_11 & _WDTE_OFF & _WDTCWS_WDTCWS_7 & _WDTCCS_LFINTOSC
__config _CONFIG4, _WRT_OFF & _SCANE_available & _LVP_OFF
__config _CONFIG5, _CP_OFF & _CPD_OFF
#ENDCONFIG
;--- Interrupts ----------------------------------------------------------------
include "I:\Project_v2\PBP\PBP_Includes\DT_INTS-14_16F18877.bas"
include "I:\Project_v2\PBP\PBP_Includes\ReEnterPBP.bas"
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR1_INT, _Timer1Interrupt, PBP, yes
INT_Handler TMR3_INT, _Timer3Interrupt, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
INT_ENABLE TMR1_INT ;enables TMR1 interrupts
INT_ENABLE TMR3_INT ;enables TMR3 interrupts
ENDASM
DEFINE OSC 32
define CCP1_REG 0
DEFINE CCP1_BIT 0
define CCP2_REG 0
DEFINE CCP2_BIT 0
DEFINE CCP3_REG 0
DEFINE CCP3_BIT 0
define CCP4_REG 0
DEFINE CCP4_BIT 0
define CCP5_REG 0 ' Must clear unused CCP pins or else unpredictable results
DEFINE CCP5_BIT 0
RA4PPS = 0 ' Disable CCP5
RB0PPS = 0 ' Disable CCP4
RB5PPS = 0 ' Disable CCP3
RC1PPS = 0 ' Disable CCP2
RC2PPS = 0 ' Disable CCP1
T1CON = %00110001 ' 1:8 Prescale, Enables Timer1
T3CON = %00110001 ' 1:8 Prescale, Enables Timer3
' bit 7-6 Unimplemented: Read as ‘0’
' bit 5-4 CKPS<1:0>: Timer1 Input Clock Prescale Select bits
' ----> 11 = 1:8 Prescale value
' 10 = 1:4 Prescale value
' 01 = 1:2 Prescale value
' 00 = 1:1 Prescale value
' bit 3 Unimplemented: Read as ‘0’
' bit 2 SYNC: Timer1 Synchronization Control bit
' When TMR1CLK = FOSC or FOSC/4
' This bit is ignored. The timer uses the internal clock and no
' additional synchronization is performed.
' When TMR1CS<1:0> = (any setting other than FOSC or FOSC/4)
' 1 = Do not synchronize external clock input
' 0 = Synchronized external clock input with system clock
' bit 1 RD16: Timer1 On bit
' 1 = All 16 bits of Timer1 can be read simultaneously (TMR1H is buffered)
' 0 = 16-bit reads of Timer1 are disabled (TMR1H is not buffered)
' bit 0 ON: Timer1 On bit
' ----> 1 = Enables Timer1
' 0 = Stops Timer1 and clears Timer1 gate flip-flop
T1CLK = %00000001 ' FOSC/4 Timer1 Clock
T3CLK = %00000001 ' FOSC/4 Timer1 Clock
' bit 7-4 Unimplemented: Read as ‘0’
' bit 3-0 TxCS<3:0>: Timer1/3/5 Clock Select bits
' 1111 = LC4_out
' 1110 = LC3_out
' 1101 = LC2_out
' 1100 = LC1_out
' 1011 = TMR5 overflow output
' 1010 = TMR3 overflow output
' 1001 = TMR1 overflow output
' 1000 = TMR0 overflow output
' 0111 = CLKR output clock
' 0110 = SOSC
' 0101 = MFINTOSC ' 1.05msec @ 32MHz with no preload
' 0100 = LFINTOSC ' n/a
' 0011 = HFINTOSC ' 16.56msec @ 32MHz with no preload
' 0010 = FOSC ' 16.54msec @ 32MHz with no preload
' ----> 0001 = FOSC/4 ' 66.18msec @ 32MHz with no preload
' 0000 = TxCKIPPS
ANSELA = %00000000
ANSELB = %00000000
ANSELC = %00000000
ANSELD = %00000000
ANSELE = %00000000
TRISA = %00000000
TRISB = %00000000
TRISC = %00000000
TRISD = %00000000
TRISE = %00001000
Timer1Ended var byte
Timer3Ended var byte
Timer3Counter var byte
LatB.2 = 0 ' Set Timer1 trace low
LatB.0 = 0 ' Set Timer3 trace low
LatB.1 = 0 ' Set heartbeat trace low
pause 1
goto Start
;--- Interrupts ----------------------------------------------------------------
Timer1Interrupt:
T1CON.0 = 0 ' Stops Timer1
Timer1Ended = 1 ' Set flag
@ INT_RETURN
Timer3Interrupt:
T3CON.0 = 0 ' Stops Timer3
Timer3Ended = 1 ' Set flag
@ INT_RETURN
;--- Subroutines ---------------------------------------------------------------
StartTimer1:
@ INT_CLEAR TMR1_INT -- clear flags
TMR1H = 62 : TMR1L = 95 ' 50msec interval (32MHz, 16bit, 1:8)
T1CON.0 = 1 ' Starts Timer1
Timer1Ended = 0 ' Set flag
return
StartTimer3:
@ INT_CLEAR TMR1_INT -- clear flags
TMR3H = 62 : TMR3L = 95 ' 50msec interval (32MHz, 16bit, 1:8)
T3CON.0 = 1 ' Starts Timer3
Timer3Ended = 0 ' Set flag
return
Start:
GOSUB StartTimer1
LatB.2 = 1 ' Start Timer1 trace
Timer3Counter = 0
GOSUB StartTimer3
LatB.0 = 1 ' Start Timer3 trace
Main:
LatB.1 = 1 ' Pulse heartbeat
IF Timer1Ended = 1 THEN
LatB.2 = 0 ' Stop Timer1 trace
GOSUB StartTimer1
LatB.2 = 1 ' Start Timer1 trace
ENDIF
IF Timer3Ended = 1 THEN
Timer3Counter = Timer3Counter + 1
if Timer3Counter = 3 then
Timer3Counter = 0
LatB.0 = 0 ' Stop Timer3 trace
endif
GOSUB StartTimer3
LatB.0 = 1 ' Start Timer3 trace
ENDIF
LatB.1 = 0 ' Reset heartbeat trace
GOTO Main
end
Bookmarks