Vous êtes sur la page 1sur 29

11-1

An

sh

ul

Sh
ar
m

Chapter 11: Interrupts


programming in
Assembly

PIC Microcontroller
and Embedded Systems
Muhammad Ali Mazidi,
Rolin McKinlay and
Danny Causey, February
2007.

Introduction

11-2

Interrupts are mechanisms which enable instant


response to events such as counter overflow, pin
change, data received, etc.

In normal mode, microcontroller executes the


main program as long as there are no
occurrences that would cause an interrupt.

Upon
interrupt,
microcontroller
stops
the
execution of main program and commences the
special part of the program(ISR) which will
analyze and handle the interrupt.

An

sh

ul

Sh
ar
m

11.1:PIC18 interrupts
PIC can serve multiple devices using mechanisms of

a
Sh
ar
m

PIC continuously monitors the status of each device

Each device get the attention of the CPU as the same level of priority

Wastes u-Controllers time by polling devices that do not need service.

Interrupt

ul

Polling

Devices get the attention of the CPU only when it needs a service

Can service many devices with different level of priorities

sh

An

11-3

When an interrupt is
invoked the uC runs the
Interrupt Service
Routine(ISR)

Interrupt vector table


holds the address of ISRs

sh

ul

Sh
ar
m

Interrupt service routine


(ISR)

Power-on Reset 0000h

High priority interrupt


0008h

Low priority interrupt


0018h

An

11-4

Steps in executing an
interrupt

Sh
ar
m

Upon activation of interrupt the microcontroller


Finishes executing the current instruction

Pushes the PC of next instruction in the stack

Jumps to the interrupt vector table to get the


address of ISR and jumps to it

Begin executing the ISR instructions to the last


instruction of ISR (RETFIE)

Executes RETFIE

sh

ul

An

Pops the PC from the stack

Starts to execute from the address of that PC

11-5

An

sh

ul

Sh
ar
m

Program organization in MPLAB

11-6

Sources of interrupts in PIC18


External hardware interrupts
Pins RB0(INT0),RB1(INT1),RB2(INT2)

PORTB change

Timers

Sh
ar
m

Timer0 , Timer1 ,Timer2

ADC (analog to digital converter)

CCP (compare capture pulse width modulation,


PWM)

Serial port TX and RC.

... etc

An

sh

ul

11-7

Enabling and disabling an


interrupt

When the PIC is powered on (or resets)


All interrupts are masked (disabled)

The default ISR address is 0008h

ul

interrupt priorities for interrupts

sh

No

Sh
ar
m

An

11-8

Enabling and disabling an


interrupt
In general, interrupt sources have three bits to
control their operation. They are:

Flag bit

Sh
ar
m

that allows program execution to branch to the


interrupt vector address when the flag bit is set

Priority bit

sh

Enable bit

An

ul

to indicate that an interrupt event occurred

to select high priority or low priority

11-9

Steps in enabling an
interrupt
Set the GIE bit from
INTCON REG

Set the IE bit for that


interrupt

If the interrupt is one of


the peripheral (timers 1,2
, serial,etc ) set PEIE bit
from INTCON reg

An

sh

ul

Sh
ar
m

1110

Sh
ar
m

11
11

An

sh

ul

Show the instructions to :


(a) enable (unmask) the Timer 0 interrupt and external hardware
interrupt 0 (INT0)
(b) disable (mask) the Timer 0 interrupt
(c) show how to disable (mask) all the interrupts with a single
instruction.

PROGRAMMING TIMER INTERRUPTS


Rollover timer flag and interrupt

sh

ul

Sh
ar
m

INTCON Register with Timer 0 Interrupt Enable and Interrupt Flag

An

Following points should be Noticed about Programing a


timer:

An

sh

ul

Sh
ar
m

1. We must avoid using the memory space allocated to the interrupt vector table. Therefore, we place all
the initialization codes in memory starting at an address such as 100H. The GOTO instruction is the
first instruction that the PIC18 executes when it is awakened at address 00000 upon power-on reset
(POR).
2. In the MAIN program, we enable (unmask) the Timer 0 interrupt, TMR0IE followed by the GIE to
enable all interrupts globally.
3. In the MAIN program, we initialize the Timer 0 register and then enter som other task which will
keep the CPU busy.
For example , the loop gets data from PORTC and sends it to PORTD. While the PORTC
data is brought in and issued to PORTD continuously, the TMR0IF flag is raised as soon as
Timer 0 rolls over, and the microcontroller gets out of the loop and goes to 00008H to
execute the ISR associated with Timer0.
At this point, the PIC18 clears the GIE bit (D7 of INTCON) to indicate that it is currently
serving an interrupt and cannot be interrupted again; in other words, no interrupt inside the
interrupt.
4. The ISR for Timer0 is located starting at memory location 00200H because it is too large to fit into
address space 08-l7H, the address allocated to high-priority interrupts.
5. In the ISR for Timer0, clearing of TMR0IF is needed before the RETFIE instruction. This will ensure
that a single interrupt is serviced once and is not recognized as multiple interrupts.
6. RETFIE must be the last instruction of the ISR. Upon execution of the RETFIE instruction, the PIC18
automatically enables the GIE (D7 of the INTCON register) to indicate that it can accept new
interrupts.

Programming Interrupt in C

11
14

Use "#pragma code" to place code at a specific ROM address.

Because the Cl8 does not place an ISR at the interrupt vector table automatically,
we must use Assembly language instruction GOTO at the interrupt vector to
transfer control to the ISR

This is done as follows:

#pragma code high_ vector =0x0008

GOTO my_isr
endasm

sh

asm

An

// High-priority interrupt location

ul

void My_ HiVect_ Int (void)

Sh
ar
m

}
#pragma code

//End of code

Now we redirect it from address location 00008 to another program to find


the source of the interrupt and finally to the ISR.

This is done with the help of the keyword interrupt as follows:


//interrupt is reserved keyword

void my_isr (void)

//used for high-priority interrupt

Sh
ar
m

#pragma interrupt my _isr


{

//C18 places RETFIE here automatically due to interrupt keyword

EXAMPLE

sh

ul

An

Use Timer 0 and Timer 1 interrupts to generate square waves on pins RB1 and
RB7, respectively, while data is being transferred from PORTC to PORTD.

#include <p18F458.h>
#define myPB1bit PORTBbits.RB1
#define myPB7bit PORTBbits.RB7
void T0_ISR(void);
void T1_ISR(void);
#pragma interrupt chk_isr

//used for high-priority interrupt only

void chk_isr (void)

Sh
ar
m

//Timer0 causes interrupt?

T0_ISR();

/Yes. Execute Timer0 ISR

if(PIR1bits.TMR1IF==1)

//Or was it Timer1?

T1ISR();

//Yes. Execute Timer1 ISR

sh

ul

if (INTCONbits.TMR0IF==1)

void My_ HiPrio_ Int (void)


{

// High-priority interrupt location

An

#pragma code My_ HiPrio_ Int =0x0008

_asm
GOTO my_isr
_endasm
} code
#pragma

//End of code

ul

sh

An

Sh
ar
m

//load TH0

TMR1L=0x00;

//load TL0

PIR1bits.TMR1IF=0;

//clear TF1

An

sh

ul

Sh
ar
m

TMR1H=0x35;

An

sh

ul

Sh
ar
m

External hardware interrupt

Example :
When a rising edge of the signal is
applied to pin INT0, the LED will
toggle

ul

sh

An

Sh
ar
m

sh

ul

Sh
ar
m

Negative Edge-triggered interrupts

An

Example :
Pin RBI (INTI) is connected to a pulse generator
and the pin RB7 is connected to an LED. The
program will toggle the LED on the falling edge of
the pulse

ul

sh

An

Sh
ar
m

Serial Communication
Interrupts
Flag Bit

Register

Enable Bit

Register

TXIF
(Transmit)

TXIF

PIR1

TXIE

PIE1

RCIF
(Receive)

RCIF

PIR1

RCIE

PIE1

ul

Sh
ar
m

Interrupt

An

sh

Serial Port Interrupt Flag Bits and Associated Registers

PIE1 Register Bits Holding TXIE and RCIE

Serial Interrupt Enable Flags


Example :

An

sh

ul

Sh
ar
m

PICl8 gets data from


PORTD and sends it to
TXREG continuously while
incoming data from the
serial port is sent to
PORTB. We assume that
XTAL = 10 MHz and the
baud rate= 9600.

ul

sh

An

Sh
ar
m

PORTB-CHANGE INTERRUPT
Differences between the PORTB-Change interrupt and INTO-INT2
interrupts:
(a) Each of the INTO-INT2 interrupts has its own pin and is
independent of the others. These interrupts use pins PORTB.O
(RBO), PORTB. l (RB I), and PORTB.2 (RB2), respectively. The
PORTB-change interrupt uses all four of the PORTB pins RB4PB7 and is considered to be a single interrupt even though it can
use up to four pins.

(b) While each of the INTO-INT2 interrupts has its own flag, and
is independent of the others, there is only a single flag for the
PORTB-Change interrupt.

( c) While each of the INTO-INT2 interrupts can be programmed


to trigger on the negative or positive edge, the PORTB-Change
interrupt causes an interrupt if any of its pins changes status from
HIGH to LOW, or LOW to HIGH.

An

sh

ul

Sh
ar
m

a
Sh
ar
m
ul
sh
An
PORTB-Change Interrupt Pins

An

sh

ul

Sh
ar
m

Example :
Connect SW1 and SW2 to pins RB4 and RB5 respectively. In this
program, the activation of SW1 and SW2 will result in changing
the state of LED I and LED2 respectively.

PORTB-Change Interrupt

ul

sh

An

Sh
ar
m

Vous aimerez peut-être aussi