NGẮT (INTERUPT)
NGẮT
• Các loại ngắt và bảng vector ngắt:
• Reset hệ thống RST
0000H
• Ngắt ngoài 0
IE0 Địa chỉ vector ngắt 0003H
• Timer 0
TF0
000BH
• Ngắt ngoài 1
IE1
0013H
• Timer 1
TF1
001BH
• Cổng nối tiếp
RI hoặc TI
0023H
• Timer 2
TF2 hoặc EXF2
002BH
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
Giới thiệu timer
XTAL
oscillator
TH
÷12
C/T = 0
TF bật lên 1
khi FFFF → 0
TR
TH0
D15
D14
D13
D12
D11
D14
D13
D12
D11
Cờ tràn
(Overflow Flag)
TL0
D10
D9
D8
D7
D6
D5
TH1
D15
TF
TL
D4
D3
D2
D1
D0
D2
D1
D0
TL1
D10
D9
D8
D7
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
D6
D5
D4
D3
Thanh ghi TMOD: Timer Mode
Chọn chế độ hoạt động
TMOD
D7 D6
D5
GATE
M1
C/T
D4
D3
D2
GATE
M0
Chọn chế độ hoạt động
cho TIMER1
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
D1
D0
M1
C/T
M0
Chọn chế độ hoạt động
cho TIMER0
1. Lập trình ngắt timer
IE – Interrupt Enable Register
EA
-
ET2
ES
ET1
EX1
ET0
EX0
• Bước 1: Chọn chế độ hoạt động của timer như ở
phần lập
trình cho timer
• Bước 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: Viết chương trình phục vụ ngắt Timer.
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
Bit M0, M1 – của thanh ghi TMOD
TMOD
GATE
C/T M1
M0
M1
M0
Chế độ
0
0
1
1
0
1
0
1
0
1
2
3
GATE C/T
M1
M0
Mô tả
Chế độ định thời 13 bit
Chế độ định thời 16 bit
Chế độ tự động nạp lại 8-bit
Chế độ định thời chia xẻ
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);
}
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);
}
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 1 (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 P1.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);
}
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
SETB IT1;
JMP $
EX1_ISR:
CLR P1.0
RETI
C
void main() {
EX1 = 1; // Cho phép ngắt ngoài 0
EA = 1; // Cho phép ngắt toàn cục
IT1 =1;
while(1);
}
void EX1_ISR() interrupt 2 {
P1_0 = 0;
}
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