Ở phương pháp ngắt, mỗi khi có một thiết bị cần phục vụ thì thiết bị sẽ báo cho bộ vi ñiều khiển biết bằng cách ñiều khiển dừng mọi công việc ñang thực hiện ñể ngắt gọi là trình phục v
Trang 2HOẠT ðỘNG NGẮT
Trang 3Một bộ vi ñiều khiển có thể phục vụ một số thiết bị Có
2 phương pháp phục vụ thiết bị, ñó là sử dụng ngắt và phương pháp thăm dò (polling).
Ở phương pháp ngắt, mỗi khi có một thiết bị cần phục
vụ thì thiết bị sẽ báo cho bộ vi ñiều khiển biết bằng cách
ñiều khiển dừng mọi công việc ñang thực hiện ñể
ngắt gọi là trình phục vụ ngắt (Interrupt Service Routine).
Trang 4ðối với phương pháp thăm dò, bộ vi ñiều khiển liên tục kiểm tra tình trạng của thiết
bị và khi ñiều kiện ñược ñáp ứng thì tiến hành phục vụ thiết bị Sau ñó bộ vi ñiều khiển chuyển qua kiểm tra trạng thái của thiết bị tiếp theo cho ñến khi tất cả ñều ñược phục vụ.
Trang 5ðiểm mạnh của phương pháp ngắt là bộ vi ñiều khiển
không cùng một thời ñiểm Mỗi thiết bị có thể ñược bộ vi ñiều khiển phục vụ dựa theo mức ưu tiên ñược gán Ở phương pháp thăm dò thì không thể gán mức ưu tiên cho thiết bị ñược vì bộ vi ñiều khiển tiến hành kiểm tra các thiết bị theo phương pháp hỏi vòng Ngoài ra, phương pháp ngắt cho phép bộ vi ñiều khiển che hoặc bỏ qua một yêu cầu phục vụ của thiết bị, ñiều mà phương pháp thăm
dò không thực hiện ñược.
Trang 6Ngắt (interrupt) là sự xảy ra của một ñiều kiện
- một sự kiện - làm cho chương trình chính bị tạm ngưng trong khi ñiều kiện ñược phục vụ bởi một chương trình khác.
Trong một hệ thống ñược ñiều khiển bởi ngắt,
này xuất hiện không ñồng bộ với chương trình chính ñang ñược thực thi và chương trình chính
sẽ bị ngắt khi nào
Trang 7Chương trình xử lý một ngắt ñược gọi là Trình phục vụ ngắt (ISR) hay Quản lý ngắt (Interrupt Handler) Khi một ngắt xuất hiện, việc thực thi
chương trình chính bị tạm dừng và CPU thực hiện việc rẽ nhánh ñến trình phục vụ ngắt ISR CPU thực thi ISR và kết thúc việc thực thi này khi gặp lệnh RETI; chương trình chính ñược tiếp tục tại nơi bị tạm dừng
Trang 91 Kết thúc lệnh ñang thực hiện và lưu ñịa chỉ của lệnh kế tiếp (PC) vào ngăn xếp.
2 Lưu tình trạng hiện tại của tất cả các ngắt vào bên trong (không lưu vào ngăn xếp)
3 Nó nhảy ñến một vị trí cố ñịnh trong bộ nhớ ñược gọi là bảng véc tơ ngắt nơi lưu giữ ñịa chỉ của một trình phục vụ ngắt
4 Bộ vi ñiều khiển nhận ñịa chỉ ISR từ bảng véc tơ ngắt và nhảy tới ñịa chỉ ñó
Nó bắt ñầu thực hiện trình phục vụ ngắt cho ñến lệnh cuối cùng của ISR là RETI (trở về từ ngắt)
5 Khi gặp lệnh RETI, bộ vi ñiều khiển quay trở về nơi nó ñã bị ngắt Trước hết
nó nhận ñịa chỉ của bộ ñếm chương trình PC từ ngăn xếp bằng cách nạp hai byte trên ñỉnh của ngăn xếp vào PC Sau ñó bắt ñầu thực hiện các lệnh từ ñịa chỉ ñó.
Trang 10Có 5 nguyên nhân tạo ra ngắt (ñối với chip
và 1 ngắt do port nối tiếp
Khi ta thiết lập trạng thái ban ñầu của hệ thống (reset), tất cả các ngắt ñều bị vô hiệu hóa (cấm) và sau ñó chúng ñược cho phép riêng rẽ bằng phần mềm.
Trang 11Trình phục vụ ngắt của mỗi ngắt có một vị trí cố ñịnh trong bộ nhớ ñể lưu trữ ñịa chỉ ISR Tập hợp các ô nhớ lưu
trữ ñịa chỉ của tất cả các ISR gọi là bảng vectơ ngắt
Trang 121 RESET: Khi chân Reset ñược kích
hoạt thì 8051 nhảy về ñịa chỉ 0000.
2 Hai ngắt dành cho bộ ñịnh thời Timer
0 và Timer 1 ðịa chỉ ở bảng vector ngắt
của hai ngắt này tương ứng với Timer 0 và Timer 1 là 000B và 001B
*Số lượng byte hạn chế dành riêng cho từng ngắt: 8 byte
Trang 133 Hai ngắt phần cứng dành cho các thiết bị bên ngoài nối tới chân 12 (P3.2) và 13 (P3.3) của cổng P3 là INT0 và INT1 tương ứng Các ngắt ngoài cũng còn ñược gọi là EX1 và EX2 Vị trí nhớ trong bảng vector ngắt của hai ngắt INT0 và INT1 này là 0003H và 0013H.
4 Truyền thông nối tiếp có một ngắt cho cả thu lẫn phát ðịa chỉ của ngắt này trong bảng vector ngắt là 0023H.
Trang 14Khi xảy ra 2 hay nhiều ngắt ñồng thời hoặc xảy ra một ngắt trong khi một ngắt khác ñang ñược phục vụ, ta có 2 sơ ñồ xử
lý các ngắt: Sơ ñồ chuỗi vòng và sơ ñồ hai mức ưu tiên
Sơ ñồ chuỗi vòng là sơ ñồ cố ñịnh còn
sơ ñồ ưu tiên ngắt ñược lập trình bởi người
sử dụng
Trang 15CHO PHÉP MỘT NGẮT
Khi Reset thì tất cả mọi ngắt ñều bị cấm (bị che) có nghĩa là không có ngắt nào sẽ ñược bộ vi ñiều khiển ñáp ứng nếu chúng ñược kích hoạt
Các ngắt phải ñược kích hoạt bằng phần mềm ñể bộ vi ñiều khiển ñáp ứng chúng Có một thanh ghi ñược gọi là cho phép ngắt IE (Interrupt Enable) chịu trách nhiệm về việc cho phép (không che) và cấm (che) các ngắt IE là thanh ghi có thể ñịnh ñịa chỉ theo bít
Trang 16Thanh ghi cho phép ngắt IE
EA ET2 ES ET1 EX1 ET0 EX0
D0 D7
EA IE.7 Cho phép ngắt toàn cục.
- - IE.6 Dự phòng cho tương lai.
ET2 IE.5 Cho phép hoặc cấm ngắt tràn hoặc thu của Timer2 (8051).
ES IE.4 Cho phép hoặc cấm ngắt cổng nối tiếp.
ET1 IE.3 Cho phép hoặc cấm ngắt tràn của Timer1.
EX1 IE.2 Cho phép hoặc cấm ngắt ngoài 1.
ET0 IE.1 Cho phép hoặc cấm ngắt tràn của Timer0.
EX0 IE.0 Cho phép hoặc cấm ngắt ngoài 0.
Trang 17CHO PHÉP MỘT NGẮT
ñể cho phép các bít còn lại của thanh ghi có hiệu lực.
ñược ñáp ứng nếu các bít tương ứng của chúng trong
ñược ñáp ứng cho dù bít tương ứng của nó trong IE có giá trị cao.
Trang 18Khi một ngắt ñược chấp nhận, giá trị vector ngắt ñược nạp cho bộ ñếm chương trình PC Vector ngắt là ñịa chỉ bắt ñầu của trình phục vụ ngắt của nguyên nhân ngắt tương ứng.
Khi một chương trình phục vụ ngắt ñược trỏ tới, cờ gây
lệ bao gồm các cờ RI và TI ñối với các ngắt do port nối tiếp; TF2 và EXF2 ñối với các cờ ngắt do bộ ñịnh thời 2 Các nguyên nhân ngắt thuộc 2 ngoại lệ vừa nêu trên do có
2 khả năng tạo ra ngắt nên trong thực tế CPU không xóa
cờ ngắt.
Trang 21Khuôn mẫu ñề nghị cho một chương trình thực thi ñộc
lập có sử dụng ngắt.
ORG 0000H ; ðiểm nhập sau khi reset
LJMP MAIN ; Nhảy qua vùng ngắt
; Các ñiểm nhập của ISR (Interrupt Service Routine)
ORG 0030H ; ðiểm nhập chương trình chính
MAIN: ; Chương trình chính bắt ñầu
.
Trang 22Các trình phục vụ ngắt phải ñược bắt ñầu ở gần ñáy bộ nhớ Mặc dù chỉ có 8 byte giữa các ñiểm nhập của các trình phục vụ ngắt, dung lượng này thường ñủ ñể thực hiện các công việc ñược yêu cầu và quay trở về chương trình chính từ một
phục vụ ngắt cho các ngắt tương ứng thường không dài quá 8 bytes
Trang 23Nếu chỉ có một nguyên nhân ngắt ñược dùng, thí dụ ngắt do
bộ ñịnh thời 0, khuôn mẫu chương trình dưới ñây ñược ñề nghị
sử dụng.
ORG 0000H ; reset
LJMP MAIN ; Nhảy qua vùng ngắt
ORG 000BH ; ðiểm nhập của ngắt do bộ ñịnh thời 0
T0ISR: ; Bắt ñầu ISR cho bộ ñịnh thời 0
RETI ; Trở về chương trình chính
MAIN: ; Chương trình chính bắt ñầu
.
Trang 24Nếu có nhiều ngắt ñược
Trang 25Nếu một trình phục vụ ngắt dài hơn 8 byte ñược cần ñến, ta phải di chuyển chương trình này ñến một nơi khác trong bộ nhớ chương trình hoặc ta có thể cho lấn qua ñiểm nhập của ISR kế.
Phương án ñiển hình là cho ISR bắt ñầu với một lệnh nhảy ñến một vùng khác của bộ nhớ chương trình, ở ñó ISR ñược trải rộng nếu cần.
Trang 26ORG 0000H ; reset
LJMP MAIN
ORG 000BH ; ðiểm nhập của ngắt do bộ ñịnh thời 0
LJMP T0ISR ; Bắt ñầu ISR cho bộ ñịnh thời 0
MAIN: ; Chương trình chính bắt ñầu
.
T0ISR: ; ISR của bộ ñịnh thời 0
RETI ; Trở về chương trình chính
Trang 27Trong các ứng dụng hướng ñiều khiển, phần lớn công việc ñược thực hiện trong trình phục vụ ngắt Các chương trình chính chỉ làm một số việc khởi ñộng ở thời ñiểm bắt ñầu Chương trình chính khởi ñộng bộ ñịnh thời, port nối tiếp, khởi tạo biến, nạp giá trị cho các thanh ghi ngắt sao cho thích hợp…… rồi không làm gì cả.
Trang 28Các công việc hoàn toàn ñược thực thi trong ngắt, sau khi khởi ñộng, chương trình chính chứa lệnh sau:
HERE: SJMP HERE
Khi có một ngắt xuất hiện, chương trình chính tạm
thời bị ngắt trong khi ISR ñược thực thi Lệnh RETI
cuối chương trình ngắt trả ñiều khiển về chương trình chính và chương trình này tiếp tục không làm
gì cả.
Trang 29ñiều khiển bị ngắt tại bất kỳ việc gì nó ñang thực hiện và
nhảy tới bảng véc tơ ngắt ñể phục vụ ISR Bằng cách này thì
bộ vi ñiều khiển có thể làm những công việc khác cho ñến khi nào nó ñược thông báo rằng bộ ñịnh thời ñã quay về 0.
Trang 30Bài 1 : Viết một chương trình sử dụng bộ ñịnh thời 0 và các ngắt ñể tạo ra một
sóng vuông có tần số 10kHz trên chân P1.0.
8051
P1.0
100µ µ µs
50µ µ µs
Trang 31LJMP MAIN ORG 000BH ; Vector ngắt của bộ ñịnh thời 0
T0ISR: CPL P1.0 ; Lấy bù
RETI ORG 0030H ; ðiểm nhập chương trình chính
MAIN: MOV TMOD, #02H ; Dùng bộ ñịnh thời 2, chế ñộ 0
MOV TH0,#-50 ; ðịnh thời 50µs SETB TR0 ; Bắt ñầu ñịnh thời MOV IE, #82H ; IE = 1000 0010 -> Cho phép ngắt do T0 SJMP $ ; Không làm gì
END.
Trang 32Ngay khi reset hệ thống, bộ ñếm chương trình
PC ñược nạp giá trị 0000H Lệnh ñầu tiên ñược
chương trình chính ở ñịa chỉ 0030H trong bộ nhớ chương trình.
3 lệnh ñầu tiên của chương trình chính khởi ñộng bộ ñịnh thời 0 ở chế ñộ 2 (tự nạp lại 8-bit)
IE,#82H cho phép ngắt do bộ ñịnh thời 0 tạo ra.
Trang 33Mỗi một lần bộ ñịnh thời tràn sẽ tạo ra một ngắt Khi
và trình phục vụ ngắt cho bộ ñịnh thời 0 ñược thực thi Ở thí dụ này chương trình dịch vụ ngắt chỉ ñơn giản lấy bù bit P1.0 và quay trở về chương trình chính nơi vòng lặp
“không làm gì” ñược thực thi ñể chờ một ngắt mới sau 50
µs
Cờ tràn của bộ ñịnh thời TF0 không cần xóa bởi phần
ñộng xóa bởi phần cứng khi CPU trỏ tới trình phục vụ ngắt.
Trang 34Bài 2 : Viết một chương trình sử dụng các ngắt ñể tạo ñồng thời các dạng sóng
vuông có tần số là 7kHz và 500Hz trên các chân P1.7 và P1.6.
Chu kỳ xung:
T0 = 1/f0 = 1/7kHz ≈ 142µ µ µs
=> Thời gian cần ñịnh thời:
t0 = 71 µ µ µs T1 = 1/f1 = 1/500Hz= 2ms => t1 = 1ms
Số cần nạp cho thanh ghi của bộ ñịnh thời:
TH0: -71
TH1: FC TL1: 18
142µ µ µs
71µ µ µs
8051
P1.6 P1.7
2ms
1ms
Trang 35Bộ ñịnh thời 0 hoạt ñộng ở Mode 2 ñược
sử dụng ñể tạo ra dạng sóng 7kHz trên chân P1.7, còn bộ ñịnh thời 1 hoạt ñộng ở Mode 1 tạo ra dạng sóng 500kHz trên chân P1.6 Vì dạng sóng 500kHz yêu cầu thời gian mức cao là 1ms và thời gian mức thấp là 1ms, chế
ñộ 2 không sử dụng ñược.
Trang 36LJMP T0ISR ORG 001BH LJMP T1ISR ORG 0030H
MAIN: MOV TMOD,#00010010B
MOV TH0,#-71 ; Tần số 7kHz sử dụng bộ ñịnh thời 0
SETB TR0 SETB TF1 ; Buộc ngắt do bộ ñịnh thời 1
MOV IE,#8AH ; Cho phép ngắt do các bộ ñịnh thời
SJMP $
T0ISR: CPL P1.7
RETI
T1ISR: CLR TR1
MOV TH1,#0xFC ;#-1000 thoi gian muc cao 1ms
MOV TL1,#0x18 ;#-1000 thoi gian muc thap 1ms
SETB TR1 CPL P1.6 RETI END.
Trang 37Các thanh ghi TH1,TL1 phải ñược nạp lại sau mỗi lần tràn (sau mỗi ngắt), trình phục vụ ngắt cho bộ ñịnh thời 1 làm các công việc sau:
Trang 38Các ngắt do port nối tiếp xuất hiện khi cờ ngắt phát
TI hoặc cờ ngắt thu RI ñược set bằng 1 Một ngắt phát xuất hiện khi việc phát một ký tự ñã ghi vào SBUF
hoàn tất Một ngắt thu xuất hiện khi một ký tự ñược thu nhận ñầy ñủ và ñang ở trong SBUF ñể chờ ñược ñọc Như vậy ngắt phát xảy ra khi bộ ñệm phát SBUF rỗng còn ngắt thu xảy ra khi bộ ñệm thu SBUF ñầy.
Trang 39do bộ ñịnh thời Cờ gây ra ngắt ở port nối tiếp không ñược xóa bởi phần cứng khi CPU trỏ tới trình phục vụ ngắt Lý do là vì ở ñây ta có 2 nguyên nhân tạo ra ngắt
ở port nối tiếp, cụ thể là 2 nguyên nhân ngắt tạo ra bởi
2 cờ TI và RI
Nguyên nhân ngắt phải ñược xác ñịnh trong trình phục vụ ngắt và cờ tạo ra ngắt ñược xóa bởi phần mềm (ðối với ngắt do các bộ ñịnh thời, cờ tạo ra ngắt ñược xóa bởi phần cứng khi CPU trỏ tới ISR).
Trang 40Ví d ụ: Xuất ký tự sử dụng ngắt
Viết một chương trình sử dụng các ngắt ñể liên tục phát ñi tập mã ASCII (bao gồm cả các mã ñiều khiển)
ñến một thiết bị ñầu cuối nối với 8051 qua port nối tiếp
Có 128 mã ASCII 7-bit trong bảng mã ASCII Các mã này bao gồm 95 mã ñồ họa (từ 20H ñến 7EH) và 33 mã ñiều khiển (từ 00H ñến 1FH và 7FH).
Trang 41LJMP SPISR ORG 0030H
MAIN: MOV TMOD, #20H ; Bộ ñịnh thời 1, chế ñộ 2
MOV TH1,#-26 ; giá trị nạp lại: 1200 baud
SETB TR1 ; bắt ñầu ñịnh thời
MOV SCON,#42 ; chế ñộ 1, set TI bằng 1 ñể buộc có ngắt ñầu tiên, gửi kí tự thứ nhất
MOV A,#20H ; Gửi ký tự trắng ñầu tiên
MOV IE,#90H ; Cho phép ngắt do port nối tiếp
SJMP $ ; Ko làm gì
SPISR: CJNE A,#7FH,SKIP ; Nếu kết thúc tập mã ASCII
MOV A,#20H ; reset ñến SPACE
SKIP: MOV SBUF,A ; Gửi ký tự ñến port nối tiếp
INC A ; Ký tự tiếp theo
CLR TI ; Xóa cờ ngắt phát
RETI
Trang 42Sau khi nhảy ñến nhãn MAIN ở ñịa chỉ 0030H, ba lệnh ñầu tiên khởi ñộng bộ ñịnh thời 1 ñể cung cấp xung clock
1200 baud cho port nối tiếp, lệnh MOV SCON, #42H
khởi ñộng port nối tiếp ở chế ñộ 1 (UART 8-bit) và set cờ
TI bằng 1 ñể buộc phải tạo ra một ngắt.
Sau ñó mã ASCII ñầu tiên (20H) ñược nạp cho thanh ghi
A và các ngắt do port nối tiếp ñược cho phép Cuối cùng
chương trình chính ñi vào vòng lặp “không làm gì” (chờ
ngắt).
Trang 43Trình phục vụ ngắt của port nối tiếp làm tất cả các công việc một khi chương trình chính ñã thiết lập các ñiều kiện ban ñầu Hai lệnh ñầu tiên kiểm tra thanh chứa và nếu mã ASCII ñạt ñến 7FH (nghĩa
là mã vừa mới phát ñi là 7EH), thanh chứa ñược thiết lập lại với nội dung là 20H.
Sau ñó mã ASCII ñược gửi ñến bộ ñệm của port nối tiếp ( MOV
SBUF,A ), tăng thanh ghi chứa A ñể có mã kế tiếp, cờ ngắt phát ñược xóa ( CLR TI ) và trình phục vụ ngắt kết thúc ðiều khiển trả
về chương trình chính và lệnh SJMP $ ñược thực thi cho ñến khi
TI lại ñược set bằng 1
Trang 44LẬP TRÌNH NGẮT NGOÀI
Ngắt ngoài xảy ra khi có mức thấp hoặc có cạnh âm trên chân
/INT0 hoặc /INT1 của 8051.
Thực tế các cờ tạo ra các ngắt này là các bit IE0 và IE1 của thanh ghi TCON Khi một ngắt ngoài ñược tạo ra, cờ tạo ra ngắt ñược xóa bởi phần cứng khi CPU trỏ ñến trình phục vụ ngắt chỉ nếu ngắt thuộc loại tác ñộng cạnh Nếu ngắt thuộc loại tác ñộng mức, nguyên nhân ngắt ngoài sẽ ñiều khiển mức của cờ thay vì
Trang 45Việc chọn các ngắt loại tác ñộng cạnh hay các ngắt loại tác ñộng mức ñược lập trình thông qua các bit IT0 và IT1 của thanh ghi TCON
Ví d ụ: Nếu IT1 = 0 , ngắt ngoài 1 ñược kích khởi bởi việc phát hiện mức thấp ở chân /INT1 Nếu IT1 = 1 , ngắt ngoài 1 ñược kích khởi cạnh Ở chế ñộ này, nếu các mẫu liên tiếp ở chân
thấp trong một chu kỳ kế, cờ ngắt IE1 trong thanh ghi TCON
ñược set bằng 1; kế ñến IE1 yêu cầu 1 ngắt.
Trang 46Vì các chân ngắt ngoài ñược lấy mẫu một lần ở mỗi một chu kỳ máy, các ngõ vào này phải ñược duy trì tối thiểu 12 chu kỳ dao ñộng ñể ñảm bảo rằng việc lấy mẫu là ñúng.
Nếu ngắt ngoài thuộc loại tác ñộng cạnh , nguyên nhân ngắt ngoài phải ñược duy trì ở chân yêu cầu ở mức cao tối thiểu 1 chu kỳ và sau ñó ở mức thấp tối thiểu một chu kỳ nữa ñể ñảm bảo việc chuyển trạng thái ñược phát hiện IE0 và IE1 tự ñộng ñược xóa khi CPU trỏ tới trình phục vụ ngắt tương ứng.
Trang 47Nếu ngắt ngoài thuộc loại tác ñộng mức, nguyên nhân
ngắt ngoài phải ñược duy trì trạng thái tích cực cho ñến khi ngắt theo yêu cầu thực sự ñược tạo ra Sau ñó nguyên nhân ngắt phải ở trạng thái thụ ñộng trước khi trình phục vụ ngắt ñược thực thi xong hoặc trước khi có một ngắt khác ñược tạo ra.
Thông thường, một công việc ñược thực thi bên trong trình phục vụ ngắt làm cho nguyên nhân ngắt trả tín hiệu yêu cầu ngắt trở về trạng thái không tích cực.