PIC18F67K40 DT_INTS that really work.


Results 1 to 12 of 12

Threaded View

  1. #1
    Join Date
    Jun 2017
    Posts
    27

    Post PIC18F67K40 DT_INTS that really work.

    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
    Attached Files Attached Files
    Last edited by csantex; - 9th September 2018 at 02:01. Reason: Display error, typos

Similar Threads

  1. DT_INTS for K42
    By mpgmike in forum Code Examples
    Replies: 29
    Last Post: - 7th June 2022, 17:29
  2. PIC18F67K40 Timer issues
    By csantex in forum General
    Replies: 5
    Last Post: - 29th July 2018, 05:19
  3. Dt_ints-14
    By iw2fvo in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 18th November 2013, 08:57
  4. Re: DT_Ints-18
    By Steve_88 in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 4th March 2012, 19:39
  5. help getting started with DT_INTS-14
    By E Kizer in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 2nd April 2009, 16:44

Members who have read this thread : 2

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts