100% found this document useful (3 votes)
485 views53 pages

PIC Part5 Interrupts

The document discusses interrupt programming on PIC microcontrollers. It describes how interrupts work on PICs, including the interrupt sequence, sources of interrupts on the PIC16F87X, and how the interrupt control register handles interrupt requests and enabling. It provides examples of interrupt vector tables, interrupt service routines for saving and restoring registers, polling for interrupt sources, and using interrupts in the CCS PIC C compiler.

Uploaded by

Jean Profite
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (3 votes)
485 views53 pages

PIC Part5 Interrupts

The document discusses interrupt programming on PIC microcontrollers. It describes how interrupts work on PICs, including the interrupt sequence, sources of interrupts on the PIC16F87X, and how the interrupt control register handles interrupt requests and enabling. It provides examples of interrupt vector tables, interrupt service routines for saving and restoring registers, polling for interrupt sources, and using interrupts in the CCS PIC C compiler.

Uploaded by

Jean Profite
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 53

PIC Basic Interrupt Structure and

Programming
Interrupt I/O

Interrupts capabilities are desirable when a


system must be responsive to external,
asynchronous events

CpE 112 : Klinkhachorn


Polling I/O
✔ Start device and poll for completion
Program Execution
.
.
Start Device

Input status
Poll and Wait
Until Device Ready

CpE 112 : Klinkhachorn


Interrupt I/O
✔ Start device and continue program execution

Program Execution
.
. ISR
Start Device Procedure
. For device
Service
. Routine
. .
. RETURN

CpE 112 : Klinkhachorn


PIC Interrupt Sequence

✔ When interrupt occurs


– CPU automatically pushes the return address in
the Program Counter on to the stack
– CPU clears the Global Interrupt Enable (GIE)
bit (disable further interrupts)
✔ This is it …..no other registers or W are
automatically set aside!!!!!

CpE 112 : Klinkhachorn


16F87X Interrupt
✔ The PIC16F87X family has up to 14
sources of interrupt.
Timer0 interrupt
External interrupt on RB0/INT (programmable edge trigger)
PortB change interrupt (RB7:RB4)
Parallel Slave Port interrupt
Analog to digital interrupt
UART Receive interrupt
UART Transmit Empty interrupt
Synchronous Serial Port interrupt

Compare/Capture/PWM-1 interrupt
Timer2 interrupt
Timer1 interrupt
EEPROM interrupt
Bus Collision(I2C) interrupt
Compare/Capture/PWM-2 interrupt
CpE 112 : Klinkhachorn
16F87X Interrupt Logic

CpE 112 : Klinkhachorn


Power-down Mode: SLEEP
✔ Power-down mode is entered by executing a
SLEEP instruction.
– If enabled, the Watchdog Timer will be cleared but
keeps running
• the PD/ bit (STATUS<3>) is cleared
• the TO/ (STATUS<4>) bit is set
– the oscillator driver is turned off
– the I/O ports maintain the status they had before the
SLEEP instruction was executed (driving high, low, or
hi-impedance)

CpE 112 : Klinkhachorn


Wake-up from SLEEP
✔ One of the following events can wake
up the CPU
– External reset input on MCLR/ pin
– Watchdog Timer Wake-up (if WDT was
enabled)
– Interrupt from INT pin, RB port change, or
some peripheral interrupts (e.g. PSP read/write,
TMR1, CCP, SSP, USART RX, TX, A/D, and
EEPROM write operation

CpE 112 : Klinkhachorn


Wake-up through an Interrupt Event

✔ The corresponding interrupt enable bit must


be set
– If global interrupt is disabled
• The CPU continues execution at the instruction after
the SLEEP instruction
– If global interrupt is enabled
• The CPU executes the instruction after the SLEEP
instruction and then branches to the interrupt vector
(004h)

CpE 112 : Klinkhachorn


Wake-up from SLEEP through Interrupt

CpE 112 : Klinkhachorn


Interrupt Control Register
✔ The interrupt control register (INTCON)
records individual interrupt requests in
flag bits
– It also has individual and global interrupt
enable bits.
7 0

CpE 112 : Klinkhachorn


Global Interrupt Enable
✔ A global interrupt enable bit, GIE (INTCON<7>)
enables (if set) all unmasked interrupts, or disables (if
cleared) all interrupts
– When bit GIE is enabled, and an interrupt’s flag bit and mask
bit are set, the interrupt will vector immediately
– Individual interrupts can be disabled through their
corresponding enable bits in various registers
– Individual interrupt bits are set, regardless of the status of
the GIE bit
✔ The GIE bit is cleared on RESET.
✔ The “return from interrupt” instruction, RETFIE, exits
the interrupt routine, as well as sets the GIE bit,
which reenables interrupts.

CpE 112 : Klinkhachorn


Code Template
✔ Explanatory remarks
✔ Assembler directives
✔ Equates to give names to numbers
✔ Variable definitions
✔ Reset and interrupt vector
✔ A table
✔ Mainline code and its subroutines
✔ Initialization code
✔ Interrupt service routine
– Systematic handling of W and STATUS
– Polling routine
– Specific interrupt handling subroutine

CpE 112 : Klinkhachorn


Reset and interrupt vector (same Page)

org H‘000’ ;Reset vector


goto mainline ;start main program

org H‘004’ ;Interrupt vector


goto IntService ;jump to ISR
;if the ISR is located in the same Program
; Memory bank of the main program otherwise
; save W, Status, PCLATH
; then select the proper bank (PCLATH<4:3>)
;before jump to ISR!

CpE 112 : Klinkhachorn


Initialization code for Interrupts

Mainline ….
….
;initialize any required registers and variables
;Enable any required interrupt mask, e.g. INTE.
;

bsf INTCON, INTE ; Enable external interrupt


…..
;Then enable Global Interrupt
bsf INTCON, GIE ; Enable global interrupts
CpE 112 : Klinkhachorn
Interrupt service routine (same Page)
IntService
;save W and Status Registers
movwf W_temp ; store W in W_Temp
swapf STATUS,W ;move status to W
;without affecting z bit!
movwf Status_Temp ;save STATUS
;Polling interrupt flag and goto specific interrupt handler routines
;do what it need to be done
.
;on exit
;restore STATUS and W then return
swapf Status_Temp,W ;restore STATUS (swap nibbles)
movwf STATUS ;without affecting z bit!
swapf W_temp,F ;swap W_temp
swapf W_temp, W ;swap again to restore W
;without affecting z bit
retfie ;Return to …. and reenable the interrupts
CpE 112 : Klinkhachorn
Reset and interrupt vector (different page)

org H‘000’ ;Reset vector


goto mainline ;start main program
org H‘004’ ;Interrupt vector
movwf W_temp ;store W in W_Temp
swapf STATUS,W ;move status to W without affecting z bit!
movwf Status_Temp ;save STATUS
swapf PCLATH, W ;move PCLATH to W without affecting z bit!
movwf PCLATH_Temp ;save PCLATH
bsf PCLATH,3 ;Switch to page 1
goto IntService ;jump to ISR

CpE 112 : Klinkhachorn


Interrupt service routine (different page)

IntService
;Polling interrupt flag and goto specific interrupt handler routines
;do what it need to be done
.
;on exit
; ON exit restore PCLATH, STATUS and W
swapf PCLATH_Te mp, W ;Restore PCLATH
m ovwf PCLATH ;Move W into PCLATH
swapf Status_Te mp,W ;Swap Status_Te mp register into W
;(sets data me mory bank to original state)

m ovwf STATUS ;Move W into STATUS register


swapf W_Tem p,F ;Swap W_Tem p
swapf W_Tem p, W ;Swap W_Tem p into W
Retif ;Bye

CpE 112 : Klinkhachorn


Interrupt: Polling and Service Interrupt

IntService
;Polling routine
btfsc Register_Nam e,Flag_bit;Arrange from the
;highest priority
;interrupt source
goto Interrupt_A ;if set, do it!
btfsc ... ;check next highest
;priority…
goto ... ;if set, go for it
.
.
;repeat until get to the lowest interrupt source
Done
;restore the necessary registers

CpE 112 : Klinkhachorn


Interrupt: CCS PIC C-Complier

#Priority rtcc,rb,.. ;set interrupt priority


;The highest is first

#INT_GLOBAL Na me() ;replace the co mplier


{ ;interrupt dispatcher
//your codes ;you must take care
} ;all of registers saving
;and etc.

CpE 112 : Klinkhachorn


Interrupt: CCS PIC C-Complier

#INT_xxx Na me()
{
; your codes
}
CCS support the following:
INT_EXT (External Interrupt)
INT_RTCC (Timer0 [RTCC] overflow)
INT_RB (Change on B4-B7 PIN)
INT_AD (A/D Converter)
INT_TIMER1 (Timer1 overflow)
INT_TIMER2 (Timer2 overflow)
INT_SSP (S mart Serial Port (SPI,I2C))
INT_PSP (Parallel Slave Port)
...

CpE 112 : Klinkhachorn


Interrupt: CCS PIC C-Complier

DISABLE_INTERRUPTS(XXX)
W here XXX is
Global (GIE)
INT_EXT (External Interrupt)
INT_RTCC (Timer0 [RTCC] overflow)
INT_RB (Change on B4-B7 PIN)
INT_AD (A/D Converter)
INT_TIMER1 (Timer1 overflow)
INT_TIMER2 (Timer2 overflow)
INT_SSP (S mart Serial Port (SPI,I2C))
INT_PSP (Parallel Slave Port)

Exa mple: disable_interrupts(global);

CpE 112 : Klinkhachorn


Interrupt: CCS PIC C-Complier

ENABLE_INTERR UPTS(XXX)
W here XXX is
Global (GIE)
INT_EXT (External Interrupt)
INT_RTCC (Timer0 [RTCC] overflow)
INT_RB (Change on B4-B7 PIN)
INT_AD (A/D Converter)
INT_TIMER1 (Timer1 overflow)
INT_TIMER2 (Timer2 overflow)
INT_SSP (S mart Serial Port (SPI,I2C))
INT_PSP (Parallel Slave Port)

Exa mple: enable_interrupts(global);

CpE 112 : Klinkhachorn


INT Interrupt (External)
✔ External interrupt on the RB0/INT pin is edge triggered
– rising, if bit INTEDG (OPTION_REG<6>) is set
– falling, if the INTEDG bit is clear
✔ When a valid edge appears on the RB0/INT pin, flag bit
INTF(INTCON<1>) is set
– can be disabled by clearing enable bit INTE (INTCON<4>)
✔ Flag bit INTF must be cleared in software in the interrupt service
routine before reenabling this interrupt
✔ The INT interrupt can wake-up the processor from SLEEP, if bit
INTE was set prior to going into SLEEP
– The status of global interrupt bit decides whether or not the
processor branches to the interrupt vector following wakeup.

CpE 112 : Klinkhachorn


External Interrupt: CCS PIC C-Complier

EXT_INT_EDGE(edge)
W here edge is
L_to_H
H_to_L

Exa mple: ext_int_edge(L_to_H);

CpE 112 : Klinkhachorn


EXT Interrupt : Example
✔ Rotary Encoder - rotary pulse generator (RPG)
– Applications
• Volume and Tone Control forAudio Visual Equipment
• Tuner for Communication Units
• Mode selection for Measurement

CpE 112 : Klinkhachorn


Rotary Encoder: Example
✔ Available in mechanical (few $) or optical ($10+)

CpE 112 : Klinkhachorn


Rotary Encoder: Example
✔ Phase Difference

One cycle

ON/OFF
determines CCW/CW
CpE 112 : Klinkhachorn
INT_EXT Interrupt : Example
Main Program
.
. . .
enable_interrupts(int_EXT);
enable_interrupts(global);
. . .

CpE 112 : Klinkhachorn


INT_EXT Interrupt : Example
#int_ext
EXT_INT_ISR()
{
// one interrupt per cycle
// determine direction by reading the another bit
// do what is necessary
// exit
}
Note: CCS will reset INTE flag and re-enable GIE.
These do not applied to #int_Global!

CpE 112 : Klinkhachorn


INT_RB Interrupt : Example

Port B <4:7> External Inputs

PIC16F877

CpE 112 : Klinkhachorn


INT_RB Interrupt : Example
Main Program
.
. . .
enable_interrupts(int_RB);
enable_interrupts(global);
. . .

CpE 112 : Klinkhachorn


INT_RB Interrupt : Example
#int_rb
RB_ISR()
{ Byte changes;
changes = last_b ^ port_b;
last_b = port_b;
if (bit_test(changes,4) && !bit_test(last_b,4))
{ // bit 4 went low do something….}
.
.
delay_ms(10); //debouncing! Not recommended!
}
Note: CCS will reset RBinterrupt flag and re-enable GIE.
These do not applied to #int_Global!
CpE 112 : Klinkhachorn
TIMERs/COUNTERs

✔ PIC16F877
–Timer0
–Timer1
–Timer2

CpE 112 : Klinkhachorn


Timer0 Module
• 8-bit timer/counter
• Readable and writable
• 8-bit software programmable prescaler
• Internal or external clock select
• Interrupt on overflow from FFh to 00h
• Edge select for external clock

CpE 112 : Klinkhachorn


Timer0/WDT Block diagram

CpE 112 : Klinkhachorn


Timer0 - Prescaler Assignment

CpE 112 : Klinkhachorn


Watch Dog Timer

✔ Run on internal RC
– If enable during SLEEP mode, WDT will
continue running and will be able to wake up
the processor on Time-out!
✔ With Prescaler (Post) set to 1:128, typical
maximum delay time can be approximately
18*128 ms or over 2 seconds!

CpE 112 : Klinkhachorn


Timer0 - TMR0 - Register
✔ All instructions writing to the TMR0 will clear
the prescaler count, but not change the
prescaler assignment!
– i.e. clrf TMR0, movwf TMR0, ….etc.
✔ The TMR0 interrupt is generated when the
TMR0 register overflows from FFh to 00h
✔ TMR0 interrupt cannot awaken the processor
from SLEEP (the timer is off during the
SLEEP)

CpE 112 : Klinkhachorn


Timer0 - Registers associated

CpE 112 : Klinkhachorn


Timer1 Module
• 16-bit timer/counter (TMR1H,TMR1L)
• Readable and writable (both)
• Internal or external clock select
• Interrupt on overflow from FFFFh to 0000h
• Reset from CCP module trigger
• Programmable Prescaler (1,2,4, and 8)
• Sync and Asyn Counter mode

CpE 112 : Klinkhachorn


Timer1Block diagram

CpE 112 : Klinkhachorn


Timer1 - T1CON - Control Register

CpE 112 : Klinkhachorn


Timer1 Oscillator
✔ Low power Oscillator rated upto 200kHz
– Primary intended for a 32kHz

✔ Will run during SLEEP

CpE 112 : Klinkhachorn


Timer1 - TMR1H:TMR1L
✔ The register pair (TMR1H:TMR1L)
increments from 0000h to FFFFH and rolls
over to 0000H
✔ Interrupt if enabled (TMR1IE) on overflow
(set TMR1IF)

CpE 112 : Klinkhachorn


Timer1 - Registers associated

CpE 112 : Klinkhachorn


Timer2 Module
• 8-bit timer (TMR2)
• 8-bit period register (PR2)
• Readable and writable (both)
• Interrupt on TMR2 match of PR2
• Programmable Prescaler (1,4, and 16)
• Programmable postscaler (1 to 16)
• Can be use as the PWM time-base for PWM mode of the
CCP module
• SSP module optional use of TMR2 output to generate clock
shift

CpE 112 : Klinkhachorn


Timer2 Block diagram

CpE 112 : Klinkhachorn


Timer2 - T2CON - Control Register

CpE 112 : Klinkhachorn


Timer2 - TMR2
✔ The prescaler and postscaler counters are
cleared when any of the following occurs:
– A write to the TMR2
– A write to the T2CON
– Any device reset
✔ TMR2 is not cleared when T2CON is written

CpE 112 : Klinkhachorn


Timer2 - Registers associated

CpE 112 : Klinkhachorn

You might also like