Chương 6: Hoạt động ngắt (Interrupt). Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 177 Biên soạn: Phạm Quang Trí
CHƯƠNG 6
HOẠT ðỘNG NGẮT
(INTERRUPT)
I. MỞ ðẦU:
1 CPU CHỈ THỰC THI ðƯỢC 1 LỆNH TẠI MỘT THỜI ðIỂM.
Ngắt (Interrupt) là việc xảy ra một điều kiện (một sự kiện) làm cho chương trình đang thực thi
(chương trình chính) bị tạm dừng để quay sang thực thi một chương trình khác (chương trình xử lý
ngắt) rồi sau đó quay trở về để thực thi tiếp chương trình đang bị tạm dừng. 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ều khiển bởi ngắt cho ta ảo tưởng nhiều cơng việc đang được vi xử lý
thực hiện đồ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ể tạm
ngưng 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 về thực thi
tiếp tục chương trình đang bị tạm ngưng, điều này thì tương tự như việc 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.
Cần phải phân biệt sự giống và khác nhau giữa “ngắt” và “gọi chương trình con”:
• Giống nhau:
Khi xảy ra điều kiện tương ứng thì CPU sẽ tạm dừng chương trình chính đang thực thi để
thực thi một chương trình khác (chương trình con / chương trình xử lý ngắt) rồi sau đó (sau khi xử lý
xong chương trình con / chương trình xử lý ngắt) thì CPU sẽ quay về để thực thi tiếp tục chương trình
chính đang bị tạm dừng.
• Khác nhau:
Ngắt Chương trình con
Thời điểm xảy ra sự
kiện
Khơng biết trước (hay xảy ra khơng
đồng bộ với chương trình chính).
Biết trước (hay xảy ra đồng bộ với
chương trình chính).
Ngun nhân dẫn đến
sự kiện
Do các tín hiệu điều khiển từ Timer,
Serial port và bên ngồi chip.
Do lệnh gọi chương trình con
(ACALL, LCALL).
Chương trình xử lý ngắt (tức là chương trình mà CPU phải thực hiện khi có một ngắt xảy đến)
được gọi là trình phục vụ ngắt ISR (ISR: Interrupt Service Routine) hay trình 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 qt 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 lại
và CPU thực thi việc rẽ nhánh đến trình phục vụ ngắt ISR. CPU sẽ thực thi ISR để thực hiện một cơng
việc và kết thúc việc thực hiện cơng việc này khi gặp lệnh “quay về từ trình phục vụ ngắt” (lệnh
RETI), sau đó chương trình chính tiếp tục được thực thi tại nơi bị tạm dừng. Ta có thể nói chương trình
Chương 6: Hoạt động ngắt (Interrupt). Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 178 Biên soạn: Phạm Quang Trí
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).
Biểu diễn việc thực thi chương trình có ngắt và khơng có ngắt:
Một ví dụ về ngắt điển hình là nhập thơng số điều khiển sử dụng bàn phím. Ta hãy 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 số liệu bằng tay trên
cửa lò (chẳng hạn như ta muốn u cầu rút ngắn bớt hay kéo dài thêm thời gian nấu), điều này có thể
xảy ra tại bất cứ thời điểm nào trong q trình nấu.
Trường hợp ta khơng sử dụng ngắt: Như ta đã biết, một hệ thống chỉ có thể thực thi một cơng
việc tại một thời điểm. Cho nên khi hệ thống đang thực thi việc nấu nướng thì nó khơng thể thực thi
việc đáp ứng nhập số liệu khi nó xảy ra và ngược lại. Vì thế trong trường hợp này hệ thống phải thực
hiện cho xong việc nấu nướng rồi mới thực hiện tiếp việc đáp ứng nhập số liệu (điều này vơ lý vì khi đã
nấu nướng xong thì cần gì phải điều chỉnh thời gian nữa) hoặc ngược lại hệ thống phải thực hiện cho
xong việc đáp ứng nhập số liệu rồi mới thực hiện tiếp việc nấu nướng (điều này cũng vơ lý vì khơng thể
biết trước được việc nhập số liệu xảy ra lúc nào, cho nên q trình hệ thống chờ đợi việc nhập số liệu
sẽ trở nên vơ nghĩa).
Trường hợp ta sử dụng ngắt: Ta nhận thấy rằng việc nấu nướng là việc diễn ra liên tục từ đầu
đến cuối, còn việc đáp ứng nhập số liệu chỉ xảy ra khi ta nhấn bàn phím (khơng xác định được thời
điểm xảy ra). Vì thế, ta phân cấp cho chương trình chính (mức nền) sẽ đ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, còn việc đáp ứng nhập số liệu sẽ do ngắt điều khiển (mức ngắt).
Bình thường thì lò thực hiện việc nấu nướng như đã xác định, khi người sử dụng nhấn bàn phím thì
một tín hiệu ngắt được tạo ra và chương trình chính sẽ bị tạm thời dừng lại. ISR được thực thi để đọc
mã phím và thay đổi các điều kiện nấu tương ứng, sau đó kết thúc bằng cách chuyển điều 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 ví dụ nêu trên là việc nhập bàn phím xuất hiện khơng đồng bộ nghĩa là
xuất hiện ở các khoảng thời 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. ðó là một ngắt.
Chương 6: Hoạt động ngắt (Interrupt). Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 179 Biên soạn: Phạm Quang Trí
II. PHƯƠNG PHÁP PHỤC VỤ THIẾT BỊ:
Một bộ vi điều khiển có thể phục vụ một hoặc nhiều thiết bị. Có hai phương pháp phục vụ thiết
bị là: phương pháp ngắt (Interrupt) 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 được phục vụ thì thiết bị sẽ báo cho bộ vi điều
khiển bằng cách gửi đến đó một tín hiệu ngắt. Khi nhận được tín hiệu này, bộ vi điều khiển sẽ ngừng
mọi cơng việc đang thực hiện để chuyển sang phục vụ cho thiết bị này.
Ở 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 một thiết bị và khi
điều kiện được đáp ứng thì nó sẽ tiến hành phục vụ cho thiết bị này. Sau đó, bộ vi điều khiển chuyển
sang kiểm tra trạng thái của thiết bị kế tiếp cho đến khi tất cả thiết bị đều được phục vụ.
ðiểm mạnh của phương pháp ngắt là một bộ vi điều khiển có thể phục vụ được nhiều thiết bị,
nhưng dĩ nhiên là 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 kiểu hỏi vòng một cách lần lượt qua từng thiết
bị. Ngồi ra, phương pháp ngắt cho phép bộ vi điều khiển che hoặc bỏ qua một u cầu phục vụ của
thiết bị, điều mà phương pháp thăm dò khơng thể thực hiện. Tuy nhiên, lý do chính mà phương pháp
ngắt được ưa chuộng hơn là vì phương pháp thăm dò lãng phí đáng kể thời gian của bộ vi điều khiển
do phải hỏi dò từng thiết bị, ngay cả khi chúng khơng cần được phục vụ.
ðể làm rõ hơn vấn đề này, chúng ta cần xem lại các ví dụ về lập trình bộ định thời đã được trình
bày trong chương 4. Trong đó có lệnh JNB TF1, $ được sử dụng để chờ đợi cho đến khi bộ định thời
tràn (TF=1). Ở các ví dụ này, trong khi chờ đợi cờ TF=1 thì bộ vi điều khiển khơng thể làm được cơng
việc gì khác, điều này dẫn đến việc lãng phí thời gian. Cũng với bộ định thời này, nếu ta dùng phương
pháp ngắt thì bộ vi điều khiển có thể thực hiện một số cơng việc nào đó trong khi đang chờ đợi cờ
TF=1. Khi cờ TF=1 thì bộ vi điều khiển sẽ bị ngắt cho dù nó đang làm việc gì đi chăng nữa, điều này
sẽ khơng làm cho bộ vi điều khiển bị lãng phí thời gian một cách vơ nghĩa.
III. TỔ CHỨC NGẮT CỦA 8051:
1. Các nguồn ngắt:
Lưu ý:
• Khi ta reset hệ thống thì tất cả các ngắt đều bị cấm hoạt động.
• Các nguồn ngắt này được cho phép hoặc cấm hoạt động bằng lệnh do người lập trình thiết lập
cho từng ngắt.
• Việc xử lý các ngắt được thực hiện qua 2 sơ đồ:
o Sơ đồ ưu tiên ngắt → có thể thay đổi được và do người lập trình thiết lập.
o Sơ đồ chuỗi vòng → cố định, khơng thay đổi được.
⇒ Hai sơ đồ này giúp CPU giải quyết các vần đề liên quan đến ngắt như: hai hay nhiều ngắt xảy ra
đồng thời hoặc một ngắt xảy ra trong khi một ngắt khác đang được thực thi.
Chương 6: Hoạt động ngắt (Interrupt). Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 180 Biên soạn: Phạm Quang Trí
Các cờ ngắt của chip 8051:
Lưu ý:
• Một ngắt xảy ra thì cờ ngắt tương ứng sẽ được set bằng 1.
• Khi ISR của ngắt được thực thi thì cờ ngắt tương ứng sẽ tự động bị xóa về 0 bằng phần cứng
(ngoại trừ cờ ngắt RI và TI phải được xóa về 0 bằng phần mềm
).
• ðối với ngắt ngồi sẽ có hai cách kích hoạt để tạo ra một tín hiệu ngắt: ngắt ngồi kích hoạt khi
có mức thấp và ngắt ngồi kích hoạt khi có cạnh âm tại chân INT0\ hoặc INT1\.
2. Qui định việc chọn loại kích hoạt cho ngắt ngồi:
Việc chọn lựa loại kích hoạt cho các ngắt ngồi, thuộc loại kích hoạt cạnh hay thuộc loại kích
hoạt mức, thì được lập trình thơng qua các bit IT0 và IT1 của thanh ghi TCON.
IT0 = 0 → Ngắt ngồi 0 được kích khởi bởi việc phát hiện mức thấp tại chân INT0\.
IT0 = 1 → Ngắt ngồi 0 được kích khởi bởi việc phát hiện cạnh âm tại chân INT0\.
IT1 = 0 → Ngắt ngồi 1 được kích khởi bởi việc phát hiện mức thấp tại chân INT1\.
IT1 = 1 → Ngắt ngồi 1 được kích khởi bởi việc phát hiện cạnh âm tại chân INT1\.
Lưu ý:
Khi tạo tín hiệu ngắt tại chân INT0\ hoặc INT1\ ta cần phải chú ý đến thời gian duy trì
tác động của tín hiệu ngắt.
• ðối với loại ngắt kích hoạt cạnh âm (thời gian tối thiểu):
INTx
8051
T
m
T
m
(1)
(0)
x = 0, 1
f
OSC
(MHz): tần số thạch anh.
T
m
(
s): chu kỳ máy.
OSC
m
f
T
12
=
• ðối với loại ngắt kích hoạt mức thấp (thời gian tối đa):
INTx
8051
(**)(*)
(1)
(0)
x = 0, 1
(*): Duy trì trạng thái (0) cho đến
khi ISR tương ứng được thực
hiện.
(**):Trở về trạng thái (1) trước khi
ISR tương ứng được thực hiện
xong hoặc trước khi có một
ngắt khác được tạo ra.
m
T
×
=
4
(*)
Chương 6: Hoạt động ngắt (Interrupt). Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 181 Biên soạn: Phạm Quang Trí
3. Thanh ghi cho phép ngắt (IE):
Thanh ghi cho phép ngắt (IE: Interrupt Enable): chứa các bit dùng để cho phép hoặc cấm các
ngắt hoạt động.
Cấu trúc của thanh ghi IE:
Hai điều kiện để một ngắt được phép hoạt động là:
• Bit EA = 1.
• Bit ngắt tương ứng = 1.
Ví dụ:
ðể ngắt của Timer 1 được phép hoạt động ta dùng lệnh:
SETB ET1
SETB EA
hoặc
MOV IE, #10001000B
Mặc dù cả cách trên đều cho ta một kết quả như nhau sau khi hệ thống được thiết lập lại trạng
thái ban đầu (reset hệ thống). Tuy nhiên trong khi chương trình đang hoạt động thì ảnh hưởng của hai
cách này có khác nhau vì cách thứ hai ghi lên thanh ghi IE.
Cách thứ nhất, sử dụng hai lệnh SETB nên chỉ ảnh hưởng đến 2 bit cần tác động mà khơng gây
ảnh hưởng đến 5 bit còn lại của thanh ghi IE. Trong khi đó, cách thứ hai chỉ sử dụng lệnh MOV nên sẽ
làm cho 5 bit còn lại này bit xóa mất. Tốt nhất ta nên khởi động thanh ghi IE bằng lệnh MOV ở đầu
chương trình ngay sau khi hệ thống được thiết lập lại. Việc cho phép hoặc khơng cho phép các ngắt
trong chương trình nên sử dụng các lệnh SETB hoặc CLR để tránh ảnh hưởng đến các bit khác trong
thanh ghi IE.
4. Thanh ghi ưu tiên ngắt (IP):
Khái niệm ưu tiên ngắt giúp 8051 giải quyết vấn đề hai tín hiệu ngắt xuất hiện đồng thời và
vấn đề một tín hiệu ngắt xuất hiện trong khi một ngắt khác đang được thực thi.
Ngắt ưu tiên mức cao → Ngắt ưu tiên mức thấp
Thanh ghi ưu tiên ngắt (IP: Interrupt Priority): chứa các bit dùng để thiết lập mức độ ưu tiên
(mức cao hay mức thấp) cho từng ngắt riêng rẽ.
Chương 6: Hoạt động ngắt (Interrupt). Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 182 Biên soạn: Phạm Quang Trí
Cấu trúc của thanh ghi IP:
Khi hệ thống được thiết lập lại trạng thái ban đầu thì tất cả các ngắt đều sẽ được mặc định ở 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 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
hồn tồn hợp lý đối với 8051 vì ta chỉ có hai mức ưu tiên. Nếu có ngắt có 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 phuc 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
ln ln bị ngắt bởi các ngắt cho dù các ngắt có mức ưu tiên thấp hay mức ưu tiên cao. Nếu có hai
ngắt với mức ưu tiên ngắt khác nhau xuất hiện đồng thời, ngắt có mức ưu tiên cao sẽ được phục vụ
trước.
5. Thứ tự chuỗi vòng ngắt (Interrupt Polling Sequence):
Khái niệm chuỗi vòng giúp 8051 giải quyết vấn đề hai hay nhiều tín hiệu ngắt có mức ưu tiên
giống nhau xuất hiện đồng thời.
Chuỗi vòng này sẽ là (được sắp xếp theo thứ tự từ thấp đến cao):
Ngắt ngồi 0 →
→→
→ Ngắt Timer 0 →
→→
→ Ngắt ngồi 1 →
→→
→
Ngắt Timer 1 →
→→
→ Ngắt port nối tiếp →
→→
→ Ngắt Timer 2 (chỉ có ở 8052)
Hình dưới đây minh họa 5 ngun nhân ngắt, cơ chế cho phép riêng rẽ và tồn cục, chuỗi vòng
và các mức ưu tiên. Trạng thái của tất cả các ngun nhân ngắt được thể hiện thơng qua các bit cờ
tương ứng trong các thanh ghi chức năng đặc biệt có liên quan. Dĩ nhiên nếu một ngắt nào đó khơng
được phép, ngun nhân ngắt tương ứng khơng thể tạo ra một ngắt nhưng phần mềm vẫn có thể kiểm
tra cờ ngắt đó. Lấy thí dụ bộ định thời và port nối tiếp trong hai chương trước sử dụng các cờ ngắt một
cách rộng rãi dù khơng có ngắt tương ứng xảy ra, nghĩa là khơng sử dụng các ngắt.
Ngắt do port nối tiếp là kết quả OR của cờ ngắt khi thu RI (cờ ngắt thu) và cờ ngắt khi phát TI
(cờ ngắt phát).
Chương 6: Hoạt động ngắt (Interrupt). Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 183 Biên soạn: Phạm Quang Trí
Cấu trúc ngắt của 8051:
IV. XỬ LÝ NGẮT VÀ CÁC VECTƠ NGẮT:
1. Qui trình xử lý ngắt:
Các thao tác sẽ xảy ra khi có một ngắt xuất hiện và nó được CPU chấp nhận:
• Hồn tất thực thi lệnh tại thời điểm đó và dừng chương trình chính.
• Giá trị của thanh ghi PC được cất vào stack.
• Trạng thái của ngắt tại thời điểm đó được lưu giữ lại.
• Các ngắt được giữ lại ở mức ngắt.
• ðịa chỉ của ISR của ngắt tương ứng được nạp vào thanh ghi PC.
• ISR của ngắt tương ứng được thực thi.
(ISR thực thi xong khi gặp lệnh RETI).
• Giá trị trong stack (của PC cũ) được phục hồi lại vào thanh ghi PC.
• Trạng thái các ngắt được phục hồi lại.
• Chương trình chính tiếp tục được thực thi tại chỗ bị tạm dừng.
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 RET
(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.
Chương 6: Hoạt động ngắt (Interrupt). Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 184 Biên soạn: Phạm Quang Trí
2. Các vectơ ngắt:
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à vectơ
ngắt. Vectơ ngắt là địa chỉ bắt đầu của chương trình phục vụ ngắt (ISR) của ngắt tương ứng.
Vectơ reset hệ thống cũng được xem như là một 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ỏ đến, 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, các ngun nhân ngắt thuộc
loại này do có hai khả năng tạo ra ngắt nên trong thực tế CPU khơng xóa cờ ngắt.
Bảng qui định địa chỉ bắt đầu của các ISR (bảng vectơ ngắt):
V. THIẾT KẾ CÁC CHƯƠNG TRÌNH SỬ DỤNG NGẮT:
1. Tổng quan:
Khi thiết kế các chương trình khơng sử dụng ngắt thì ta sẽ gặp phải những trường hợp CPU
hồn tồn tiêu phí thời gian vào việc chờ đợi các tác nhân cần thiết xảy ra (Ví dụ:
sự tràn của cờ TF0,
TF1; việc thu xong một dữ liệu và cờ RI=1; việc phát xong một ký tự và cờ TI=1; v.v…) để sau đó mới
tiếp tục thực hiện cơng việc.
⇒ ðiều này khơng thích hợp cho các ứng dụng điều khiển đòi hỏi phải tác động qua lại với
nhiều thiết bị cùng lúc.
ðể giải quyết vấn đề trên ta cần thiết kế các chương trình có sử dụng đến ngắt.
⇒ Vì nó giúp cho CPU khơng tốn thời gian để chờ đợi tác nhân mà chỉ khi nào tác nhân xảy
đến thì CPU mới thực hiện việc xử lý tác nhân đó, khoảng thời gian tác nhân khơng xảy ra thì CPU sẽ
làm việc khác.
Chương 6: Hoạt động ngắt (Interrupt). Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 185 Biên soạn: Phạm Quang Trí
Tổ chức bộ nhớ khi sử dụng ngắt:
Khng mẫu cho một chương trình có sử dụng ngắt:
ORG 0000H ;ðiểm nhập của reset hệ thống.
LJMP MAIN ;Lệnh nhảy để vượt qua các ISR.
……………… ;ðiểm nhập của các ISR.
………………
………………
ORG 0030H ;ðiểm nhập của chương trình chính.
MAIN: ……………… ;Chương trình chính bắt đầu.
………………
………………
END
2. Thiết kế các chương trình ISR kích thước nhỏ:
ðiều kiện:
Khi ISR có kích thước khơng q 8 byte (kể cả lệnh RETI).
⇒ ISR phải được viết trong phạm vi điểm nhập tương ứng của nó trong bộ nhớ chương trình (xem
phần tổ chức bộ nhớ khi sử dụng ngắt).
Lưu ý:
• Nếu chỉ có một ngun nhân ngắt được sử dụng thì ISR của nó có thể được viết tràn
sang điểm nhập của các ISR khác (nghĩa là ISR có kích thước lớn hơn 8 byte, nhưng phải nhỏ hơn 46
byte). Vì khi đó vùng nhớ của các ISR khác khơng được dùng đến nên ta có thể tận dụng để sử dụng
cho ISR này.
• Nếu có nhiều ngun nhân ngắt được sử dụng thì ta phải cẩn thận để đảm bảo cho các
ISR được bắt đầu đúng vị trí mà khơng tràn sang ISR kế (nghĩa là ISR có kích thước khơng q 8 byte).
Chương 6: Hoạt động ngắt (Interrupt). Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 186 Biên soạn: Phạm Quang Trí
Khng mẫu chương trình: (Ví dụ: dùng ngắt Timer0 và ngắt ngồi 1)
ORG 0000H ;ðiểm nhập của reset hệ thống.
LJMP MAIN ;Lệnh nhảy để vượt qua các ISR.
ORG 000BH ;ðiểm nhập cho ISR của Timer 0.
……………… ;ISR của Timer 0.
………………
RETI ;Kết thúc ISR của Timer 0.
ORG 0013H ;ðiểm nhập cho ISR của ngắt ngồi 1.
……………… ;ISR của ngắt ngồi 1.
………………
RETI ;Kết thúc ISR của ngắt ngồi 1.
ORG 0030H ;ðiểm nhập của chương trình chính.
MAIN: ……………… ;Chương trình chính bắt đầu.
………………
………………
END
3. Thiết kế các chương trình ISR kích thước lớn:
ðiều kiện:
Khi ISR có kích thước vượt q 8 byte.
⇒ ISR khơng thể viết vào điểm nhập tương ứng của nó trong bộ nhớ chương trình (vì kích thước
điểm nhập chỉ có 8 byte) → ta phải chuyển ISR này đến một nơi khác trong bộ nhớ chương trình hoặc
có thể viết lấn qua điểm nhập của ISR kế tiếp (nếu ISR đó khơng sử dụng).
Khng mẫu chương trình: (Ví dụ:
dùng ngắt Timer0 và ngắt ngồi 1)
ORG 0000H ;ðiểm nhập của reset hệ thống.
LJMP MAIN ;Lệnh nhảy để vượt qua các ISR.
ORG 000BH ;ðiểm nhập cho ISR của Timer 0.
LJMP T0ISR ;Lệnh nhảy đến ISR của Timer 0.
ORG 0013H ;ðiểm nhập cho ISR của ngắt ngồi 1.
LJMP EX1ISR ;Lệnh nhảy đến ISR của ngắt ngồi 1.
ORG 0030H ;ðiểm nhập của chương trình chính.
MAIN: ……………… ;Chương trình chính bắt đầu.
………………
………………
SJMP $ ;Lệnh cách ly chương trình.
T0ISR: ……………… ;ISR của ngắt Timer 0.
………………
RETI ;Kết thúc ISR của Timer 0.
EX1ISR: ……………… ;ISR của ngắt ngồi 1.
………………
RETI ;Kết thúc ISR của ngắt ngồi 1.
END
Chương 6: Hoạt động ngắt (Interrupt). Trường ðH Cơng nghiệp Tp.HCM.
Giáo trình Vi xử lý. 187 Biên soạn: Phạm Quang Trí
• Nhận xét tổng qt:
o ðể đơn giản, các chương trình của chúng ta chỉ làm việc ở thời điểm bắt đầu. Chương
trình chính khởi động port nối tiếp, bộ định thời và các thanh ghi ngắt sao cho thích hợp với u cầu
đặt ra và rồi khơng làm gì cả. Cơng việc hồn tồn được thực hiện bên trong các ISR. Sau các lệnh
khởi động, chương trình chính chứa và thực hiện lệnh sau đây (lệnh nhảy tại chổ – khơng làm gì cả):
SJMP $
o Khi có một tín hiệu ngắt xuất hiện, chương trình chính tạm thời bị dừng lại trong khi ISR
được thực thi. Lệnh RETI ở cuối của các ISR sẽ trả điều khiển về cho chương trình chính và chương
trình chính tiếp tục khơng làm gì cả (lệnh nhảy tại chổ ). ðiều này khơng có gì là khơng tự nhiên đối
với chúng ta. Trong nhiều ứ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 ví dụ minh họa dưới đây sẽ cho ta thấy điều này.
VI. CÁC VÍ DỤ MINH HỌA:
1. Ví dụ minh họa xử lý ngắt Timer:
Ví dụ 1:
Viết chương trình sử dụng Timer 0 và các ngắt để tạo ra một sóng vng có tần số 10
KHz trên chân P1.0, f
Osc
= 12MHz.
Giải
ORG 0000H ;ðiểm nhập reset.
LJMP MAIN ;Nhảy qua khỏi các vectơ ngắt.
ORG 000BH ;ðiểm nhập ISR của Timer 0.
T0ISR: ;ISR của Timer 0.
CPL P1.0 ;Lấy bù.
RETI ;Kết thúc ISR của Timer 0.
ORG 0030H ;ðiểm nhập chương trình chính.
MAIN: ;Chương trình chính bắt đầu.
MOV TMOD, #02H ;Chọn chế độ 2 cho Timer 0.
MOV TH0, #(-50) ;ðịnh thời 50µs.
SETB TR0 ;Cho Timer 0 hoạt động.
MOV IE, #82H ;Cho phép ngắt Timer 0 .
SJMP $ ;Khơng làm gì (nhảy tại chỗ).
END ;Kết thúc chương trình.
Lưu ý: Lệnh SJMP$ có thể được thay thế bằng một đoạn lệnh để thực thi những cơng
việc khác. Việc thay thế này khơng ảnh hưởng gì đến việc tạo sóng vng f=10KHz tại chân P1.0. Vì
cứ sau mỗi 50µs thì những cơng việc đó sẽ bị tạm dừng (ngắt Timer 0 xuất hiện) để CPU thực hiện việc
tạo sóng vng rồi quay về thực hiện tiếp những cơng việc đó.
Ngay sau khi reset hệ thống, bộ đếm chương trình PC được nạp 0000H. Lệnh đầu tiên được
thực thi là LJMP MAIN, lệnh này rẽ nhánh đến chương trình chính ở địa chỉ 0030H trong bộ nhớ
chương trình. Ba lệnh đầu tiên của chương trình chính sẽ khởi động Timer 0 ở chế độ 8 bit tự động nạp
lại (Mode 2), sao cho Timer 0 sẽ tràn sau mỗi 50µs. Lệnh MOV IE, #82H cho phép các ngắt do Timer0
tạo ra. Mỗi một lần tràn, Timer sẽ tạo ra một ngắt. Dĩ nhiên là lần tràn đầu tiên sẽ khơng xuất hiện sau
Không có nhận xét nào:
Đăng nhận xét