BÀI 6 : NGẮT
3. Xử lý ngắt
Hình 6.4. Các tín hiệu điều khiển ngắt
Ở hình trên chỉ có 1 điểm chú ý đó là hai tín hiệu IT0 và IT1, hai bit này lựa chọn nguyên nhân ngắt cho 2 ngắtngoài INTR0 và INTR1.
Nếu =1 thìngắt tại sườn âm, =0 ngắttại sườn dương. Khi có một ngắt xuất hiện và được CPU chấp nhận, chương trình chính bị ngắt. Các thao tác sau đây xảy ra:
Hoàn tất việc thực thi lệnh hiện hành.
Bộđếm chương trì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.
Bộđếm chương trình PC được nạp địa chỉ vector của trình phục vụ ngắt ISR. ISR được thực thi ISR được thực thi để đáp ứng công việc của ngắt. Việc thực thi ISR kết thúc khi gặp lệnh RETI. Lệnh này lấy lại giá trị cũ của bộ đếm chương trình PC từ stack và phục hồi trạng thái của ngắt cũ.
Chú ý:chương trình con phục vụ ngắt không được làm mất hoặc làm sai địa chỉ của PC đã lưu trong ngăn xếp nếu điều này xảy ra thì khi trở lại chương trình chính CPU sẽ không thực hiện tiếp công việc của chương trình chính và chúng ta cũng không xác định CPU đang làm gì và ở đâu. Khi đó chúng ta mất quyền kiểm sốt vi xử lý.
Trong “vi điều khiển” thì bộ nhớ ngăn xếp là bộ nhớ RAM nội nên chúng sẵn
sàng hoạt động cho việc lưu trữ tạm, còn đối với “vi xử lý” thì bộ nhớ ngăn xếp sử dụng bộ nhớ ngoài nên bạn phải khởi tạo bộ nhớ ngăn xếp phải là vùng nhớ RAM để có thể ghi và đọc lại được, nếu bạn khởi tạo tại vùng nhớ EPROM hoặc khởi tạo tại nơi mà bộ
nhớ không ghi vào được thì sẽ làm mất địa chỉ – dữ liệu lưu vào bộ nhớ ngăn xếp dẫn đến chương trình sẽ thực hiện sai.Một điều cần phải chú ý nữa là trong lập trình chúng ta không được nhảy từ chương trình con sang chương trình chính để thực hiện tiếp chương trình vì làm như vậy sau nhiều lần thực hiện thì bộ nhớ ngăn xếp sẽ bị tràn và ghi đè lên các dữ liệu khác làm sai chương trình.
Trong trường hợp này chúng ta sẽ thấy rằng chương trình chúng ta thực hiện đúng một vài lần và sau đó thì sai.
3.1 Các vector ngắt. Ngắt Địa chỉ vector Ngắt Địa chỉ vector Reset hệ thống 0000H Ngắt ngoài 0 0003H Ngắt do bộđịnh thời 0 000BH Ngắt ngoài 1 0013H Ngắt do bộđịnh thời 1 001BH Ngắt do port nối tiếp 0023H Ngắt do bộđịnh thời 2 002BH
Khi một ngắt được chấp nhận, giá trịđược nạp cho bộđếm chương trình PC đượ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. Vector reset hệ thống bắt đầu tại địa chỉ 0000H: khi reset vi điều khiển thì thanh ghi PC = 0000H và chương trình chính luôn bắt đầu tại địa chỉ này. Khi bạn sử dụng yêu cầu ngắt nào thì chương trình con phục vụ ngắt phải viết đúng tại địa chỉ tương ứng.
Ví dụ: sử dụng ngắt timer T0 thì chương trình ngắt bạn phải viết tại địa chỉ 000BH.Do khoảng vùng nhớ giữa các vector địa chỉ của các nguồn ngắt chỉ có vài ô nhớ. Ví dụ như vector địa chỉ ngắt của ngắt INT0 tại 0003H và vector địa chỉ ngắt của ngắt T0 tại 000BH chỉ cách nhau có 9 ô nhớ . Nếu chương trình phục vụ ngắt của ngắt INT0 có kích thước lớn hơn 9 byte thì nó sẽ đụng đến vùng nhớ của ngắt T0. Cách giải quyết tốt nhất là ngay tại địa chỉ 0003H ta viết lệnh nhảy đến một vùng nhớ khác rộng hơn. Còn nếu các ngắt T0 và các ngắt khác không sử dụng thì ta có thể viết chương trình tại đó cũng được. Chương trình chính luôn bắt đầu tại địa chỉ 0000H sau khi reset
hệ thống, nếu trong chương trình có sử dụng ngắt thì ta phải dùng lệnh nhảy tại địa chỉ
0000H để nhảy đến một vùng nhớ khác rộng hơn không bị giới hạn để viết tiếp.
3.2. Ngắtngoài (External Interrupt).
8051 có 2 ngắt ngoài là INT0 và INT1. Ngắt ngoài được hiểu là ngắt được gây ra bởi sự kiện mức logic 0 (mức điện áp thấp, gần 0V) hoặc sườn xuống (sự chuyển mức điện áp từ mức cao về mức thấp) xảy ra ở chân ngắt tương ứng (P3.2 với ngắt ngoài 0 và P3.3 với ngắt ngoài 1).
Việc lựa chọn kiểu ngắt được thực hiện bằng các bit IT (Interrupt Type) nằm trong thanh ghi TCON. Đây là thanh ghi điều khiển timer nhưng 4 bit LSB (bit0..3) được dùng cho các ngắt ngoài.
Khi bit ITx = 1 thì ngắt ngoài tương ứng được chọn kiểu là ngắt theo sườn xuống, ngược lại nếu bit ITx = 0 thì ngắt ngoài tương ứng được sẽ có kiểu ngắt là ngắt theo mức thấp. Các bit IE là các bit cờ ngắt ngoài, chỉ có tác dụng trong trường hợp kiểu ngắt được chọn là ngắt theo sườn xuống.Khi kiểu ngắt theo sườn xuống được chọn thì ngắt sẽ xảy ra duy nhất một lần khi có sườn xuống của tín hiệu, sau đó khi tín hiệu ở mức thấp, hoặc có sườn lên, hoặc ở mức cao thì cũng không có ngắt xảy ra nữa cho đến khi có sườn xuống tiếp theo.
Cờ ngắt IE sẽ dựng lên khi có sườn xuống và tự động bị xóa khi CPU bắt đầu xử lý ngắt.Khi kiểu ngắt theo mức thấp được chọn thì ngắt sẽ xảy ra bất cứ khi nào tín hiệu tại chân ngắt ở mức thấp.
Nếu sau khi xử lý xong ngắt mà tín hiệu vẫn ở mức thấp thì lại ngắt tiếp, cứ như vậy cho đến khi xử lý xong ngắt lần thứ n, tín hiệu đã lên mức cao rồi thì thôi không ngắt nữa. Cờ ngắt IE trong trường hợp này không có ý nghĩa gì cả.Thông thường kiểu ngắt hay được chọn làngắt theo sườn xuống.