Lập trình ngắt_chương 12
Như đã đề cập trong phần 10 (bài toán 10.1), việc sử dụng lệnh “JNB TF0,target” để giám sát cờ TF0 là sự hoang phí thời gian vô cùng lớn
Bài toán: Đảo bit P3.0 mỗi khi Timer 0 tràn:
FOREVER: JNB TF0, SKIP_TOGGLE ; 2MC CPL P3.0 ; 1MC CLR TF0 ; 1MC
1. Giới thiệu
2. Sơ đồ khối và chân
3. Tổ chức bộ nhớ
4. Các thanh ghi chức năng đặc biệt (SFR)
5. Dao động và hoạt động reset
6. Tập lệnh
7. Các mode định địa chỉ (addressing modes)
8. Lập trình IO
9. Tạo trễ
10.Lập trình Timer/Counter
11.Giao tiếp nối tiếp
12.Lập trình ngắt (interrupt programming)
13.Lập trình hợp ngữ
1
Dẫn nhập
• Như đã đề cập trong phần 10 (bài toán 10.1), việc sử dụng
lệnh “JNB TF0,target” để giám sát cờ TF0 là sự hoang
phí thời gian vô cùng lớn
Bài toán: Đảo bit P3.0 mỗi khi Timer 0 tràn:
FOREVER: JNB TF0, SKIP_TOGGLE ; 2MC
CPL P3.0 ; 1MC
CLR TF0 ; 1MC
SKIP_TOGGLE: ...
LJMP FOREVER
• Các ngắt cho phép chúng ta quên cái việc kiểm tra tệ hại đó
• VĐK tự nó kiểm tra và khi điều kiện thỏa mãn, nó nhảy tới
CTC, thực thi nhiệm vu, sau đó trở về chương trình chính
• CTC cho bài toán trên chỉ đơn giản như sau:
CPL P3.0 2
RETI ; 2MC
12-1. Giới thiệu
time
Main
(a) Thực thi chương trình không có ngắt
ISR ISR ISR Thực thi ở mức ngắt
Main Main Main Main Thực thi ở mức nền
time
(a) Thực thi chương trình có ngắt
3
12-2. Tổ chức ngắt
• Có 5 nguyên nhân tạo ngắt đối với họ 51:
– 2 ngắt ngoài,
– 2 ngắt bộ định thời,
– 1 ngắt do port nối tiếp
• Khi reset, tất cả các ngắt đều bị vô hiệu hóa
• Khi xảy ra 2 hay nhiều ngắt đồng thời, hay 1 ngắt mới xuất
hiện trong khi 1 ngắt đang thực thi ta có 2 sơ đồ xử lý ngắt:
sơ đồ chuỗi vòng (cố định) và sơ đồ 2 mức ưu tiên (lập trình
bởi người dùng)
4
Thanh ghi cho phép ngắt IE
Bit Ký hiệu Địa chỉ bit Mô tả
IE.7 EA AFH Cho phép/không cho phép toàn cục
IE.6 -- AEH Non-used
IE.5 ET2 ADH Cho phép ngắt do Timer 2
IE.4 ES ACH Cho phép ngắt do port nối tiếp
IE.3 ET1 ABH Cho phép ngắt do Timer 1
IE.2 EX1 AAH Cho phép ngắt từ bên ngoài ( ngắt ngoài 1)
IE.1 ET0 A9H Cho phép ngắt do Timer 0
IE.0 EX0 A8H Cho phép ngắt từ bên ngoài ( ngắt ngoài 0)
5
Thanh ghi ưu tiên ngắt IP
Bit Tên Địa chỉ bit Mô tả
7 - - Undefined
6 - - Undefined
5 - - Undefined
4 PS BCh Serial Interrupt Priority
3 PT1 BBh Timer 1 Interrupt Priority
2 PX1 BAh External 1 Interrupt Priority
1 PT0 B9h Timer 0 Interrupt Priority
0 PX0 B8h External 0 Interrupt Priority
6
12-3. Xử lý ngắt
Khi có 1 ngắt xuất hiện và được CPU chấp nhận có các
thao tác sau:
• Hoàn tất việc thực thi lệnh hiện hành
• PC được cất vào stack
• (Trạng thái của ngắt hiện hành được lưu giữ lại)
• Các ngắt được chận lại ở mức ngắt
• PC được nạp địa chỉ vector ngắt của ISR
• Thực thi ISR
7
Các cờ gây ngắt
Ngắt Cờ gây ngắt SFR & vị trí bit
Do bên ngoài (ngắt ngoài 1) IE1 TCON.3
Do bên ngoài (ngắt ngoài 0) IE0 TCON.1
Do bộ định thời 1 TF1 TCON.7
Do bộ định thời 0 TF0 TCON.5
Do port nối tiếp TI SCON.1
Do port nối tiếp RI SCON.0
Do bộ định thời 2 TF2 T2CON.7 (8052)
Do bộ định thời 2 EXF2 T2CON.6 (8052)
8
Các vector ngắt
Ngắt do Cờ Địa chỉ vector
Reset hệ thống RST 0000H
Ngắt ngoài 0 IE0 0003H
Bộ định thời 0 TF0 000BH
Ngắt ngoài 1 IE1 0013H
Bộ định thời 1 TF1 001BH
Port nối tiếp RI hoặc TI 0023H
Bộ định thời 2 TF2 hoặc EXF2 002BH
9
12-4. Thiết kế chương trình sử dụng ngắt
Khuôn mẫu chương trình có sử dụng ngắt:
ORG 0000H ; Điểm nhập sau khi reset
LJMP MAIN
. ; các điểm nhập của ISR
.
.
ORG 0030H ; điểm nhập của chương trình chính
MAIN: . ; chương trình chính bắt đầu
.
.
10
12-4-1. ISR kích thước nhỏ
ORG 0000H ; Điểm nhập sau khi reset
LJMP MAIN
ORG 000BH ; điểm nhập của ngắt do Timer 0
T0ISR: . ; bắt đầu ISR cho Timer 0
.
RETI ; trở về chương trình chính
MAIN: . ; chương trình chính bắt đầu
.
11
12-4-2. ISR kích thước lớn
ORG 0000H ; Điểm nhập sau khi reset
LJMP MAIN
ORG 0003H ;external interrupt 0
RETI
ORG 000BH ; điểm nhập của ngắt do Timer 0
LJMP T0ISR
ORG 0013H ;external interrupt 1
RETI
ORG 001BH ;timer 1 interrupt
RETI
ORG 0023H ;serial port interrupt
RETI 12
ORG 0030H ;bắt dầu chương trình chính
MAIN: .
_____________________________________________
T0ISR: . ; bắt đầu ISR cho Timer 0
.
RETI ; trở về chương trình chính
• Chú ý: Vì các vector ngắt đặt ở đáy chương trình nên lệnh đầu
tiên bao giờ cũng là lệnh nhảy dài qua khỏi vùng nhớ chứa các
vector ngắt để tới chương trình chính
13
Bài toán 12.1. Tạo sóng vuông
Tạo sóng vuông sử dụng các ngắt do bộ định thời: viết chương
trình sử dụng timer 0 và các ngắt để tạo 1 sóng vuông tần số
10KHz trên chân P1.0
14
ORG 0000H
LJMP MAIN
ORG 000BH
T0ISR: CPL P1.0
RETI
ORG 0030H
MAIN: MOV TMOD, #02H ; mode 2 của timer 0
MOV TH0, #-50 ; trì hoãn 50us
SETB TR0 ; bật timer
MOV IE, #82H ; cho phép ngắt do timer 0
SJMP $ ; không làm gì
END
15
Chú ý
• Cờ tràn bộ định thời TF0 không cần được xóa bởi phần mềm
do khi các ngắt được cho phép, cờ này tự động được xóa bởi
phần cứng khi CPU trỏ tới ISR
• Các cờ gây ngắt TF0, TF1, IE0, IE1 tự động được xóa bởi
phần cứng khi CPU trỏ tới ISR
• Nhưng các cờ gây ngắt RI, TI không được xóa bởi phần cứng
khi CPU trỏ tới ISR
16
Bài toán 12.2. Hai sóng vuông
Viết chương trình sử dụng các ngắt để tạo đồng thời 2 sóng
vuông tần số 7KHz và 0.5KHz trên chân P1.7, P1.6 ?
8051 71us
P1.7
1000us
P1.6
17
ORG 0000H
LJMP MAIN
ORG 000BH ; địa chỉ vector timer 0
LJMP T0ISR
ORG 001BH ; địa chỉ vector timer 1
LJMP T1ISR
ORG 0030H
MAIN: MOV TMOD, #12H ; timer 1 : mode 1
; timer 0 : mode 2
MOV TH0, #-71 ; trì hoãn 71us 7KHz
SETB TR0 ; bật timer 0
SETB TF1 ; buộc ngắt do timer 1
MOV IE, #8AH ; cho phép ngắt do timers
SJMP $ ; không làm gì 18
T0ISR:
CPL P1.7
RETI
T1ISR:
CLR TR1
MOV TH1, #HIGH (-1000)
MOV TL1, #LOW (-1000)
SETB TR1
CPL P1.6
RETI
END
19
Bài toán 12.3. Hai sóng vuông
• Tạo sóng vuông sử dụng các ngắt do bộ định thời: viết
chương trình sử dụng timer 0, timer 1 và các ngắt để tạo 2
sóng vuông tần số 10KHz và 5KHz trên chân P1.0, P1.1 ?
20