1. Mở đầu
Ngắ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 hiện hà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. Các ngắt đóng vai trò quan trọng trong việc thiết kế và hiện thực các ứng dụng của bộ vi điều khiển. Các ngắt cho phép hệ thống đáp ứng một sự kiện theo cách không đồng bộ và xử lý sự kiện trong khi một chương trình khác đang thực thi. Một hệ thống được điền khiển bởi ngắt cho ta ảo tưởng đang làm nhiều công việc đồng thời.
CPU dĩ nhiên không thể thực thi nhiều hơn một lệnh ở một thởi điểm nhưng CPU có thể ngưng tạm thời việc thực thi một chương trình để thực thi một chương trình khác rồi sau đó quay trở về thực thi tiếp chương trình đang bị tạm ngưng, đièu này giống như CPU rời khỏi chương trình gọi để thực thi chương trình con bị gọi để rồi sau đó quay trở về chương trình gọi. Sự khác nhau của hai vấn đề vừa nêu là trong một hệ thống được điều khiển bởi ngắt, việc ngắt nhằm đáp ứng một sự kiện 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 (hay nói cách khác là CPU) không biết trước là sẽ bị ngắt khi nào.
C
hương trình xử lý một ngắt được gọi là trình phục vụ ngắt ISR (interrupt service routine) hay quản lý ngắt (interrupt handler). ISR được thực thi nhằm đáp ứng một ngắt và trong trường hợp tổng quát thực hiện việc xuất nhập đối với một thiết bị. Khi một ngắt xuất hiện, việc thực thi chương trình chính tạm thời bị 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 để thực hiện một công việc và kết thúc việc thực thi này khi gặp lệnh “quay về từ một trình phục vụ ngắt”; chương trình chính được tiếp tục tại nơi bị tạm dừng. Ta có thể nói chương trình chính được thực thi ở mức nền (base level) còn ISR được thực thi ở mức ngắt (interrupt level).
Hai hình minh họa đơn giản cho interrupt:
a) Chương trình thực thi khi không có ngắt
b) Chương trình thực thi khi có ngắt
Một thí dụ về ngắt điển hình là nhập bằng tay sử dụng bàn phím. Ta thử khảo sát một ứng dụng của lò viba. Chương trình chính có thể điều khiển thành phần công suất của lò để thực hiện việc nấu nướng; tuy nhiên trong khi đang nấu, hệ thống phải đáp ứng việc nhập bằng tay trên cửa lò chẳng hạn như một yêu cầu rút ngắn bớt hay kéo dài thời gian nấu. Khi người sử dụng buông phím nhấn, một ngắt được tạo ra (chẳng hạn một tín hiệu từ mức cao chuyển xuống mức thấp) và chương trình chính bị ngắt. ISR được thực thi để đọc mã phím và thay đổi các điều kiện nấu nướng tương ứng, sau đó kết thúc bằng cách chuyển điền khiển trở về chương trình chính.
Chương trình chính được thực thi tiếp từ nơi tạm dừng. Điều quan trọng trong thí dụ trên là việc nhập bằng tay xuất hiện không đồng bộ nghĩa là xuất hiện ở các khoảng thời gian không báo trước hoặc được điều khiển bởi phần mềm đang được thực thi trong hệ thống. Đấy là một ngắt.
HOẠT ĐỘNG NGẮT. 2. Tổ Chức Ngắt Của 8051.
2. . 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.
2.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.
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.
2.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
2.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.
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.4 Xử lý ngắt
Khi có một ngắt chương trình 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ươn 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 RET1 (trở về từ một trình phục vụ ngắt). 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ũ. Việc thực thi chương trình chính được tiếp tục ở nơi bị tạm ngưng.
2.5 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. Các vector ngắt được cho ở bảng sau.
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 T1
|
0023H
|
Bộ định thời 2
|
TF2 hoặc EXF2
|
002BH
|
Vecto reset hệ thống (RST ở địa chỉ 0000H) được chứa trong bảng này vì vậy cũng được xem như là 1 ngắt: chương trình chính bị ngắt và bộ đếm chương trình PC được nạp giá trị mới.
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.
Còn một số phần nửa xem thêm ở nguồn trích dẫn:
http://bkit4u.com/?topic=page&id=37
Mình giới thiệu thêm bạn một trang tuyệt vời để học về lập trình ngắt với họ 8051 và tất cả các vấn đề liên quan.
http://www.dientuvietnam.net/forums/vi-dieu-khien-ho-8051-53/huong-dan-lap-trinh-keil-c-cho-8051-chi-danh-post-bai-huong-dan-1163/index2.html