Code:
'****************************************************************
'* Name : DT_INTS-PIC18F67k40.bas *
'* Author : Darrel Taylor *
'* Notice : Copyright (c) 2003 *
'* Version : 1 *
'* Date : JUL 28, 20018 *
;****************************************************************
; Versions: 1 , DT_INTS-1818F67k40.bas *
; This code was specificaly modified to work with the *
; PIC18F67K40 only. *
; Modified by csantex with the help of other members of the *
; PicBasic forum: http://www.picbasic.co.uk/forum/ *
; I have used extensively with no issues running 5 interrupts *
; at a time. 3 of those interrupts had priorities enabled. *
'****************************************************************
DISABLE DEBUG
DEFINE INTHAND INT_ENTRY_H ' Context saving for High Priority Ints
DEFINE INTLHAND INT_ENTRY_L ' Context saving for Low Priority Ints
wsave var byte BANKA SYSTEM ' location for WREG
ssave var byte BANK0 SYSTEM ' location for STATUS register
bsave var byte BANK0 SYSTEM ' location for BSR register
psaveUH VAR BYTE BANK0 SYSTEM ' PCLATU Hi Pri.
psaveUL VAR BYTE BANK0 SYSTEM ' Lo Pri.
psaveH VAR BYTE BANK0 SYSTEM ' PCLATH Hi Pri.
psaveL VAR BYTE BANK0 SYSTEM ' Lo Pri.
fsave0H var WORD BANK0 SYSTEM ' locations for FSR registers
fsave1H var WORD BANK0 SYSTEM
fsave2H var WORD BANK0 SYSTEM
fsave0L var WORD BANK0 SYSTEM ' low priority FSR locations
fsave1L var WORD BANK0 SYSTEM
fsave2L var WORD BANK0 SYSTEM
RetAddrH VAR BYTE[3] BANKA SYSTEM ' 21-bit return address Hi Pri.
RetAddrL VAR BYTE[3] BANKA SYSTEM ' Lo Pri.
INT_Flags VAR BYTE BANKA SYSTEM
Serviced_H VAR INT_Flags.0
Serviced_L VAR INT_Flags.1
InHPint VAR INT_Flags.2
NoPriority VAR INT_Flags.3
INT_Flags = 0
goto OVER_DT_INTS_18
ASM
;____ Check for PBPL (PBP ver. 2.50 and above only)__________________________
PBPLongs_Used = 0
if (R1 - R0 == 4)
PBPLongs_Used = 1
; messg PBPL Used = 1
endif
nolist
;____ DEFINE available interrupt sources_____________________________________
#define INT0_INT PIR0, INT0IF ;-- INT0 External
#define INT1_INT PIR0, INT1IF ;-- INT1 External
#define INT2_INT PIR0, INT2IF ;-- INT2 External
#define INT3_INT PIR0, INT3IF ;-- INT3 External
#define TMR0_INT PIR0, TMR0IF ;-- TMR0 Overflow
#define IOC_INT PIR0, IOCIF ;-- Interrupt-on-Change Flag bit
#define OSC_INT PIR1, OSCFIF ;-- Oscillator Fail Interrupt Flag bit
#define CSW_INT PIR1, CSWIF ;-- Clock-Switch Interrupt Flag bit
#define ADT_INT PIR1, ADTIF ;-- ADC Threshold Interrupt Flag bit
#define AD_INT PIR1, ADIF ;-- ADC Interrupt Flag bit
#define ZCD_INT PIR2, ZCDIF ;-- Zero-Cross Detect Interrupt Flag bit
#define CMP1_INT PIR2, CM1IF ;-- Comparator1
#define CMP2_INT PIR2, CM2IF ;-- Comparator2
#define CMP3_INT PIR2, CM3IF ;-- Comparator3
#define HLVD_INT PIR2, HLVDIF ;-- High/Low Voltage Detect
#define RX1_INT PIR3, RC1IF ;-- USART1 Receive
#define RX2_INT PIR3, RC2IF ;-- USART2 Receive
#define TX1_INT PIR3, TX1IF ;-- USART1 Transmit
#define TX2_INT PIR3, TX2IF ;-- USART2 Transmit
#define BUS1_INT PIR3, BCL1IF ;-- Bus 1 Collision
#define BUS2_INT PIR3, BCL2IF ;-- Bus 2 Collision
#define SSP1_INT PIR3, SSP1IF ;-- Synchronous Serial Port 1
#define SSP2_INT PIR3, SSP2IF ;-- Synchronous Serial Port 2
#define RX3_INT PIR4, RC3IF ;-- USART3 Receive
#define RX4_INT PIR4, RC4IF ;-- USART4 Receive
#define RX5_INT PIR4, RC5IF ;-- USART5 Receive
#define TX3_INT PIR4, TX3IF ;-- USART3 Transmit
#define TX4_INT PIR4, TX4IF ;-- USART4 Transmit
#define TX5_INT PIR4, TX5IF ;-- USART5 Transmit
#define TMR8_INT PIR5, TMR8IF ;-- Timer 8
#define TMR7_INT PIR5, TMR7IF ;-- Timer 7
#define TMR6_INT PIR5, TMR6IF ;-- Timer 6
#define TMR5_INT PIR5, TMR5IF ;-- Timer 5
#define TMR4_INT PIR5, TMR4IF ;-- Timer 4
#define TMR3_INT PIR5, TMR3IF ;-- Timer 3
#define TMR2_INT PIR5, TMR2IF ;-- Timer 2
#define TMR1_INT PIR5, TMR1IF ;-- Timer 1
#define TMR7G_INT PIR6, TMR7GIF ;-- Timer 7 Gate
#define TMR5G_INT PIR6, TMR5GIF ;-- Timer 5 Gate
#define TMR3G_INT PIR6, TMR3GIF ;-- Timer 3 Gate
#define TMR1G_INT PIR6, TMR1GIF ;-- Timer 1 Gate
#define CCP1_INT PIR7, CCP1IF ;-- ECCP1
#define CCP2_INT PIR7, CCP2IF ;-- ECCP2
#define CCP3_INT PIR7, CCP3IF ;-- ECCP3
#define CCP4_INT PIR7, CCP4IF ;-- ECCP4
#define CCP5_INT PIR7, CCP5IF ;-- ECCP5
#define SCAN_INT PIR8, SCANIF ;-- Cyclical Reduncancy Check Scan
#define CRC_INT PIR8, CRCIF ;-- Cyclical Reduncancy Check Busy
#define NVM_INT PIR8, NVMIF ;-- EEPROM/FLASH Write Operation
#define CWG_INT PIR8, CWG1IF ;-- Complimentary Waveform Generator
#define SMT1_INT PIR9, SMT1IF ;-- Signal Measurement Timer1
#define SMT2_INT PIR9, SMT2IF ;-- Signal Measurement Timer2
#define SMT1PRA_INT PIR9, SMT1PRAIF ;-- Signal Measurement Timer1
#define SMT2PRA_INT PIR9, SMT2PRAIF ;-- Signal Measurement Timer2
#define SMT1WA_INT PIR9, SMT1WAIF ;-- Signal Measurement Timer1
#define SMT2WA_INT PIR9, SMT2WAIF ;-- Signal Measurement Timer2
ENDASM
asm
; -- macro --
INT_Source macro IFR, IFB, IER, IEB, IPR, IPB
if (IflagReg == IFR) && (IflagBit == IFB)
list
INT_Flag_Reg = IFR
INT_Flag_Bit = IFB
INT_Enable_Reg = IER
INT_Enable_Bit = IEB
INT_Priority_Reg = IPR
INT_Priority_Bit = IPB
Found = 1
endif
nolist
endm
endasm
asm
;____________________________________________________________________________
GetIntInfo macro IflagReg, IflagBit
nolist
INT_Flag_Reg = -1
INT_Flag_Bit = -1
INT_Enable_Reg = -1
INT_Enable_Bit = -1
ifdef IPR1
INT_Priority_Reg = -1
INT_Priority_Bit = -1
endif
Found = 0
ifdef TMR0IF ;----{ TMR0 Overflow }----------[PIR0, TMR0IF]---
INT_Source PIR0,TMR0IF, PIE0,TMR0IE, IPR0,TMR0IP
endif
ifdef INT0IF ;----{ INT0 External Interrupt }----------[INTCON, INT0IF]---
INT_Source PIR0,INT0IF, PIE0,INT0IE, IPR0, INT0IP
endif
ifdef INT1IF ;----{ INT1 External Interrupt }---------[INTCON, INT1IF]---
INT_Source PIR0,INT1IF, PIE0,INT1IE, IPR0,INT1IP
endif
ifdef INT2IF ;----{ INT2 External Interrupt }---------[INTCON, INT2IF]---
INT_Source PIR0,INT2IF, PIE0,INT2IE, IPR0,INT2IP
endif
ifdef INT3IF ;----{ INT3 External Interrupt }---------[INTCON, INT3IF]---
INT_Source PIR0,INT3IF, PIE0,INT3IE, IPR0,INT3IP
endif
ifdef IOCIF ;----{ Interrupt On Change Interrupt }------[INTCON, IOCIF]---
INT_Source PIR0,IOCIF, PIE0,IOCIE, IPR0,IOCIP
endif
ifdef TMR1IF ;----{ TMR1 to PR1 Match Interrupt }------------[PIR5, TMR1IF]---
INT_Source PIR5,TMR1IF, PIE5,TMR1IE, IPR5,TMR1IP
endif
ifdef TMR2IF ;----{ TMR2 to PR2 Match Interrupt }--------[PIR5, TMR2IF]---
INT_Source PIR5,TMR2IF, PIE5,TMR2IE, IPR5,TMR2IP
endif
ifdef TMR3IF ;----{ TMR3 to PR3 Match Interrupt }------------[PIR5, TMR3IF]---
INT_Source PIR5,TMR3IF, PIE5,TMR3IE, IPR5,TMR3IP
endif
ifdef TMR4IF ;----{ TMR4 to PR4 Match Interrupt }------------[PIR5, TMR4IF]---
INT_Source PIR5,TMR4IF, PIE5,TMR4IE, IPR5,TMR4IP
endif
ifdef TMR5IF ;----{ TMR5 to PR5 Match Interrupt }------------[PIR5, TMR5IF]---
INT_Source PIR5,TMR5IF, PIE5,TMR5IE, IPR5,TMR5IP
endif
ifdef TMR6IF ;----{ TMR6 to PR6 Match Interrupt }--------[PIR5, TMR6IF]---
INT_Source PIR5,TMR6IF, PIE5,TMR6IE, IPR5,TMR6IP
endif
ifdef TMR7IF ;----{ TMR7 Overflow Interrupt }------------[PIR5, TMR7IF]---
INT_Source PIR5,TMR7IF, PIE5,TMR7IE, IPR5,TMR7IP
endif
ifdef TMR8IF ;----{ TMR8 to PR8 Match Interrupt }------------[PIR5, TMR8IF]---
INT_Source PIR5,TMR8IF, PIE5,TMR8IE, IPR5,TMR8IP
endif
ifdef TX1IF ;----{ USART1 Transmit Interrupt }-----------[PIR3, TX1IF]---
INT_Source PIR3,TX1IF, PIE3,TX1IE, IPR3,TX1IP
endif
ifdef RC1IF ;----{ USART1 Receive Interrupt }------------[PIR3, RC1IF]---
INT_Source PIR3,RC1IF, PIE3,RC1IE, IPR3,RC1IP
endif
ifdef TX2IF ;----{ USART2 Transmit Interrupt }-----------[PIR3, TX2IF]---
INT_Source PIR3,TX2IF, PIE3,TX2IE, IPR3,TX2IP
endif
ifdef RC2IF ;----{ USART2 Receive Interrupt }------------[PIR3, RC2IF]---
INT_Source PIR3,RC2IF, PIE3,RC2IE, IPR3,RC2IP
endif
ifdef TX3IF ;----{ USART3 Transmit Interrupt }-----------[PIR4, TX3IF]---
INT_Source PIR4,TX3IF, PIE4,TX3IE, IPR4,TX3IP
endif
ifdef RC3IF ;----{ USART3 Receive Interrupt }------------[PIR4, RC3IF]---
INT_Source PIR4,RC3IF, PIE4,RC3IE, IPR4,RC3IP
endif
ifdef TX4IF ;----{ USART4 Transmit Interrupt }-----------[PIR4, TX4IF]---
INT_Source PIR4,TX4IF, PIE4,TX4IE, IPR4,TX4IP
endif
ifdef RC4IF ;----{ USART4 Receive Interrupt }------------[PIR4, RC4IF]---
INT_Source PIR4,RC4IF, PIE4,RC4IE, IPR4,RC4IP
endif
ifdef TX5IF ;----{ USART5 Transmit Interrupt }-----------[PIR4, TX5IF]---
INT_Source PIR4,TX5IF, PIE4,TX5IE, IPR4,TX5IP
endif
ifdef RC5IF ;----{ USART5 Receive Interrupt }------------[PIR4, RC5IF]---
INT_Source PIR4,RC5IF, PIE4,RC5IE, IPR4,RC5IP
endif
ifdef CM1IF ;----{ Comparator1 Interrupt }-----------------[PIR2, CM1IF]---
INT_Source PIR2,CM1IF, PIE2,CM1IE, IPR2,CM1IP
endif
ifdef CM2IF ;----{ Comparator2 Interrupt }-----------------[PIR2, CM2IF]---
INT_Source PIR2,CM2IF, PIE2,CM2IE, IPR2,CM2IP
endif
ifdef CM3IF ;----{ Comparator3 Interrupt }-----------------[PIR2, CM3IF]---
INT_Source PIR2,CM3IF, PIE2,CM3IE, IPR2,CM3IP
endif
ifdef BCL1IF ;----{ Bus 1 Collision Interrupt }-------------[PIR3, BCL1IF]---
INT_Source PIR3,BCL1IF, PIE3,BCL1IE, IPR3,BCL1IP
endif
ifdef BCL2IF ;----{ Bus 2 Collision Interrupt }-------------[PIR3, BCL2IF]---
INT_Source PIR3,BCL2IF, PIE3,BCL2IE, IPR3,BCL2IP
endif
ifdef HLVDIF ;----{ High/Low Voltage Detect Interrupt }-----[PIR2, HLVDIF]---
INT_Source PIR2,HLVDIF, PIE2,HLVDIE, IPR2,HLVDIP
endif
ifdef ADIF ;----{ ADC Converter Interrupt }--------------[PIR1, ADIF]---
INT_Source PIR1,ADIF, PIE1,ADIE, IPR1,ADIP
endif
ifdef ADTIF ;----{ ADC Threshold Interrupt }--------------[PIR1, ADTIF]---
INT_Source PIR1,ADTIF, PIE1,ADTIE, IPR1,ADTIP
endif
ifdef SSP1IF ;----{ Synchronous Serial Port1 Interrupt }---[PIR3, SSP1IF]---
INT_Source PIR3,SSP1IF, PIE3,SSP1IE, IPR3,SSP1IP
endif
ifdef SSP2IF ;----{ Synchronous Serial Port2 Interrupt }---[PIR3, SSP2IF]---
INT_Source PIR3,SSP2IF, PIE3,SSP2IE, IPR3,SSP2IP
endif
ifdef CCP1IF ;----{ CCP1 Interrupt }---------------------[PIR7, CCP1IF]---
INT_Source PIR7,CCP1IF, PIE7,CCP1IE, IPR7,CCP1IP
endif
ifdef CCP2IF ;----{ CCP2 Interrupt Flag }----------------[PIR7, CCP2IF]---
INT_Source PIR7,CCP2IF, PIE7,CCP2IE, IPR7,CCP2IP
endif
ifdef CCP3IF ;----{ CCP3 Interrupt Flag }----------------[PIR7, CCP3IF]---
INT_Source PIR7,CCP3IF, PIE7,CCP3IE, IPR7,CCP3IP
endif
ifdef CCP4IF ;----{ CCP4 Interrupt Flag }----------------[PIR7, CCP4IF]---
INT_Source PIR7,CCP4IF, PIE7,CCP4IE, IPR7,CCP4IP
endif
ifdef CCP5IF ;----{ CCP5 Interrupt Flag }----------------[PIR7, CCP5IF]---
INT_Source PIR7,CCP5IF, PIE7,CCP5IE, IPR7,CCP5IP
endif
ifdef OSCFIF ;----{ Osc Fail Interrupt Flag }-----------[PIR1, OSCFIF]---
INT_Source PIR1,OSCFIF, PIE1,OSCFIE, IPR1,OSCFIP
endif
ifdef CSWIF ;----{ CLOCK SWITCH Interrupt Flag }-----------[PIR1, CSWIF]---
INT_Source PIR1,CSWIF, PIE1,CSWIE, IPR1,CSWIP
endif
ifdef ZCDIF ;----{ ZERO CROSS DETECT Interrupt Flag }-----------[PIR2, ZCDIF]---
INT_Source PIR2,ZCDIF, PIE2,ZCDIE, IPR2,ZCDIP
endif
ifdef NVMIF ;----{ EEPROM/FLASH Write Operation Interrupt [PIR8, EEIF]---
INT_Source PIR8,NVMIF, PIE8,NVMIE, IPR8,NVMIP
endif
ifdef SMT1IF ;----{ Signal Measurement1 Interrupt Flag }-[PIR9, SMT1IF]---
INT_Source PIR9,SMT1IF, PIE9,SMT1IE, IPR9,SMT1IP
endif
ifdef SMT2IF ;----{ Signal Measurement2 Interrupt Flag }-[PIR9, SMT2IF]---
INT_Source PIR9,SMT2IF, PIE9,SMT2IE, IPR9,SMT2IP
endif
ifdef SMT1PRAIF;----{ Sig Meas1 Interrupt Flag }--------[PIR9, SMT1PRAIF]---
INT_Source PIR9,SMT1PRAIF, PIE9,SMT1PRAIE, IPR9,SMT1PRAIP
endif
ifdef SMT2PRAIF;----{ Sig Meas2 Interrupt Flag }--------[PIR9, SMT2PRAIF]---
INT_Source PIR9,SMT2PRAIF, PIE9,SMT2PRAIE, IPR9,SMT2PRAIP
endif
ifdef SMT1WAIF ;----{ Sig Meas1 Interrupt Flag }---------[PIR9, SMT1WAIF]---
INT_Source PIR9,SMT1WAIF, PIE9,SMT1WAIE, IPR9,SMT1WAIP
endif
ifdef SMT2WAIF ;----{ Sig Meas2 Interrupt Flag }---------[PIR9, SMT2WAIF]---
INT_Source PIR9,SMT2WAIF, PIE9,SMT2WAIE, IPR9,SMT2WAIP
endif
list
endm
list
endasm
;____[ if not using Low Priority INTS, create a dummy handler ]_______________
ASM
ifndef USE_LOWPRIORITY
INT_ENTRY_L
retfie
else
if (USE_LOWPRIORITY != 1)
INT_ENTRY_L
retfie
endif
endif
ENDASM
;_____________________________________________________________________________
Asm
asm = 0 ; Assembly language Interrupts
ASM = 0
Asm = 0
pbp = 1 ; Basic language interrupts
PBP = 1
Pbp = 1
YES = 1
yes = 1
Yes = 1
NO = 0
no = 0
No = 0
H equ 'H' ; High Priority
h equ 'H'
L equ 'L' ; Low Priority
l equ 'L'
nolist
;_____________________________________________________________________________
SaveFSR macro F, Pr
list
if (F >= 0) && (F <= 2)
if (Pr == H) || (Pr == L)
movff FSR#v(F)L, fsave#v(F)Pr
movff FSR#v(F)H, fsave#v(F)Pr + 1
nolist
else
ERROR "SaveFSR - Invalid Priority"
endif
else
ERROR "SaveFSR - Invalid FSR number"
endif
list
endm
ENDASM
;_____________________________________________________________________________
Asm
RestFSR macro F, Pr
list
if (F >= 0) && (F <= 2)
if (Pr == H) || (Pr == L)
movff fsave#v(F)Pr , FSR#v(F)L
movff fsave#v(F)Pr + 1 , FSR#v(F)H
nolist
else
ERROR "RestFSR - Invalid Priority"
endif
else
ERROR "RestFSR - Invalid FSR number"
endif
list
endm
ENDASM
;---[Stay compatible with the 14-bit version]---------------------------------
Asm
INT_FINISH_H macro
endm
EndAsm
;---[Create the High Priority Interrupt Processor]----------------------------
ASM
INT_CREATE_H macro
local OverCREATE
goto OverCREATE
Priority = H
INT_ENTRY_H
movff PCLATU, psaveUH
movff PCLATH, psaveH
SaveFSR 0, H
SaveFSR 1, H
SaveFSR 2, H
bsf _InHPint, 0
List_Start_H
bcf _Serviced_H, 0 ; Clear Serviced flag
clrf BSR
PREV_BANK = 0
ifdef INT_LIST_H
INT_LIST_H ; Expand the users list of HP INT handlers
else
ifdef INT_LIST
INT_LIST ; Expand the 16F Compatible List
else
error "INT_CREATE_H - INT_LIST or INT_LIST_H not found"
endif
endif
btfsc _Serviced_H,0 ; if anything was serviced
goto List_Start_H ; go around, and check again
ifdef ReEnterHPused ; was ReEnterPBP-18.bas included
GetAddress21 INT_EXIT_H, RetAddrH
L?GOTO _RestorePBP_H ; Restore PBP system Vars
endif
INT_EXIT_H
PREV_BANK = 0
bcf _InHPint, 0
RestFSR 0, H ; Restore FSR0, if it was saved?
RestFSR 1, H ; Restore FSR1, if it was saved?
RestFSR 2, H ; Restore FSR2, if it was saved?
movff psaveH, PCLATH
movff psaveUH, PCLATU
retfie FAST ; Return from Interrupt
OverCREATE
bsf INTCON,GIE;, 0 ; Enable High Priority Interrupts
bsf INTCON,PEIE;, 0 ; Enable Peripheral Interrupts
endm
;---[Stay compatible with the 14-bit version]---------------------------------
INT_CREATE macro
INT_CREATE_H
endm
ENDASM
;---[Create the Low Priority Interrupt Processor]-----------------------------
ASM
INT_CREATE_L macro
local OverCREATE
goto OverCREATE
ifdef USE_LOWPRIORITY
if (USE_LOWPRIORITY != 1)
error "'DEFINE USE_LOWPRIORITY 1' required for Low Priority Interrupts"
endif
else
error "'DEFINE USE_LOWPRIORITY 1' required for Low Priority Interrupts"
endif
Priority = L
INT_ENTRY_L
movff WREG, wsave ; Wreg
movff STATUS, ssave ; STATUS
movff BSR, bsave ; BSR
movff PCLATU, psaveUL
movff PCLATH, psaveL
SaveFSR 0, L ; FSR0
SaveFSR 1, L ; FSR1
SaveFSR 2, L ; FSR2
bcf _InHPint, 0
List_Start_L
clrf BSR
PREV_BANK = 0
bcf _Serviced_L, 0
ifdef INT_LIST_L
INT_LIST_L ; Expand the users list of HP INT handlers
else
error "INT_CREATE_L - INT_LIST_L not defined, can not create"
endif
btfsc _Serviced_L, 0 ; if anything was serviced
goto List_Start_L ; go around, and check again
ifdef ReEnterLPused ; was ReEnterPBP-18LP.bas included
GetAddress21 INT_EXIT_L, RetAddrL
L?GOTO _RestorePBP_L ; Restore PBP system Vars
endif
INT_EXIT_L
PREV_BANK = 0
RestFSR 0, L ; Restore saved vars
RestFSR 1, L
RestFSR 2, L
movff psaveUL, PCLATU
movff psaveL, PCLATH
movff bsave, BSR ; BSR
movff wsave, WREG ; WREG
movff ssave, STATUS ; STATUS
retfie ; Return from Interrupt
OverCREATE
bsf INTCON,IPEN;, 0 ; Enable Interrupt Priorities <CHANGE THIS
bsf INTCON,GIEL;, 0 ; Enable Low Priority Interrupts
endm
ENDASM
ASM
;---[Returns the Address of a Label as a Word]--(under 64K)------------------
GetAddress macro Label, Wout
CHK?RP Wout
movlw low Label ; get low byte
movwf Wout
movlw High Label ; get high byte
movwf Wout + 1
endm
;---[Returns the Address of a Label as a 3 byte array]---(under/over 64k)-----
GetAddress21 macro Label, Aout
CHK?RP Aout
movlw low Label ; get low byte
movwf Aout
movlw high Label ; get high byte
movwf Aout + 1
movlw upper Label ; get upper byte
movwf Aout + 2
endm
;---[find correct bank for a PBP BIT variable]-------------------------------
CHKRP?T macro reg, bit
CHK?RP reg
endm
;---[find Assigned Priority for specified INT Source]------------------------
INT_Count = 0
FindIntPriority macro IntFlagReg, IntFlagBit
local LoopCount
nolist
Pfound = 0
LoopCount = 1
while LoopCount <= INT_Count
if (IntFlagReg == PrList#v(LoopCount)R)
if (IntFlagBit == PrList#v(LoopCount)B)
list
Priority = PrList#v(LoopCount)Priority
Pfound = 1
endif
endif
LoopCount += 1
endw
endm
ENDASM
ASM
;---[Add an Interrupt Source to the user's list of INT Handlers]--------------
INT_Handler macro IntFlagReg, IntFlagBit, Label, Type, Reset
list
local AfterSave, AfterUser, NoInt
INT_Count += 1
PrList#v(INT_Count)R = IntFlagReg
PrList#v(INT_Count)B = IntFlagBit
PrList#v(INT_Count)Priority = Priority
GetIntInfo IntFlagReg, IntFlagBit
if (Found == YES)
CHK?RP INT_Enable_Reg ;ADD THIS
btfss INT_Enable_Reg, INT_Enable_Bit;, 0 ; if INT is enabled
goto NoInt
CHK?RP INT_Flag_Reg ;ADD THIS
btfss INT_Flag_Reg, INT_Flag_Bit;, 0 ; and the Flag set?
goto NoInt
if (Priority == H)
bsf _Serviced_H, 0
else
bsf _Serviced_L, 0
endif
ifdef NO_CLRWDT
if (NO_CLRWDT != 1)
CLRWDT
endif
else
CLRWDT
endif
if (Type == PBP) ; If INT handler is PBP
if (Priority == H)
ifdef ReEnterHPused
GetAddress21 AfterSave, RetAddrH
L?GOTO _SavePBP_H ; Save PBP system Vars in HP INT
else
error "ReEnterPBP-18 must be INCLUDEd to use High Priority PBP interrupts"
endif
else ; Priority = L
ifdef ReEnterLPused
GetAddress21 AfterSave, RetAddrL
L?GOTO _SavePBP_L ; Save PBP system Vars in LP INT
else
error "ReEnterPBP-18LP must be INCLUDEd to use Low Priority PBP interrupts"
endif
endif
endif
AfterSave
PREV_BANK = 0
if (Priority == H)
GetAddress21 AfterUser, RetAddrH
else ; Priority = L
GetAddress21 AfterUser, RetAddrL
endif
L?GOTO Label ; goto the users INT handler
AfterUser
if (Reset == YES) ; reset flag (if specified)
CHK?RP INT_Flag_Reg ;ADDED 7/26/18
bcf INT_Flag_Reg, INT_Flag_Bit;, 0
endif
else
error Interrupt Source (IntFlagReg,IntFlagBit) not found
endif
NoInt
clrf BSR
PREV_BANK = 0
endm
ENDASM
asm
;---[Returns from a "goto" subroutine]--(21-bit RetAddr? must be set first)---
INT_RETURN macro
local Ret2LP, Ret2HP
btfsc _InHPint, 0
goto Ret2HP
Ret2LP
movff RetAddrL + 2, PCLATU ; Load PC buffers with return address
movff RetAddrL + 1, PCLATH
movf RetAddrL, W;, 0
clrf BSR ; Set to BANK0 before returning
PREV_BANK = 0 ; Tell PBP about the BANK change
movwf PCL, 0 ; Go back to where we were
Ret2HP
movff RetAddrH + 2, PCLATU ; Load PC buffers with return address
movff RetAddrH + 1, PCLATH
movf RetAddrH, W;, 0
clrf BSR ; Set to BANK0 before returning
PREV_BANK = 0 ; Tell PBP about the BANK change
movwf PCL, 0 ; Go back to where we were
endm
;---[Enable an interrupt source]----------------------------------------------
INT_ENABLE macro IntFlagReg, IntFlagBit
GetIntInfo IntFlagReg, IntFlagBit
if (Found == YES)
FindIntPriority IntFlagReg, IntFlagBit
if (Pfound == 1)
if (INT_Priority_Reg != -1)
CHK?RP INT_Priority_Reg ;ADDED 7/26/18
if (Priority == H)
bsf INT_Priority_Reg, INT_Priority_Bit;, 0
else
if (Priority == L)
bcf INT_Priority_Reg, INT_Priority_Bit;, 0
else
error "INT_ENABLE - Invalid Priority Specified"
endif
endif
else
if (Priority == L)
error "INT0_INT can NOT be assigned to Low Priority"
endif
endif
else
error "INT_ENABLE - Priority State Not Found"
endif
bsf INT_Enable_Reg, INT_Enable_Bit;, 0 ; enable the INT source
else
error "INT_ENABLE - Interrupt Source not found!"
endif
endm
;---[Disable an interrupt source]---------------------------------------------
INT_DISABLE macro IntFlagReg, IntFlagBit
GetIntInfo IntFlagReg, IntFlagBit
if (Found == YES)
bcf INT_Enable_Reg, INT_Enable_Bit;, 0 ; disable the INT source
else
error "INT_DISABLE - Interrupt Source not found!"
endif
endm
;---[Clear an interrupt Flag]-------------------------------------------------
INT_CLEAR macro IntFlagReg, IntFlagBit
GetIntInfo IntFlagReg, IntFlagBit
if (Found == YES)
bcf INT_Flag_Reg, INT_Flag_Bit;, 0 ; clear the INT flag
else
error "INT_CLEAR - Interrupt Source not found!"
endif
endm
ENDASM
; ---[See if we need to save TBLPTR]------------------------------------------
ASM
Save_TBLPTR = 0
ifdef SIN_USED
Save_TBLPTR = 1
endif
ifdef DTMFOUT_USED
Save_TBLPTR = 1
endif
ifdef SERDELAY_USED
Save_TBLPTR = 1
endif
ifdef CONVBIT_USED
Save_TBLPTR = 1
endif
ifdef ERASECODE_USED
Save_TBLPTR = 1
endif
ifdef READCODE_USED
Save_TBLPTR = 1
endif
ifdef WRITECODE_USED
Save_TBLPTR = 1
endif
ifdef LOOKDOWN?BCLB
Save_TBLPTR = 1
endif
ifdef LOOKDOWN?BCLT
Save_TBLPTR = 1
endif
ifdef LOOKDOWN?BCLW
Save_TBLPTR = 1
endif
ifdef LOOKDOWN?CCLB
Save_TBLPTR = 1
endif
ifdef LOOKDOWN?CCLT
Save_TBLPTR = 1
endif
ifdef LOOKDOWN?CCLW
Save_TBLPTR = 1
endif
ifdef LOOKDOWN?WCLB
Save_TBLPTR = 1
endif
ifdef LOOKDOWN?WCLT
Save_TBLPTR = 1
endif
ifdef LOOKDOWN?WCLW
Save_TBLPTR = 1
endif
ifdef LOOK2_USED
Save_TBLPTR = 1
endif
ifdef LOOKUP?BCLB
Save_TBLPTR = 1
endif
ifdef LOOKUP?BCLT
Save_TBLPTR = 1
endif
ifdef LOOKUP?BCLW
Save_TBLPTR = 1
endif
ifdef LOOKUP?CCLB
Save_TBLPTR = 1
endif
ifdef LOOKUP?CCLT
Save_TBLPTR = 1
endif
ifdef LOOKUP?CCLW
Save_TBLPTR = 1
endif
ifdef LOOKUP?TCLB
Save_TBLPTR = 1
endif
ifdef LOOKUP?TCLT
Save_TBLPTR = 1
endif
ifdef LOOKUP?TCLW
Save_TBLPTR = 1
endif