• 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 D7 D6 D5 D4 D3 D2 D1 D0 EA -ET2 ES ET1 EX1 ET0 EX0 Cho phép ngắt toà
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 D7 D6 D5 D4 D3 D2 D1 D0
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 D7 D6 D5 D4 D3 D2 D1 D0
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
oscillator ÷12
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 D7 D6 D5 D4 D3 D2 D1 D0
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ư ở 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.
EA - ET2 ES ET1 EX1 ET0 EX0
IE – Interrupt Enable Register
Trang 8Bit M0, M1 – của thanh ghi TMOD TMOD
0 1 1 Chế độ định thời 16 bit
1 0 2 Chế độ tự động nạp lại 8-bit
GATE C/T M1 M0 GATE C/T M1 M0
TMOD
Trang 9Ví dụ 1:
ASM
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP T0_ISR
ORG 0030H
MAIN:
MOV TMOD, #0000 0010 B; 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
EA - ET2 ES ET1 EX1 ET0 EX0
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
• Ngắt ngoài 0:
ngoài 0 (P3.2)
ngắt ngoài 0 (P3.2)
• Ngắt ngoài 1:
ngoài 0 (P3.3)
ngắt ngoài 1 (P3.3)
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 13MAIN:
EX0_ISR:
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 0013H 0013H
MAIN:
EX1_ISR:
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
ngắt đó lên.
thường sẽ bị thay đổi
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)
- - PT2 PS PT1 PX1 PT0 PX0
IP – Interrupt Priority Register