• Các loại ngắt và bảng vector ngắt: Địa chỉ vector ngắt... Thanh ghi cho phép ngắt IE Interrupt Enable Register IE EA -ET2 ES ET1 EX1 ET0 EX0 Cho phép ngắt toàn cục Cho phép ngắt do p
Trang 1NGẮT (INTERUPT)
Trang 2• Các loại ngắt và bảng vector ngắt:
Địa chỉ vector ngắt
Trang 3Thanh ghi cho phép ngắt IE (Interrupt Enable Register)
IE
EA
-ET2
ES
ET1
EX1
ET0
EX0
Cho phép ngắt toàn cục
Cho phép ngắt do port nối tiếp
Cho phép ngắt do
Timer 2
Cho phép ngắt do
Timer 1
Cho phép ngắt do
Timer 0
Cho phép
ngắt ngoài 1
Cho phép
ngắt ngoài 0
Không sử dụng
Trang 4Thanh ghi ưu tiên ngắt IP (Interrupt Priority Register)
IP
Không sử dụng
Không sử dụng
PT2
PS
PT1
PX1
PT0
PX0
Ưu tiên ngắt
do port nối tiếp
Ưu tiên ngắt cho
Timer 2
Ưu tiên ngắt cho
Timer 1
Ưu tiên ngắt cho
Timer 0
Ưu tiên
ngắt ngoài 1
Ưu tiên
ngắt ngoài 0
Trang 5Giới thiệu timer
XTAL
Cờ tràn (Overflow Flag)
TF bật lên 1 khi FFFF → 0 C/T = 0 TR
TH0 TL0
D0 D1
D2 D3
D4 D5
D6 D7
D8 D9
D10 D11
D12 D13
D14 D15
TH1 TL1
D0 D1
D2 D3
D4 D5
D6 D7
D8 D9
D10 D11
D12 D13
D14 D15
Trang 6Thanh ghi TMOD : Timer Mode
TMOD
GATE
C/T
M1
M0
GATE
C/T
M1
M0
Chọn chế độ hoạt động
cho TIMER1
Chọn chế độ hoạt động
cho TIMER0
Chọn chế độ hoạt động
Trang 71 Lập trình ngắt timer
• Bước 1 : Chọn chế độ hoạt động của timer như ở
• 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.
IE – Interrupt Enable Register
Trang 8Bit M0, M1 – của thanh ghi TMOD TMOD
TMOD
Trang 9Ví dụ 1:
ASM ORG 0000H
LJMP MAIN
ORG 001BH 001BH
LJMP T0_ISR
ORG 0030H
MAIN:
MOV TMOD, #0000 TMOD, #00000010 0010B; 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;
}
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).
Trang 10Ví dụ 2:
C
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 }
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.
ASM
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T1_ISR
ORG 0030H
MAIN:
MOV TMOD, # 0001 0000B;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
Trang 112 Lập trình ngắt ngoài
IE – Interrupt Enable Register
+ 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
Trang 12Kích hoạt ngắt ngoài
TCON – Timer/Counter Control Register
IT0
IE0
IT1
IE1 TR0
TF0 TR1
TF1
Bằng sườn xuống hoặc bằng mức 0 ở chân ngắt ngoài
Trang 13ORG 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 $
EX0_ISR:
CLR P1.0
C
EX0 = 1; // Cho phép ngắt ngoài 0
EA = 1; // Cho phép ngắt toàn cục
}
void
void EX0_ISR() interrupt 0 { P1_0 = 0;
}
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.
Trang 14ORG 0000H
LJMP MAIN
ORG 0013H 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
EX1 = 1; // Cho phép ngắt ngoài 0
EA = 1; // Cho phép ngắt toàn cục IT1 =1;
}
void
void EX1_ISR() interrupt 2 { P1_0 = 0;
}
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.
Ví dụ 2:
Trang 15Thanh ghi ưu tiên ngắt IP
IP
D0 D1
D2 D3
D4 D5
D6 D7
Không sử dụng
Không sử dụng
PT2
PS
PT1
PX1
PT0
PX0
Ưu tiên ngắt
do port nối tiếp
Ưu tiên ngắt cho
Timer 2
Ưu tiên ngắt cho
Timer 1
Ưu tiên ngắt cho
Timer 0
Ưu tiên
ngắt ngoài 1
Ưu tiên
ngắt ngoài 0
(Interrupt Priority Register)
Trang 16Lập trình ưu tiên ngắt
ưu tiên của ngắt đó lên.
ngắt bình thường sẽ bị thay đổi
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)
IP – Interrupt Priority Register