You are on page 1of 13

Ngắt ngoài

Ngắt ngoài được tích hợp trên chân RB0/INT0, RB1/INT1, RB2/INT2
Các thanh ghi liên quan đến hoạt động ngắt ngoài

Chức năng các bit:


GIE: Cho phép ngắt toàn cục (INTCON)
PEIE: Cho phép ngắt ngoại vi (INTCON)
IPEN : Cho phép ưu tiên ngắt (RCON)
Ngoài ra với mỗi nguồn ngắt có thêm các bit :
IE : Bit cho phép ngắt
IE=0 : Cấm ngắt
IE=1 : Cho phép ngắt
IF : Bit cờ ngắt
IF=0 : Chưa có ngắt xảy ra.
IF=1 : Có ngắt xảy ra.
IP: Bit ưu tiên ngắt
IP=0: Ưu tiên thấp
IP=1: Ưu tiên cao
INT1IE, INT1IP, INT1IF; INT2IE, INT2IP, INT2IF trong INTCON3
Với ngắt ngoài 0: INT0IE, INT0IF trong INTCON luôn có mức ưu tiên cao
Ngắt ngoài INT0/1/2 có thêm bit lựa chọn sườn xung xảy ra ngắt trong
thanh ghi INTCON2
INTEDGx=0: Ngắt theo sườn âm (falling edge)
INTEDGx=1: Ngắt theo sườn dương (rising edge)

1. Bài tập:
// Hướng dẫn bài 1
#include <P18f4520.h>
#include <delays.h>
#include <usart.h>
#include <string.h>
//C?u h?nh cho vi đi?u khi?n, ví d?:
#pragma config OSC = HS
#pragma config MCLRE = ON
#pragma config WDT = OFF

#define LED1 PORTCbits.RC2


#define LED2 PORTCbits.RC4
//=== Chuong trinh con phuc vu ngat ===
// Vao trang 37 tai lieu User guide
void high_isr(void);
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}
#pragma code /* return to the default code section */
#pragma interrupt high_isr
void high_isr (void)
{
char i;
if(INTCON3bits.INT1IF==1) // Co ngat xay ra
{
LED1=0;// LED1 tat
for(i=0;i<10;i++)
{
LED2=1;
Delay10KTCYx(30);
LED2=0;
Delay10KTCYx(30);
}
INTCON3bits.INT1IF=0;
}
}
//=====================================

void main()
{
TRISC=0;
TRISB=0b00000010; //RB1 chieu vao
ADCON1=0x0F;
// Cau hinh ngat
INTCONbits.GIE=1;// Cho phep ngat toan cuc
INTCONbits.PEIE=1;// Cho phep ngat ngoai vi
INTCON3bits.INT1IE=1;// Cho phep ngat ngoai tren INT1
INTCON2bits.INTEDG1=0;// ngat theo suon am
//1 Ngat theo suon duong
while(1)
{
LED1=1;
Delay10KTCYx(30);
LED1=0;
Delay10KTCYx(30);
}
}

// Hướng dẫn bài 2


#include <P18f4520.h>
#include <delays.h>
#include <usart.h>
#include <string.h>
//C?u h?nh cho vi đi?u khi?n, ví d?:
#pragma config OSC = HS
#pragma config MCLRE = ON
#pragma config WDT = OFF

#define LED4 PORTCbits.RC7


int dem;
//=== Chuong trinh con phuc vu ngat ===
// Vao trang 37 tai lieu User guide
void high_isr(void);
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}
#pragma code /* return to the default code section */
#pragma interrupt high_isr
void high_isr (void)
{
char i;
if(INTCONbits.INT0IF==1) // Co ngat xay ra
{
dem++;
dem=dem%7;
PORTC=dem<<4;
INTCONbits.INT0IF=0;
}
}
//=====================================

void main()
{
TRISC=0;
TRISB=0b00000001; //RB0 chieu vao
ADCON1=0x0F;
// Cau hinh ngat
INTCONbits.GIE=1;// Cho phep ngat toan cuc
INTCONbits.PEIE=1;// Cho phep ngat ngoai vi
INTCONbits.INT0IE=1;// Cho phep ngat ngoai tren INT0
INTCON2bits.INTEDG0=0;// ngat theo suon am
//1 Ngat theo suon duong
while(1)
{
LED4=1;
Delay10KTCYx(30);
LED4=0;
Delay10KTCYx(30);
}
}
U1
2 15
RA0/AN0/C1IN- RC0/T1OSO/T13CKI
3 16
RA1/AN1/C2IN- RC1/T1OSI/CCP2B
4 17
RA2/AN2/C2IN+/VREF-/CVREF RC2/CCP1/P1A
5 18
RA3/AN3/C1IN+/VREF+ RC3/SCK/SCL
6 23
RA4/T0CKI/C1OUT RC4/SDI/SDA
7 24
RA5/AN4/SS/HLVDIN/C2OUT RC5/SDO
R1 R2 14
RA6/OSC2/CLKO RC6/TX/CK
25
10k 10k 13 26
RA7/OSC1/CLKI RC7/RX/DT
INT0 33 19
RB0/AN12/FLT0/INT0 RD0/PSP0
int0 INT2 34 20
RB1/AN10/INT1 RD1/PSP1
INT2 35 21
RB2/AN8/INT2 RD2/PSP2
36 22
RB3/AN9/CCP2A RD3/PSP3
37 27
RB4/KBI0/AN11 RD4/PSP4
38 28
RB5/KBI1/PGM RD5/PSP5/P1B
39 29
RB6/KBI2/PGC RD6/PSP6/P1C
40 30
RB7/KBI3/PGD RD7/PSP7/P1D
8
RE0/RD/AN5
9
RE1/W R/AN6
10
RE2/CS/AN7
1
RE3/MCLR/VPP
PIC18F4520

#include <P18f4520.h>
#include <delays.h>
#include <usart.h>
#include <string.h>
//C?u h?nh cho vi đi?u khi?n, ví d?:
#pragma config OSC = HS
#pragma config MCLRE = ON
#pragma config WDT = OFF

#define LED1 PORTBbits.RB3


#define LED2 PORTBbits.RB4
#define LED3 PORTBbits.RB5
#define LED4 PORTBbits.RB6
#define LED5 PORTBbits.RB7

//=== Chuong trinh con phuc vu ngat ===


// Vao trang 37 tai lieu User guide
void high_isr(void);
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}
#pragma code /* return to the default code section */
#pragma interrupt high_isr
void high_isr (void)
{
if(INTCONbits.INT0IF==1) // co ngat tren INT0
{
INTCONbits.INT0IF=0;// Xoa co ngat
LED5=1;
}
if(INTCON3bits.INT2IF==1) // co ngat tren INT0
{
INTCON3bits.INT2IF=0;// Xoa co ngat
LED5=0;
}
}

//=====================================

void main()
{
TRISC=0;
TRISB=0b000000101; //RB0 va RB2 chieu vao
ADCON1=0x0F;
// Cau hinh ngat
INTCONbits.GIE=1;// Cho phep ngat toan cuc
INTCONbits.PEIE=1;// Cho phep ngat ngoai vi
INTCON3bits.INT2IE=1;// Cho phep ngat ngoai tren INT1
INTCON2bits.INTEDG2=0;// ngat theo suon am
//1 Ngat theo suon duong
INTCONbits.INT0IE=1;// Cho phep ngat ngoai tren INT1
INTCON2bits.INTEDG0=0;// ngat theo suon am

while(1)
{
LED1=1; LED2=LED3=LED4=0;
Delay10KTCYx(30);
LED2=1; LED1=LED3=LED4=0;
Delay10KTCYx(30);
LED3=1; LED2=LED1=LED4=0;
Delay10KTCYx(30);
LED4=1; LED2=LED3=LED1=0;
Delay10KTCYx(30);
}
}

You might also like