1. Tổ chức ngắt của 8051
Có 5 nguyên nhân tạo ra ngắt (gọi tắt là nguyên nhân ngắt) đối với 8051: hai ngắt do bên ngoài, hai ngắt do bộ định thời và một ngắt do port nối tiếp. Song cũng có nhiều tài liệu kỹ thuật nói rằng có 6 ngắt, nguyên nhân là do họ tính cả lệnh RESET, khi ta thiết lập trạng thái ban đầu cho hệ thống (gọi tắt là reset hệ thống), 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.
Khi xảy ra hai 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ơ đồ chỗ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.
Ta sẽ khảo sát cách thức cho phép và không cho phép ngắt sau đây.
1.1 Cho phép và không cho phép 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 đượ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 cho phép bằng phần mềm để bộ vi điều khiển có thể đáp ứng được. Có một thanh ghi được gọi là cho phép ngắt (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.
[You must be registered and logged in to see this image.]IE Register (Interrupt Enable)
EA – bit enable hoặc disable tất cả các interrupt.
EA=0 thì không ngắt nào được nhận.
EA=1 thì từng nguồn ngắt sẽ được mở hoặc cấm bằng cách bật hoặc xóa bit cho phép tương ứng.
ES – bit enable hoặc disable ngắt cổng nối tiếp.
ES=0 thì không cho phép ngắt nối tiếp.
ES=1 cho phép ngắt nối tiếp.
ET1 – bit enable hoặc disable ngắt tràn của của Timer1.
ET1=0 Timer1 không ảnh hưởng đến ngắt.
ET1=1 Timer1 kích hoạt ngắt.
EXT1 – cho phép hoặc cấm ngắt ngoài của Timer1.
EXT1=0 thì sự thay đổi trạng thái của cổng INT0 không ảnh hưởng đến việc ngắt.
EXT1=1 enable ngắt ngoại ngay tại thời điểm INT0 thay đổi trạng thái.
ET0 – bit enable hoặc disable ngắt tràn của Timer0.
ET0=0 Timer0 không ảnh hưởng đến ngắt.
ET0=1 Timer0 kích hoạt ngắt.
EX0 – bit enable hoặc disable ngắt ngòai của Timer0.
EX0=0 thì sự thay đổi trạng thái của INT1 không ảnh hưởng đến việc ngắt.
EX0=1 enable ngắt ngoại ngay tại thời điểm INT1 thay đổi trạng thái.
1.2 Các bước thực hiện khi cho phép một ngắt
Để cho phép một ngắt, trình tự thực hiện các bước sau:
1. Bit7 của thanh ghi IE là EA phải bật lên cao cho phép các bit còn lại của thanh ghi có hiệu lực
2. Nếu EA=1 thì tất cả mọi ngắt đều được phép và sẽ được đáp ứng nếu các bit tương ứng của ngắt này trong IE có mức cao. Nếu IE=0 thì không có ngắt nào được đáp ứng, cho dù bit tương ứng trong IE có giá trị cao.
Ví dụ:
a. Lệnh cho phép ngắt nối tiếp, ngắt Timer0 và ngắt phần cứng ngòai 1 (EXT1)
MOV IE,#100101110B ;
Vì IE là thanh ghi định đỉa chỉ bit, nên có thể sử dụng các lệnh sau đây để truy cập đến các bit riêng rẽ của thanh ghi:
SETB IE.7 ;EA=7 cho phep moi ngat
SETB IE.4 ; cho phep ngat noi tiep
SETB IE.1 ; cho phep ngat timer 1
SETB IE.2 ; cho phep ngat phan cung ngoai
Tất cả các lệnh này tương đượng với lệnh “MOV IE,#10010110B” trên.
b. Lệnh cấm (che) ngắt Timer0: CLR IE.1
1.3 Ưu tiên ngắt
Mỗi một nguyên nhân ngắt được lập trình riêng để có một trong hai mức ưu tiên thông qua thanh ghi chức năng đặc biệt được định địa chỉ bit, thanh ghi ưu tiên ngắt IP (interrupt priority), thanh ghi này có địa chỉ byte là 0B8H như mô tả dưới đây.
IP Register (Interrupt Priority) – 0: mức thấp, 1: mức cao.
[You must be registered and logged in to see this image.]PS – ưu tiên cho ngắt port nối tiếp.
PT1 – ưu tiên cho ngắt bộ định thời 1.
PX1 – ưu tiên cho ngắt ngòai 1.
PT0 – ưu tiên cho ngắt do bộ định thời 0.
PX0 – ưu tiên cho ngắt ngoài 0.
Khi hệ thống được thiết lập lại trạng thái ban đầu, thanh ghi IP sẽ mặc định đặt tất cả các ngắt ở mức ưu tiên thấp. Ý tưởng “các mức ưu tiên” cho phép một trình phục vụ ngắt được tạm thời dừng bỏi một ngắt khác nếu ngắt mới này có mức ưu tiên cao hơn mức ưu tiên của ngắt hiện đang được phục vụ. Điều này hoàn toàn hợp lý đối với 8051 vì ta chỉ có 2 mức ưu tiên. Nếu có ngắt với mức ưu tiên cao xuất hiện, trình phục vụ ngắt cho ngắt có mức ưu tiên thấp phải tạm dừng (nghĩa là bị ngắt). Ta không thể tạm dừng một chương trình phục vụ ngắt có mức ưu tiên cao.
Chương trình chính do được thực thi ở mức nền và không được kết hợp với một ngắt nào nên luôn luôn bị ngắt cho dù các ngắt này có mức ưu tiên thấp hay cao. Nếu có 2 ngắt với mức ưu tiên ngắt khác nhau xuất hiện đồng thời, ngắt có ưu tiên cao sẽ được phục vụ trước.
Nếu có 2 ngắt có cùng mức ưu tiên xuất hiện đồng thời, chuỗi vòng cố định sẽ xác định ngắt nào được phục vụ trước. Chuỗi vòng này sẽ là: ngắt ngoài 0, ngắt do bộ định thời 0, ngắt ngoài 1, ngắt do bộ định thời 1, ngắt do port nối tiếp, ngắt do bộ định thời 2.
2. Vecto ngắt
Khi một ngắt được chấp nhận, giá trị được nạp cho bộ đếm chương trình được gọi là vector ngắt. 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 trình phục vụ ngắt được trỏ tới, cờ gây ra ngắt sẽ tự động bị xóa về 0 bởi phần cứng. Các ngoại 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 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.
[You must be registered and logged in to see this image.] - Code:
-
#include <REGX51.H>
void main()
{
IE=0X85;
IT0=1;
IT1=1;
while(1);
}
void ngat1()interrupt 0
{
P1=~P1;
}
void ngat2()interrupt 2
{
P1=~P1;
}
[You must be registered and logged in to see this link.]