Tải bản đầy đủ (.ppt) (16 trang)

Tài liệu môn kỹ thuật vi điều khiển 5

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (157.88 KB, 16 trang )

5. NGẮT (INTERUPT)


Mở đầu …
• Giới thiệu ngắt
• Ứng dụng của ngắt

Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng




BẢNG VECTOR NGẮT
• Các loại ngắt và bảng vector ngắt:








Reset hệ thống
Ngắt ngoài 0
Timer 0
Ngắt ngoài 1
Timer 1
Cổng nối tiếp
Timer 2

RST


IE0 Địa chỉ vector ngắt
TF0
IE1
TF1
RI hoặc TI
TF2 hoặc EXF2

Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng

0000H
0003H
000BH
0013H
001BH
0023H
002BH




Xử lý của CPU đối với 1 ngắt
Khi một ngắt xuất hiện và được CPU chấp nhận, chương trình
chính bị ngắt. Các thao tác sau đây xảy ra:
- Hoàn tất việc thực thi lệnh hiện hành
- Cất bộ đếm chương trình (PC) vào stack
- Trạng thái của ngắt hiện hành được lưu giữ lại
- Bộ đếm chương trình PC sẽ nạp địa chỉ của chương trình
con phục vụ ngắt và đi thực hiện.
- Thực hiện xong sẽ quay về chương trình chính tại vị trí nó bị
ngắt và thực hiện tiếp chương trình chính.


Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng




Thanh ghi cho phép ngắt IE (Interrupt Enable Register)
IE
D7

D6

D5

EA

D4

ET2
ES
Cho phép
ngắt do
Timer 2
Không sử
dụng

D2

ET1


Cho phép
ngắt toàn
cục

D3

D1

ET0
EX1

Cho phép
ngắt do
Timer 1

Cho phép
ngắt do port
nối tiếp

Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng

D0

EX0
Cho phép
ngắt do
Timer 0

Cho phép
ngắt

ngoài 1

Cho phép
ngắt
ngoài 0




Thanh ghi ưu tiên ngắt IP (Interrupt Priority Register)
IP
D7

D6

D5

D4

D3

PT2

Không sử
dụng

D2

PT1


Không sử
dụng

PS
Ưu tiên
ngắt cho
Timer 2

D1

PT0
PX1

Ưu tiên
ngắt cho
Timer 1

Ưu tiên ngắt
do port nối
tiếp
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng

D0

PX0
Ưu tiên
ngắt cho
Timer 0

Ưu tiên

ngắt
ngoài 1

Ưu tiên
ngắt
ngoài 0



LẬP TRÌNH NGẮT
1. Lập trình với ngắt timer
• Timer 0
• Timer 1

2. Lập trình với ngắt ngoài
• Ngắt ngoài 0
• Ngắt ngoài 1
• Ngắt ngoài theo sườn xuống và theo mức 0

3. Ưu tiên ngắt
• Thứ tự ưu tiên thực hiện các ngắt
• Lập trình theo đổi ưu tiên các ngắt

Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng




1. Lập trình ngắt timer
IE – Interrupt Enable Register


EA

-

ET2

ES

ET1

EX1

ET0

EX0

• Bước 1:
1 Chọn chế độ hoạt động của timer như ở phần lập
trình cho timer
• Bước 2:
2 Cho phép ngắt:
• Cho phép ngắt do timer
ET0 = 1; // Nếu sử dụng ngắt timer 0
ET1 = 1; // Nếu sử dụng ngắt timer 1

• Cho phép ngắt toàn cục
EA = 1; // Bắt buộc phải có khi sử dụng bất cứ ngắt nào.

• Bước 3:

3 Viết chương trình phục vụ ngắt Timer.
Chương trình phục vụ ngắt do timer được đặt ở các vector ngắt
000Bh (Timer 0)
001Bh (Timer 1).
Các chương trình con phục vụ ngắt cũng giống như các chương trình con khác, tuy nhiên
nó được kết thúc bằng lệnh RETI (Return from Interrupt) thay vì lệnh RET.
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng




Ví dụ 1:
Viết chương trình nháy LED nối ở chân P1.0 với chu kỳ 500us sử dụng ngắt
timer 0. (Thạch anh 12Mhz).
ORG 0000H
LJMP MAIN

ASM

ORG 001BH
LJMP T0_ISR
ORG 0030H
MAIN:
MOV TMOD, #00000010B; Chế độ 2
MOV TH0, #55
MOV TL0, #55
CLR TF0; Xóa cờ tràn
SETB ET0
SETB EA
SETB TR0; Khởi động Timer 0

JMP $
T0_ISR:
CPL P1.0
RETI

C
void main() {
TMOD = 0x02; // Timer 0 ở chế độ 2
TH0 = 5;
TL0 = 5; // Nạp giá trị cho TH0,
TF0 = 0;
// Xóa cờ tràn
ET0 = 1;
EA =1;
TR0 = 1;
// Khởi động Timer 0
while(1) continue;
}
void T0_ISR() interrupt 1 {
P1_0 = !P1_0;
}

Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng




Ví dụ 2:
Viết chương trình tạo xung vuông ở chân P1.0 với tần số 500Hz sử dụng ngắt
timer 1. Thạch anh 12Mhz.


C

ASM

ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T1_ISR
ORG 0030H
MAIN:
MOV TMOD, #00010000B;Timer 1 chế độ 1
MOV TH1, #HIGH(-1000)
MOV TL1, #LOW(-1000)
CLR TF1; Xóa cờ tràn
SETB ET1
SETB EA
SETB TR1; Khởi động Timer 0
JMP $
T1_ISR:
CLR TR1; Dừng bộ định thời
MOV TH1, #HIGH(-1000); Nạp lại
MOV TL1, #LOW(-1000)
CPL P1.0
SETB TR1; Khởi động timer 0
RETI

void main() {
TMOD = 0x10; // Timer 1 ở chế độ 1
TH1 = 0xFC;

TL1 = 0x17; // Nạp giá trị cho
TF1 = 0;
// Xóa cờ tràn
ET1 = 1;
EA = 1;
TR1 = 1;
// Khởi động Timer 1
while(1) continue;
}
void T1_ISR() interrupt 3 {
TR1 = 0; // Dừng bộ định thời
TH1 = 0xFC;
TL1 = 0x17; // Nạp lại
P1_0 = !P1_0;
TR1 = 1; // Khởi động bộ định thời
}

Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng




2. Lập trình ngắt ngoài
IE – Interrupt Enable Register
EA

-

ET2


ES

ET1

EX1

ET0

EX0

+ Lập trình cho ngắt ngoài 0
Cho phép ngắt ngoài 0

EX0 = 1;

Cho phép ngắt toàn cục

EA = 1;

Viết chương trình phục vụ ngắt ngoài 0
+ Lập trình cho ngắt ngoài 1
Cho phép ngắt ngoài 0
EX1 = 1;
Cho phép ngắt toàn cục EA = 1;
Viết chương trình phục vụ ngắt ngoài 1
+ Ngắt ngoài có 2 kiểu:
Ngắt bằng mức 0
Ngắt bằng sườn xuống
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng





Kích hoạt ngắt ngoài
Bằng sườn xuống hoặc bằng mức 0 ở chân ngắt ngoài
TCON – Timer/Counter Control Register

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

• Ngắt ngoài 0:
• IT0 = 0: Ngắt ngoài 0 được kích hoạt khi phát hiện mức 0 ở chân ngắt
ngoài 0 (P3.2)
• IT0 = 1: Ngắt ngoài 0 được kích hoạt khi phát hiện sườn xuống ở chân
ngắt ngoài 0 (P3.2)
• Ngắt ngoài 1:
• IT1 = 0: Ngắt ngoài 1 được kích hoạt khi phát hiện mức 0 ở chân ngắt

ngoài 0 (P3.3)
• IT1 = 1: Ngắt ngoài 1 được kích hoạt khi phát hiện sườn xuống ở chân
ngắt ngoài 0 (P3.3)
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng




Ví dụ 1:
Bật LED ở chân 1.0 khi xảy ra mức 0 ở chân ngắt ngoài 0 (P3.2). Sử dụng ngắt
ngoài 0.

ASM
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EX0_ISR
ORG 0030H
MAIN:
SETB EX0; Cho phép ngắt ngoài 0
SETB EA; Cho phép ngắt toàn cục
JMP $

C
void main() {
EX0 = 1; // Cho phép ngắt ngoài 0
EA = 1; // Cho phép ngắt toàn cục
while(1) continue;
}
void EX0_ISR() interrupt 0 {

P1_0 = 0;
}

EX0_ISR:
CLR P1.0
RETI
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng




Ví dụ 2:
Bật LED ở chân 1.0 khi xảy ra sườn xuống ở chân ngắt ngoài 1 (P3.3).
Sử dụng ngắt ngoài 1.

ASM
ORG 0000H
LJMP MAIN
ORG 0013H
LJMP EX1_ISR
ORG 0030H
MAIN:
SETB EX1; Cho phép ngắt ngoài 0
SETB EA; Cho phép ngắt toàn cục
JMP $

C
void main() {
EX1 = 1; // Cho phép ngắt ngoài 0
EA = 1; // Cho phép ngắt toàn cục

while(1) continue;
}
void EX1_ISR() interrupt 2 {
P1_0 = 0;
}

EX1_ISR:
CLR P1.0
RETI
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng




Thanh ghi ưu tiên ngắt IP
IP (Interrupt Priority Register)
D7 D6 D5 D4 D3 D2 D1

PT2

Không sử
dụng

PT1

Không sử
dụng

PS
Ưu tiên

ngắt cho
Timer 2

PT0
PX1

Ưu tiên
ngắt cho
Timer 1

Ưu tiên ngắt
do port nối
tiếp
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng

D0

PX0
Ưu tiên
ngắt cho
Timer 0

Ưu tiên
ngắt
ngoài 1

Ưu tiên
ngắt
ngoài 0




Lập trình ưu tiên ngắt
IP – Interrupt Priority Register

-

-

PT2

PS

PT1 PX1 PT0 PX0

• Muốn cho ngắt nào ưu tiên thì set bit ưu tiên của
ngắt đó lên.
• Khi 2 ngắt xảy ra cùng lúc thì chuỗi ngắt bình
thường sẽ bị thay đổi
• Chuỗi ngắt là thứ tự thực hiện các ngắt bình
thường khi không có ngắt nào được ưu tiên, thứ tự
như sau: ngắt ngoài 0, ngắt do timer 0, ngắt ngoài
1, ngắt do timer 1, ngắt do cổng nối tiếp, ngắt do
bộ timer 2 (đối với AT89S52 trở lên)
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng






×