You are on page 1of 34

NGẮT

(INTERRUPT)
GIỚI THIỆU NGẮT
GIỚI THIỆU NGẮT

 Ngắt là gì?
- Một cách để dừng vi xử lý khỏi bất cứ
công việc gì mà nó đang thực hiện
- Buộc nó làm một việc khác.
 Tại sao và những ứng dụng nào cần đến
ngắt?
- Phục vụ cho nhiều thiết bị giao tiếp.
- Các hệ thống đa nhiệm.
HOẠT ĐỘNG CỦA NGẮT

 Vi xử lý hay vi điều khiển luôn thực hiện


một chương trình thường gọi là chương
trình chính.
Chương trình phục vụ ngắt ISR (Interrupt
service routine)) xảy ra khi ?
- Có tác động bên ngoài bằng phần
cứng.
- Tác động bên trong làm cho vi xử lý
ngừng thực hiện chương trình chính
- Thực hiện một chương trình khác.
HOẠT ĐỘNG CỦA NGẮT

Sau khi thực hiện xong vi xử lý trở lại thực


hiện tiếp chương trình chính.
Quá trình là gián đoạn vi xử lý thực hiện
chương trình chính xem như là ngắt.
Có nhiều tác động làm ngừng chương trình
chính gọi là các nguồn ngắt.
HOẠT ĐỘNG CỦA NGẮT
HỎI VÒNG VÀ NGẮT

 Hỏi vòng: spolling.


- CPU giám sát các thiết bị được phục vụ
một cách liên tục, chờ đợi một cờ yêu cầu
được phục vụ (service request flag).
- Bất cứ khi nào nó yêu cầu, nó sẽ phục
vụ thiết bị đó và sau đó tiếp tục duy trì việc hỏi
vòng.
- CPU luôn “bận (busy)” với việc hỏi
vòng, với vòng lặp để thực hiện việc “có yêu
cầu nào không nhỉ ”.
HỎI VÒNG VÀ NGẮT

 Ngắt: Interrupt.
- Nếu một thiết bị sẵn sàng và cần được
chú ý, nó sẽ báo cho CPU biết.
- CPU ngừng bất cứ việc gì mà nó đang
thi hành và phục vụ thiết bị và sau đó trở lại
công việc trước đó của mình.
- CPU luôn “rỗi (free)” khi nó không phục
vụ ngắt.
NGẮT CỦA HỌ VI ĐIỀU KHIỂN 8051

Họ vi điều khiển 8051 có 5 nguồn ngắt :


- Ngắt ngoài từ chân #INT0
- Ngắt ngoài từ chân #INT1
- Ngắt ngoài do bộ Timer 0
- Ngắt ngoài do bộ Timer 1
- Ngắt do Port nối tiếp
Ngoài ra, riêng họ 8052,… còn có 1 nguồn
ngắt nữa là : ngắt ngoài do bộ Timer 2.
NGẮT CỦA HỌ VI ĐIỀU KHIỂN 8051

 Các nguồn ngắt này được xóa khi:


- Reset
- Được đặt riêng bằng phần miềm bởi
các bit trong các thanh ghi cho phép ngắt (IE),
ưu tiên ngắt (IP).
Nếu có 2 nguồn ngắt tác động đồng thời :
- Kiểm tra liên tiếp.
- Sử dụng chế độ ưu tiên.
THANH GHI CHO PHÉP NGẮT IE
THANH GHI CHO PHÉP NGẮT IE
THANH GHI ƯU TIÊN NGẮT IP
THANH GHI ƯU TIÊN NGẮT IP
MỨC ƯU TIÊN NGẮT TRONG 8051
CÁC CỜ CỦA CÁC NGUỒN NGẮT
VECTOR NGẮT
KHAI BÁO NGẮT TRONG KEIL C

Hàm ngắt là:


- Một hàm không có tham số.
- Không có kiểu trả về.
 Vì thực chất các biến mà hàm này thao tác
chính là các biến toàn cục (các thanh ghi, các
port).

www.themegallery.com
KHAI BÁO NGẮT TRONG KEIL C

Cấu trúc của một hàm nhắt như sau:

Trong đó:
- Những chữ in nghiêng bắt buộc phải
có.
- Using b có thể có hoặc không.
- Tên hàm tùy các bạn chọn.
www.themegallery.com
KHAI BÁO NGẮT TRONG KEIL C

a : là thứ tự của ngắt trong bảng vector ngắt


a = 0 : ngắt ngoài 0
a = 1 : ngắt timer 0
a = 2 : ngắt ngoài 1
a = 3 : ngắt timer 1
a = 4 : ngắt nối tiếp
www.themegallery.com
KHAI BÁO NGẮT TRONG KEIL C

b: là bank được chọn dùng để thực hiện


hàm ngắt.
Do 8051 có 4 bank là bank 0, 1, 2, 3.
Do đó : b có thể là một trong các giá trị 0, 1,
2, 3.

www.themegallery.com
KHAI BÁO NGẮT TRONG KEIL C

Lưu ý: nếu không viết thêm using b thì mặc


định là hàm ngắt thực hiện tại bank 0.
Do đó, một thí dụ về hàm ngắt nối tiếp sẽ có
dạng như sau:

www.themegallery.com
NGẮT DO CÁC BỘ TIMER

 Xảy ra do sự kiện tràn ở các Timer.


 Cờ tràn TFx =1.
 Khi ISR được đáp ứng, các cờ TFx sẽ tự
động xóa bởi phần mềm (TFx=0).
Khuôn mẫu một chương trình có sử dụng
ngắt viết bằng ngôn ngữ lập trình c như sau:

www.themegallery.com
NGẮT DO CÁC BỘ TIMER
#include <stdio.h> // các chương trình
#include<reg51.h> con phục vụ ngắt (ISR)
… Void ngatT0 (đối
số) interrupt a
// chương trình
chính {
Void main (void) // các câu lệnh
trong ISR
{
}
// khởi tạo thanh
ghi cho phép ngắt và ưu Trong đó: ngatT0 là
tiên ngắt tên của ISR (tùy chọn), a
là số hiệu ngắt tương
… ứng với vector ngắt.
} www.themegallery.com
NGẮT DO CÁC BỘ TIMER
Ví dụ1:Tạo 2 xung khác nhau trên P1.0 và P2.0
:

www.themegallery.com
NGẮT DO CÁC BỘ TIMER
#include <stdio.h> void main (void)
#include<reg51.h> {
sbit xung1=P1^0; TMOD=0x21; // Sử dụng Timer0
sbit xung2=P2^0; ở chế độ 1 và Timer1 ở chế độ 2.
Xung clock lấy từ bộ chia tần bên
void ngatT0 (void) interrupt 1 trong VĐK tạo ra.
{TR0=0; TH1 = TL1 = -100; // Cứ 100 us là
TH0=-10000/256; // Xung có chu lại tràn Timer 1.
kỳ 20000us. TR1=1; // Bắt đầu đếm
TL0=-10000%256; IE=0x8A; // Cho phép ngắt Timer
xung2=~xung2; // Nghịch đảo giá 0 và timer 1.
trị trước đó (để tạo xung) IP=0; // Không ưu tiên ngắt.
TR0=1; TF0=1; // Buộc ngắt do Timer 0.
} Để VĐK nhảy vào hàm ngắt
void ngatT1(void)interrupt 3 Timer0 và kích hoạt timer hoạt
{ động (TR0=1;)
xung1=~xung1; // Nghịch đảo giá }
trị trước đó (để tạo xung)
} www.themegallery.com
NGẮT DO CỔNG NỐI TIẾP

Xảy ra khi cờ ngắt phát (TI) hoặc cờ ngắt


thu (RI) được đặt lên 1.
Ngắt phát xảy ra khi bộ đệm truyền rỗng.
Ngắt thu xảy ra khi một ký tự đã được nhận
xong và đang đợi trong SBUF để được đọc
(bộ đệm truyền đầy).
Ví dụ 2: Viết chương trình dùng ngắt gửi đi 24
ký tự từ A đến Z trong bảng mã ASCII ra cổng
nối tiếp của VĐK.

www.themegallery.com
NGẮT DO CỔNG NỐI TIẾP
#include <stdio.h> void main (void)
#include<reg51.h> {
char x; TMOD=0x20; // Timer 1 ở chế
độ 1.
void ngatnt(void) interrupt 4 TH1=TL1=-24; // Tốc độ baud
{ là 1200;
if(x<='Z') TR1=1;
{ SCON=0x52; // UART 8 bit,
SBUF=x; chế độ 1, TI=1;
x=0x41;
++x;
IE=0x90; // Cho phép ngắt do
TI=0; cổng nối tiếp
} while(1);
} }
www.themegallery.com
NGẮT NGOÀI
NGẮT NGOÀI

Ví dụ 3: Giả sử chân INT1 được nối đến công


tắc bình thường ở mức cao. Mỗi khi nó ấn
xuống thấp phải bật một đèn LED ở chân
P1.3 (bình thường Led tắt), khi nó được bật
lên nó phải sáng vài giây. Chừng nào công tắc
được giữ ở trạng thái thấp đèn LED phải sáng
liên tục.

www.themegallery.com
NGẮT NGOÀI
NGẮT NGOÀI
#include<at89x51.h> //Khai void nutan(void) interrupt 2
báo thư viện cho VĐK 89x51 //Khai báo trình phục vụ ngắt
void main (void) ngoài 1
{
//Chương trình chính //(mặc định là ngắt theo
{ mức)
IE=0x84; //cho phép int a=50000; //Biến đếm trễ
ngắt ngoài 1 P1_3=0; //Cho Led sáng
while(1) //vòng lặp vô while(a--){}
hạn //Trễ cho Led sáng vài giây
{ P1_3=1; //Tắt Led
//không làm gì
} //Không cần xóa cờ ngắt
}
}
www.themegallery.com
NGẮT NGOÀI

Ví dụ 4: Giả sử chân INT1 được nối đến công


tắc bình thường ở mức cao. Mỗi khi để bật lại
đèn LED thì xung ở chân INT1 phải được đưa
lên cao rồi sau đó bị hạ xuống thấp để tạo ra
một sườn âm làm kích hoạt ngắt.(hình như ví
dụ 3)

www.themegallery.com
NGẮT NGOÀI
#include<at89x51.h> //Khai void nutan(void) interrupt 2
báo thư viện cho VĐK 89x51 //Khai báo trình phục vụ ngắt
void main (void) ngoài 1
//Chương trình chính {
{ //(mặc định là ngắt theo
mức)
IE=0x84; //cho phép
ngắt ngoài 1 int a=50000; //Biến đếm
trễ
IT1=1; //Thiết lập ngắt
ngoài 1 theo sườn âm P1_3=0; //Cho Led sáng
while(1) //vòng lặp vô while(a--){}
hạn //Trễ cho Led sáng vài giây
{ P1_3=1; //Tắt Led
//không làm gì //Không cần xóa cờ ngắt
} }
} www.themegallery.com

You might also like