Ngắt trong 8051
Mục tiêu
Kết thúc bài học này, bạn có thể:
Ø Phân biệt cơ chế ngắt với hỏi vòng
Ø Nắm rõ các loại ngắt trong 8051
·
Ngắt timer/counter
·
Ngắt ngoài
·
Ngắt truyền thông nối tiếp
Ø Lập trình các ngắt
·
Trình phục vụ ngắt là gì?
·
Cho phép ngắt và cấm ngắt
·
Thiết lập mức ưu tiên của các ngắt
Giới thiệu
Ngắt (Interrupt) - như tên của nó, là một số sự kiện khẩn cấp bên trong
hoặc bên ngoài bộ vi điều khiển xảy ra, buộc vi điều khiển tạm dừng thực hiện
chương trình hiện tại, phục vụ ngay lập tức nhiệm vụ mà ngắt yêu cầu – nhiệm vụ
này gọi là trình phục vụ ngắt (ISR: Interrupt
Service Routine).
Trong
bài này ta tìm hiểu khái niệm ngắt và lập trình các ngắt trong bộ vi điều khiển
8051.
1. Các ngắt của 8051
1.1 Phân biệt
cơ chế ngắt với hỏi vòng
Lấy ví dụ: Bộ vi điều khiển đóng vai trò như một vị bác sĩ, các thiết
bị kiểm soát bởi vi điều khiển được coi như các bệnh nhân cần được bác sĩ phục
vụ.
Bình
thường, vị bác sĩ sẽ hỏi thăm lần lượt từng bệnh nhân, đến lượt bệnh nhân nào
được hỏi thăm nếu có bệnh thì sẽ được bác sĩ phục vụ, xong lại đến lượt bệnh
nhân khác, và tiếp tục đến hết. Điều này tương đương với phương pháp thăm dò - hỏi vòng (Polling) trong
vi điều khiển.
Cứ
như thế, nếu chúng ta có 10 bệnh nhân, thì bệnh nhân thứ 10 dù muốn hay không
cũng phải xếp hàng chờ đợi 09 bệnh nhân trước đó. Giả sử trường hợp bệnh nhân
thứ 10 cần cấp cứu thì sao? Anh ta sẽ gặp nguy cấp trước khi đến lượt hỏi thăm
của bác sĩ mất! L
Nhưng, nếu anh ta sử dụng phương pháp “ngắt” thì mọi chuyện sẽ ổn ngay. Lúc đó
vị bác sĩ sẽ ngừng mọi công việc hiện tại của mình, và tiến hành phục vụ trường
hợp khẩn cấp này ngay lập tức, xong việc bác sĩ lại trở về tiếp tục công việc
đang dở. Điều này tương đương với phương pháp ngắt (Interrupts) trong
vi điều khiển.
Trở
lại với bộ vi điều khiển của chúng ta: 1 bộ vi điều khiển có thể phục vụ cho nhiều
thiết bị, có 2 cách để thực hiện điều này đó là sử dụng các ngắt (Interrupts) và thăm dò (polling):
Ø Trong
phương pháp sử dụng ngắt: mỗi khi
có một thiết bị bất kỳ cần được phục vụ thì nó báo cho bộ vi điều khiển bằng
cách gửi một tín hiệu ngắt. Khi nhận
được tín hiệu ngắt thì bộ vi điều
khiển ngừng tất cả những gì nó đang thực hiện để chuyển sang phục vụ thiết bị
gọi ngắt. Chương trình ngắt được gọi là trình phục vụ ngắt ISR (Interrupt Service Routine) hay còn gọi là trình quản lý ngắt
(Interrupt handler). Sau khi phục vụ ngắt xong, bộ vi xử lý lại quay trở lại
điểm bị ngắt trước đó và tiếp tục thực hiện công việc.
Ø Trong
phương pháp thăm dò: bộ vi điều khiển kiểm tra liên tục
tình trạng của tất cả các thiết bị, nếu thiết bị nào có yêu cầu thì nó dừng lại
phục vụ thiết bị đó. Sau đó nó tiếp tục kiểm tra tình trạng của thiết bị kế
tiếp cho đến hết. Phương pháp thăm dò rất đơn giản, nhưng nó lại rất lãng phí
thời gian để kiểm tra các thiết bị kể cả
khi thiết bị đó không cần phục vụ. Trong trường hợp có quá nhiều thiết bị
thì phương án thăm dò tỏ ra không hiệu quả, gây ra chậm trễ cho các thiết bị
cần phục vụ.
Điểm mạnh của phương pháp ngắt là:
Ø Bộ vi điều khiển có thể phục vụ được rất nhiều thiết bị (tất nhiên là không tại
cùng một thời điểm). Mỗi thiết bị có thể nhận được sự chú ý của bộ vi điều
khiển dựa trên mức ưu tiên được gán
cho nó. Đối với phương pháp thăm dò thì không thể gán mức ưu tiên cho các thiết
bị vì nó kiểm tra tất cả mọi thiết bị theo kiểu hỏi vòng.
Ø Quan trọng hơn, trong phương pháp ngắt thì bộ vi điều khiển
còn có thể che (làm lơ) một yêu cầu phục
vụ của thiết bị. Điều này lại một lần nữa không thể thực hiện được trong phương
pháp thăm dò.
Ø Lý do quan trọng nhất mà phương pháp ngắt được ưu chuộng là
vì nó không lãng phí thời gian cho các thiết bị không cần phục vụ. Còn phương
pháp thăm dò làm lãng phí thời gian của bộ vi điều khiển bằng cách hỏi dò từng
thiết bị kể cả khi chúng không cần phục vụ.
Ví
dụ trong các bộ định thời được bàn đến ở các bài trước ta đã dùng một vòng lặp
kiểm tra và đợi cho đến khi bộ định thời quay trở về 0. Trong ví dụ đó, nếu sử
dụng ngắt thì ta không cần bận tâm đến việc kiểm tra cờ bộ định thời, do vậy không
lãng phí thời gian để chờ đợi, trong khi đó ta có thể làm việc khác có ích hơn.
1.2 Sáu ngắt trong 8051
Thực
tế chỉ có 5 ngắt dành cho người dùng
trong 8051 nhưng các nhà sản xuất nói rằng có 6 ngắt vì họ tính cả lệnh RESET.
Sáu ngắt của 8051 được phân bố như sau:
1.
RESET: Khi chân
RESET được kích hoạt từ 8051, bộ đếm chương trình nhảy về địa chỉ 0000H.
Đây là địa chỉ bật lại nguồn.
2.
2 ngắt dành cho các bộ định thời: 1 cho Timer0 và
1 cho Timer1. Địa chỉ tương ứng của
các ngắt này là 000BH và 001BH.
3.
2 ngắt dành cho các ngắt phần cứng bên ngoài: chân 12 (P3.2) và 13 (P3.3) của cổng P3 là các ngắt phần
cứng bên ngoài INT0 và INT1 tương ứng. Địa chỉ tương ứng của
các ngắt ngoài này là 0003H và 0013H.
4.
Truyền thông nối tiếp:
có 1 ngắt chung cho cả nhận và truyền dữ liệu nối tiếp. Địa chỉ của ngắt này
trong bảng vector ngắt là 0023H.
1.3 Trình phục vụ ngắt
Đối
với mỗi ngắt thì phải có một trình phục
vụ ngắt (ISR) hay trình quản lý
ngắt để đưa ra nhiệm vụ cho bộ vi điều khiển khi được gọi ngắt. Khi một ngắt
được gọi thì bộ vi điều khiển sẽ chạy trình phục vụ ngắt. Đối với mỗi ngắt thì
có một vị trí cố định trong bộ nhớ để giữ địa chỉ ISR của nó. Nhóm vị trí bộ nhớ được dành riêng để lưu giữ địa chỉ
của các ISR được gọi là bảng vector ngắt. Xem Hình 1.