Searching \ for 'Interrupt priority levels' in subject line. ()
Make payments with PayPal - it's fast, free and secure! Help us get a faster server
FAQ page: www.piclist.com/techref/microchip/ints.htm?key=interrupt
Search entire site for: 'Interrupt priority levels'.

Truncated match.
PICList Thread
'Interrupt priority levels'
1997\08\22@134220 by David Wong

picon face
What is the interrupt priority levels for the Pic's interrupts.  And how can
you change them?

Thanks
DWI

1997\08\22@135907 by Andy Kunz

flavicon
face
At 01:35 PM 8/22/97 -0400, you wrote:
>What is the interrupt priority levels for the Pic's interrupts.  And how can
>you change them?

Like this:

       org     4
ISR
       bcf     PCLATH,4
       btfsc   PCLATH,3                ; Copy PCLATH:3 to PCLATH:4
       bsf     PCLATH,4

       bcf     PCLATH,3                ; Clear PCLATH so we can jump on Page 0

       btfsc   RP0                     ; Back data bank?
       goto    :Page1Data              ; Yes, handle that part

       movwf   Save_W                  ; Save W
       swapf   STATUS,W                ; Save STATUS
       movwf   Save_Status
       goto    :SaveRegs               ; Save temp registers

:Page1Data
       bcf     RP0                     ; Point to data page 0
       movwf   Save_W                  ; Save W
       swapf   STATUS,W                ; Save STATUS
       movwf   Save_Status
       bsf     Save_Status,1           ; Fix bit in saved copy (works later)

:SaveRegs
       swapf   Save_W,F                ; Swap for later recall
       movf    FSR,W                   ; Save FSR
       movwf   Save_FSR

       ; Insert your registers to save here

; ISR DISPATCHER:
;       This routine loops through the interrupt flags in order of precedence
;       and calls each routine as required.  Looping allows me to minimize
;       interrupt latency when multiple interrupts are generated at- or near-
;       simultaneously.  Each interrupt servicer ends with a "return"
;       line to force proper operation.
;
;       The priority of the interrupts is sequence in the list, that is, TMR1 is
highest
;       priority in this example.

:ISRLoop                                ; ISRLoop:
       bcf     RP0

       btfss   TMR1IF                  ; if (TMR1IF)   - TMR1 interrupt
       goto    :Next3                  ;       {
       call    TMR1_ISR                ;       tmr1_isr ();
       goto    :ISRLoop                ;       goto ISRLoop;
:Next3                                  ;       }

       btfss   CCP1IF                  ; if (CCP1IF)   - CCP1 interrupt
       goto    :Next4                  ;       {
       call    CCP1_ISR                ;       ccp1_isr ();
       goto    :ISRLoop                ;       goto ISRLoop;
:Next4                                  ;       }

       btfss   CCP2IF                  ; if (CCP2IF)   - CCP2 interrupt
       goto    :Next5                  ;       {
       call    CCP2_ISR                ;       ccp2_isr ();
       goto    :ISRLoop                ;       goto ISRLoop;
:Next5                                  ;       }

       bsf     RP0                     ; if (TXIE)     - USART TX enabled?
       btfss   TXIE
       goto    :Next6
       bcf     RP0
       btfss   TXIF                    ;       if (TXIF)- USART TX interrupt
       goto    :Next6                  ;               {
       call    TBE_ISR                 ;               tbe_isr ();
       goto    :ISRLoop                ;               goto ISRLoop;
:Next6  bcf     RP0                     ;               }

       bsf     RP0                     ; if (RCIE)     - USART RX enabled?
       btfss   RCIE
       goto    :Next7
       bcf     RP0
       btfss   RCIF                    ;       if (RCIF)- USART RX interrupt
       goto    :Next7                  ;               {
       call    RBF_ISR                 ;               rbf_isr ();
       goto    :ISRLoop                ;               goto ISRLoop;
:Next7  bcf     RP0                     ;               }

;       btfss   INTF                    ; if (INTF)     - INT0 interrupt
;       goto    :Next1                  ;       {
;       call    INT0_ISR                ;       int0_isr ();
;       goto    :ISRLoop                ;       goto ISRLoop;
;:Next1                                 ;       }

       btfss   T0IF                    ; if (T0IF)     - TMR0 interrupt
       goto    :Next2                  ;       {
       call    TMR0_ISR                ;       tmr0_isr ();
       goto    :ISRLoop                ;       goto ISRLoop;
:Next2                                  ;       }

;
;----------------------
;
; Interrupt restore and exit routine

       movf    Save_FSR,W              ; Restore FSR
       movwf   FSR

       ; Insert your registers to restore here

       swapf   Save_Status,W           ; Restore STATUS
       movwf   STATUS
       bcf     RP0                     ; Point back to BANK0 for grabbing W
       swapf   Save_W,W                ; Restore W
       btfsc   Save_Status,1           ; Point back to correct data bank
       bsf     RP0

       bcf     PCLATH,3                ; Only needed if you LJMP'd off this ban
k

       btfsc   PCLATH,4                ; Copy jump bits back in again
       bsf     PCLATH,3
       retfie


==================================================================
Andy Kunz - Montana Design - 409 S 6th St - Phillipsburg, NJ 08865
         Hardware & Software for Industry & R/C Hobbies
       "Go fast, turn right, and keep the wet side down!"
==================================================================

More... (looser matching)
- Last day of these posts
- In 1997 , 1998 only
- Today
- New search...