Datasheet

PIC14000
DS40122B-page 82 Preliminary 1996 Microchip Technology Inc.
10.6 Interrupts
The PIC14000 has several sources of interrupt:
External interrupt from OSC1/PBTN pin
•I
2
C port interrupt
PORTC interrupt on change (pins RC<7:4> only)
Timer0 overflow
A/D timer overflow
A/D converter capture event
Programmable reference comparator interrupt
This section addresses the external and Timer0
interrupts only. Refer to the appropriate sections for
description of the serial port, programmable reference
and A/D interrupts.
INTCON records individual interrupt requests in flag
bits. It also has individual and global enable bits. The
peripheral interrupt flags reside in the PIR1 register.
Peripheral interrupt enable interrupts are contained in
the PIE1 register.
Global interrupt masking is controlled by GIE
(INTCON<7>). Individual interrupts can be disabled
through their corresponding mask bit in the INTCON
register. GIE is cleared on reset to mask interrupts.
When an interrupt is serviced, the GIE is cleared to
disable any further interrupt, the return address is
pushed onto the stack and the PC is loaded with
0004h, the interrupt vector. For external interrupt
events, such as the I
2
C interrupt, the interrupt latency
will be 3 or 4 instruction cycles. The exact latency
depends when the interrupt event occurs. The latency
is the same for 1 or 2 cycle instructions. Once in the
interrupt service routine the source(s) of the interrupt
can be determined by polling the interrupt flag bits. The
interrupt flag bit(s) must be cleared in software before
re-enabling interrupts to avoid infinite interrupt
requests. Individual interrupt flag bits are set
regardless of the status of their corresponding mask bit
or the GIE bit to allow polling.
The return from interrupt instruction, RETFIE, exits the
interrupt routine as well as sets the GIE bit to re-enable
interrupts.
Note 1: The individual interrupt flags will be set by
the specified condition even though the
corresponding interrupt enable bit is
cleared (interrupt disabled) or the GIE bit is
cleared (all interrupts disabled).
Note 2: If an interrupt occurs while the Global
Interrupt Enable (GIE) bit is being cleared,
the GIE bit may unintentionally be
re-enabled by the users Interrupt Service
Routine (the RETFIE instruction). The
events that would cause this to occur are:
1. An instruction clears the GIE bit while an
interrupt is acknowledged.
2. The program branches to the interrupt vector
and executes the Interrupt Service Routine.
3. The interrupt service routine completes with the
execution of the RETFIE instruction. This causes
the GIE bit to be set (enables interrupts), and the
program returns to the instruction after the one
which was meant to disable interrupts.
The method to ensure that interrupts are globally
disabled is:
1. Ensure that the GIE bit was cleared by the
instruction, as shown in the following code:
LOOP: BCF INTCON,GIE ; Disable Global Interrupts
BTFSC INTCON,GIE ; Global Interrupts Disabled?
GOTO LOOP ; No, try again
: ; Yes, continue with program
; flow
FIGURE 10-9: INTERRUPT LOGIC SCHEMATIC
PBIF
PBIE
ADCIF
ADCIE
I
2
CIF
I
2
CIE
OVFIF
OVFIE
CMIF
CMIE
T0IF
T0IE
PEIE
Wake-up (If in SLEEP mode)
or terminate long write
Interrupt to CPU
PEIF
RCIF
RCIE
GIE