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
Bookmarks