'**************************************************************** '* Name : DT_INTS-18.bas * '* Author : Darrel Taylor * '* Notice : Copyright (c) 2003 * '* Version : 3.3 MAR 24, 2008 * '* Date : JUL 11, 2006 * '**************************************************************** '* Versions: * '* 3.3 : MAR 24, 2008 * '* Corrects an initialization problem affecting the * '* first pass if CLEAR is not used * '* 3.2 : Aug 26, 2007 * '* Update for PBP 2.50 using LONG's with PBPL * '* Added many new INT sources * '* 3.1 : JUL 18, 2006 * '* Modified to handle smaller BANKA in the newer chips* '**************************************************************** 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 PIR1, INT0IF ;-- INT0 External #define INT1_INT PIR5, INT0IF ;-- INT1 External #define INT2_INT PIR7, INT0IF ;-- INT2 External #define IOC_INT PIR0, IOCIF ;-- IOC INT Port Change #define TMR0_INT PIR3, TMR0IF ;-- TMR0 Overflow #define TMR1_INT PIR4, TMR1IF ;-- TMR1 Overflow #define TMR2_INT PIR4, TMR2IF ;-- TMR2 to PR2 Match #define TMR3_INT PIR6, TMR3IF ;-- TMR3 Overflow #define TMR4_INT PIR7, TMR4IF ;-- TMR4 Overflow #define TMR5_INT PIR8, TMR4IF ;-- TMR5 Overflow #define TMR6_INT PIR9, TMR6IF ;-- TMR6 Overflow #define TMR1G_INT PIR4, TMR1GIF ;-- TMR1 Gate #define TMR3G_INT PIR6, TMR3GIF ;-- TMR3 Gate #define TMR5G_INT PIR8, TMR5GIF ;-- TMR5 Gate #define U1TX_INT PIR3, TX1IF ;-- USART1 Transmit #define U2TX_INT PIR6, TX2IF ;-- USART2 Transmit #define U1_INT PIR3, U1IF ; -- USART1 #define U2_INT PIR6, U2IF ; -- USART2 #define U1RX_INT PIR3, RC1IF ;-- USART1 Receive #define U2RX_INT PIR6, RC2IF ;-- USART2 Receive #define U1E_INT PIR3, U1IF ; -- USART1 #define U2E_INT PIR6, U2IF ; -- USART2 #define C1_INT PIR1, C1IF ;-- Comparator1 #define C2_INT PIR5, C2IF ;-- Comparator2 #define NVM_INT PIR0, NVMIF ;-- EEPROM/FLASH Write Operation #define HLVD_INT PIR0, HLVDIF ;-- High/Low Voltage Detect #define AD_INT PIR1, ADIF ;-- A/D Converter #define CCP1_INT PIR4, CCP1IF ;-- CCP1 #define CCP2_INT PIR7, CCP2IF ;-- CCP2 #define CCP3_INT PIR9, CCP3IF ;-- CCP3 #define CCP4_INT PIR10, CCP4IF ;-- CCP4 #define OSF_INT PIR0, OSFIF ;-- Oscillator Fail #define CRC_INT PIR0, CRCIF ;-- Cyclic Redundancy Check #define SCAN_INT PIR0, OSFIF ; #define CSW_INT PIR0, CSWIF ; #define SW_INT PIR0, SWIF ; #define SMT1PWA_INT PIR1, SMT1PWAIF ; #define SMT1PRA_INT PIR1, SMT1PRAIF ; #define SMT1_INT PIR1, SMT1IF ; #define ADT_INT PIR1, ADTIF ; #define ZCD_INT PIR1, ZCDIF ;Zero Cross Detect #define I2C1RX_INT PIR2, I2C1RXIF ;I2C1 Receive #define SPI1_INT PIR2, SPI1IF ;Serial Peripherial Interface 1 #define SPI1TX_INT PIR2, SPI1TXIF ;Serial Peripherial Interface 1 TX #define SPI1RX_INT PIR2, SPI1RXIF ;Serial Peripherial Interface 1 RX #define DMA1A_INT PIR2, DMA1IF ; #define DMA1OR_INT PIR2, DMA1ORIF ; #define DMA1DCNT_INT PIR2, DMA1DCNTIF ; #define DMA1SCNT_INT PIR2, DMA1SCNTIF ; #define I2C1E_INT PIR3, I2C1EIF ; #define I2C1_INT PIR3, I2C1IF ; #define I2C1TX_INT PIR3, I2C1TXIF ; #define CLC1_INT PIR4, CLC1IF ; #define CWG_INT PIR4, CWGIF ; #define NCO1_INT PIR4, NCO1IF ; #define I2C2TX_INT PIR5, I2C2TXIF ; #define I2C2RX_INT PIR5, I2C2RXIF ; #define DMA2A_INT PIR5, DMA2IF ; #define DMA2OR_INT PIR5, DMA2ORIF ; #define DMA2DCNT_INT PIR5, DMA2DCNTIF ; #define DMA2SCNT_INT PIR5, DMA2SCNTIF ; #define I2C2E_INT PIR6, I2C2EIF ; #define I2C2_INT PIR6, I2C2IF ; #define CLC2_INT PIR7, CLC2IF ; #define CWG2_INT PIR7, CWG2IF ; #define CLC3_INT PIR9, CLC3IF ; #define CWG3_INT PIR9, CWG3IF ; #define CLC4_INT PIR10, CLC4IF ; 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 INT0IF ;----{ INT0 External Interrupt }----------[PIR1, INT0IF]--- INT_Source PIR1,INT0IF, PIE0,INT0IE, IPR1, INT0IP endif ifdef INT1IF ;----{ INT1 External Interrupt }---------[PIR5, INT1IF]--- INT_Source PIR5,INT1IF, PIE5,INT1IE, IPR5,INT1IP endif ifdef INT2IF ;----{ INT2 External Interrupt }---------[PIR7, INT2IF]--- INT_Source PIR7,INT2IF, PIE7,INT2IE, IPR7,INT2IP endif ifdef IOCIF ;----{ Port Change Interrupt }-----------[PIR0, IOCIF]--- INT_Source PIR0,IOCIF, PIE0,IOCIE, IPR0,IOCIP endif ifdef TMR0IF ;----{ TMR0 Overflow Interrupt }----------[PIR3, TMR0IF]--- INT_Source PIR3,TMR0IF, PIE3,TMR0IE, IPR3,TMR0IP endif ifdef TMR1IF ;----{ TMR1 Overflow Interrupt }------------[PIR4, TMR1IF]--- INT_Source PIR4,TMR1IF, PIE4,TMR1IE, IPR4,TMR1IP endif ifdef TMR2IF ;----{ TMR2 to PR2 Match Interrupt }--------[PIR4, TMR2IF]--- INT_Source PIR4,TMR2IF, PIE4,TMR2IE, IPR4,TMR2IP endif ifdef TMR3IF ;----{ TMR3 Overflow Interrupt }------------[PIR6, TMR3IF]--- INT_Source PIR6,TMR3IF, PIE6,TMR3IE, IPR6,TMR3IP endif ifdef TMR4IF ;----{ TMR4 Overflow Interrupt }------------[PIR7, TMR4IF]--- INT_Source PIR7,TMR4IF, PIE7,TMR4IE, IPR7,TMR4IP endif ifdef TMR5IF ;----{ TMR5 Overflow Interrupt }------------[PIR8, TMR5IF]--- INT_Source PIR8,TMR5IF, PIE8,TMR5IE, IPR8,TMR5IP endif ifdef TMR6IF ;----{ TMR6 Overflow Interrupt }------------[PIR9, TMR6IF]--- INT_Source PIR9,TMR6IF, PIE9,TMR6IE, IPR9,TMR6IP endif ifdef TMR1GIF ;----{ TMR1 Gate Interrupt }------------[PIR4, TMR1GIF]--- INT_Source PIR4,TMR1GIF, PIE4,TMR1GIE, IPR4,TMR1GIP endif ifdef TMR3GIF ;----{ TMR3 Gate Interrupt }------------[PIR6, TMR3GIF]--- INT_Source PIR6,TMR3GIF, PIE6,TMR3GIE, IPR6,TMR3GIP endif ifdef TMR5IF ;----{ TMR5 Gate Interrupt }------------[PIR8, TMR5GIF]--- INT_Source PIR8,TMR5GIF, PIE8,TMR5GIE, IPR8,TMR5GIP endif ifdef U1TXIF ;----{ USART1 Transmit Interrupt }-------------[PIR3, U1TXIF]--- INT_Source PIR1,U1TXIF, PIE1,U1TXIE, IPR1,U1TXIP endif ifdef U2TXIF ;----{ USART2 Transmit Interrupt }-----------[PIR6, U2TXIF]--- INT_Source PIR6,U2TXIF, PIE6,U2TXIE, IPR6,U2TXIP endif ifdef U1RXIF ;----{ USART1 Receive Interrupt }------------[PIR3, U1RXIF]--- INT_Source PIR3,U1RXIF, PIE3,U1RXIE, IPR3,U1RXIP endif ifdef U2RXIF ;----{ USART2 Receive Interrupt }------------[PIR6, U2RXIF]--- INT_Source PIR6,U2RXIF, PIE6,U2RXIE, IPR6,U2RXIP endif ifdef U1IF ;----{ UART1 Interrupt }-------------[PIR3, U1IF]--- INT_Source PIR1,U1IF, PIE1,U1IE, IPR1,U1IP endif ifdef U2IF ;----{ UART2 Interrupt }-----------[PIR6, U2IF]--- INT_Source PIR6,U2IF, PIE6,U2IE, IPR6,U2IP endif ifdef U1EIF ;----{ UART1 Framing Error Interrupt }-------------[PIR3, U1EIF]--- INT_Source PIR1,U1EIF, PIE1,U1EIE, IPR1,U1EIP endif ifdef U2EIF ;----{ UART2 Framing Error Interrupt }-----------[PIR6, U2EIF]--- INT_Source PIR6,U2EIF, PIE6,U2EIE, IPR6,U2EIP endif ifdef C1IF ;----{ Comparator 1 Interrupt }-----------------[PIR1, C1IF]--- INT_Source PIR1,C1IF, PIE1,C1IE, IPR1,C1IP endif ifdef C2IF ;----{ Comparator 2 Interrupt }-----------------[PIR5, C2IF]--- INT_Source PIR5,C2IF, PIE5,C2IE, IPR5,C2IP endif ifdef NVMIF ;----{ EEPROM/FLASH Write Operation Interrupt [PIR0, NVMIF]--- INT_Source PIR0,NVMIF, PIE0,NVMIE, IPR0,NVMIP endif ifdef DMA1AIF ;----{ Direct Memory Access 1 Interrupt [PIR2, DMA1AIF]--- INT_Source PIR2,DMA1AIF, PIE2,DMA1AIE, IPR2,DMA1AIP endif ifdef DMA2AIF ;----{ Direct Memory Access 2 Interrupt [PIR5, DMA2AIF]--- INT_Source PIR5,DMA2AIF, PIE5,DMA2AIE, IPR5,DMA2AIP endif ifdef DMA1ORIF ;----{ DMA 1 Over Run Interrupt [PIR2, DMA1ORIF]--- INT_Source PIR2,DMA1ORIF, PIE2,DMA1ORIE, IPR2,DMA1ORIP endif ifdef DMA2ORIF ;----{ DMA 2 Over Run Interrupt [PIR5, DMA2ORIF]--- INT_Source PIR5,DMA2ORIF, PIE5,DMA2ORIE, IPR5,DMA2ORIP endif ifdef DMA1DCNTIF ;----{ DMA 1 Designation Count Interrupt [PIR2, DMA1DCNTIF]--- INT_Source PIR2,DMA1DCNTIF, PIE2,DMA1DCNTIE, IPR2,DMA1DCNTIP endif ifdef DMA2DCNTIF ;----{ DMA 2 Designation Count Interrupt [PIR5, DMA2DCNTIF]--- INT_Source PIR5,DMA2DCNTIF, PIE5,DMA2DCNTIE, IPR5,DMA2DCNTIP endif ifdef DMA1SCNTIF ;----{ DMA 1 Source Count Interrupt [PIR2, DMA1SCNTIF]--- INT_Source PIR2,DMA1SCNTIF, PIE2,DMA1SCNTIE, IPR2,DMA1SCNTIP endif ifdef DMA2SCNTIF ;----{ DMA 2 Source Count Interrupt [PIR5, DMA2SCNTIF]--- INT_Source PIR5,DMA2SCNTIF, PIE5,DMA2SCNTIE, IPR5,DMA2SCNTIP endif ifdef HLVDIF ;----{ High/Low Voltage Detect Interrupt }--[PIR0, HLVDIF]--- INT_Source PIR0,HLVDIF, PIE0,HLVDIE, IPR0,HLVDIP endif ifdef ADIF ;----{ A/D Converter Interrupt }--------------[PIR1, ADIF]--- INT_Source PIR1,ADIF, PIE1,ADIE, IPR1,ADIP endif ifdef ADTIF ;----{ A/D Threshold Interrupt }--------------[PIR1, ADTIF]--- INT_Source PIR1,ADTIF, PIE1,ADTIE, IPR1,ADTIP endif ifdef SPI1IF ;----{ Synchronous Serial Port 1 Interrupt }---[PIR2, SPI1IF]--- INT_Source PIR2,SPI1IF, PIE2,SPI1IE, IPR2,SPI1IP endif ifdef SPI1TXIF ;----{ SPI Transmit Interrupt }---[PIR2, SPI1TXIF]--- INT_Source PIR2,SPI1TXIF, PIE2,SPI1TXIE, IPR2,SPI1TXIP endif ifdef SPI1RXIF ;----{ SPI Receive Interrupt }---[PIR2, SPI1RXIF]--- INT_Source PIR2,SPI1RXIF, PIE2,SPI1RXIE, IPR2,SPI1RXIP endif ifdef I2C1IF ;----{ I2C 1 Interrupt }---[PIR3, I2C1IF]--- INT_Source PIR3,I2C1IF, PIE3,I2C1IE, IPR3,I2C1IP endif ifdef I2C2IF ;----{ I2C 2 Interrupt }---[PIR6, I2C2IF]--- INT_Source PIR6,I2C2IF, PIE6,I2C2IE, IPR6,I2C2IP endif ifdef I2C1RXIF ;----{ I2C 1 Receive Interrupt }---[PIR2, I2C1RXIF]--- INT_Source PIR2,I2C1RXIF, PIE2,I2C1RXIE, IPR2,I2C1RXIP endif ifdef I2C2RXIF ;----{ I2C 2 Receive Interrupt }---[PIR5, I2C2RXIF]--- INT_Source PIR5,I2C2RXIF, PIE5,I2C2RXIE, IPR5,I2C2RXIP endif ifdef I2C1TXIF ;----{ I2C 1 Transmit Interrupt }---[PIR3, I2C1TXIF]--- INT_Source PIR3,I2C1TXIF, PIE3,I2C1TXIE, IPR3,I2C1TXIP endif ifdef I2C2TXIF ;----{ I2C 2 Transmit Interrupt }---[PIR5, I2C2TXIF]--- INT_Source PIR5,I2C2TXIF, PIE5,I2C2TXIE, IPR5,I2C2TXIP endif ifdef I2C1EIF ;----{ I2C 1 Error Interrupt }---[PIR3, I2C1EIF]--- INT_Source PIR3,I2C1EIF, PIE3,I2C1EIE, IPR3,I2C1EIP endif ifdef I2C2EIF ;----{ I2C 2 Error Interrupt }---[PIR6, I2C2EIF]--- INT_Source PIR6,I2C2EIF, PIE6,I2C2EIE, IPR6,I2C2EIP endif ifdef CCP1IF ;----{ CCP1 Interrupt }---------------------[PIR4, CCP1IF]--- INT_Source PIR4,CCP1IF, PIE4,CCP1IE, IPR4,CCP1IP endif ifdef CCP2IF ;----{ CCP2 Interrupt Flag }----------------[PIR7, CCP2IF]--- INT_Source PIR7,CCP2IF, PIE7,CCP2IE, IPR7,CCP2IP endif ifdef CCP3IF ;----{ CCP3 Interrupt Flag }----------------[PIR9, CCP3IF]--- INT_Source PIR9,CCP3IF, PIE9,CCP3IE, IPR9,CCP3IP endif ifdef CCP4IF ;----{ CCP4 Interrupt Flag }----------------[PIR10, CCP4IF]--- INT_Source PIR10,CCP4IF, PIE10,CCP4IE, IPR10,CCP4IP endif ifdef OSFIF ;----{ Osc Fail Interrupt Flag }-----------[PIR0, OSFIF]--- INT_Source PIR0,OSFIF, PIE0,OSFIE, IPR0,OSFIP endif ifdef CRCIF ;----{ Cyclic Redundancy Check Interrupt Flag }-----[PIR0, CRCIF]--- INT_Source PIR0,CRCIF, PIE0,CRCIE, IPR0,CRCIP endif ifdef SCANIF ;----{ SCAN Interrupt Flag }-----------[PIR0, SCANIF]--- INT_Source PIR0,SCANIF, PIE0,SCANIE, IPR0,SCANIP endif ifdef CSWIF ;----{ Clock Switch Interrupt Flag }-----------[PIR0, CSWIF]--- INT_Source PIR0,CSWIF, PIE0,CSWIE, IPR0,CSWIP endif ifdef SWIF ;----{ Software Interrupt Flag }-----------[PIR0, SWIF]--- INT_Source PIR0,SWIF, PIE0,SWIE, IPR0,SWIP endif ifdef SMT1IF ;----{ Signal Measurement Timer 1 Interrupt Flag }----[PIR1, SMT1IF]--- INT_Source PIR1,SMT1IF, PIE1,SMT1IE, IPR1,SMT1IP endif ifdef SMT1PWAIF ;----{ SMT 1 Pulse-Width Acquisition Interrupt Flag }----[PIR1, SMT1PWAIF]--- INT_Source PIR1,SMT1PWAIF, PIE1,SMT1PWAIE, IPR1,SMT1PWAIP endif ifdef SMT1PRAIF ;----{ SMT 1 Period Acquisition Interrupt Flag }----[PIR1, SMT1PRAIF]--- INT_Source PIR1,SMT1PRAIF, PIE1,SMT1PRAIE, IPR1,SMT1PRAIP endif ifdef ZCDIF ;----{ Zero Cross Detect Flag }-----------[PIR1, ZCDIF]--- INT_Source PIR1,ZCDIF, PIE1,ZCDIE, IPR1,ZCDIP endif ifdef CLC1IF ;----{ Configurable Logic Cell 1 Flag }-----------[PIR4, CLC1IF]--- INT_Source PIR4,CLC1IF, PIE4,CLC1IE, IPR4,CLC1IP endif ifdef CLC2IF ;----{ Configurable Logic Cell 2 Flag }-----------[PIR7, CLC2IF]--- INT_Source PIR7,CLC2IF, PIE7,CLC2IE, IPR7,CLC2IP endif ifdef CLC3IF ;----{ Configurable Logic Cell 3 Flag }-----------[PIR9, CLC3IF]--- INT_Source PIR9,CLC3IF, PIE9,CLC3IE, IPR9,CLC3IP endif ifdef CLC4IF ;----{ Configurable Logic Cell 4 Flag }-----------[PIR10, CLC4IF]--- INT_Source PIR10,CLC4IF, PIE10,CLC4IE, IPR10,CLC4IP endif ifdef CWG1IF ;----{ Complimentary Waveform Generagor 1 Flag }----[PIR4, CWG1IF]--- INT_Source PIR4,CWG1IF, PIE4,CWG1IE, IPR4,CWG1IP endif ifdef CWG2IF ;----{ Complimentary Waveform Generagor 2 Flag }----[PIR7, CWG2IF]--- INT_Source PIR7,CWG2IF, PIE7,CWG2IE, IPR7,CWG2IP endif ifdef CWG3IF ;----{ Complimentary Waveform Generagor 3 Flag }----[PIR9, CWG3IF]--- INT_Source PIR9,CWG3IF, PIE9,CWG3IE, IPR9,CWG3IP endif ifdef NCO1IF ;----{ CNumerically Controlled Oscillator 1 Flag }----[PIR4, NCO1IF]--- INT_Source PIR4,NCO1IF, PIE4,NCO1IE, IPR4,NCO1IP endif 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 RCON,IPEN, 0 ; Enable Interrupt Priorities 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) btfss INT_Enable_Reg, INT_Enable_Bit, 0 ; if INT is enabled goto NoInt 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 PREV_BANK = 0 if (Reset == YES) ; reset flag (if specified) 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) 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 ; bcf INT_Flag_Reg, INT_Flag_Bit, 0 ; clear the flag first 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 ifdef LOOKUP?WCLB Save_TBLPTR = 1 endif ifdef LOOKUP?WCLT Save_TBLPTR = 1 endif ifdef LOOKUP?WCLW Save_TBLPTR = 1 endif endasm OVER_DT_INTS_18: ;OVER_DT_INTS_18_K42: ENABLE DEBUG