1
BÀI 6
Tên bài:
HO T Đ NG NG T
Ạ Ộ
Ắ (Interrupt)
GIỚI THI UỆ
ể Bài này trình bày về khả năng quản lý đ ngồ th iờ nhi uề thiết bị ngo iạ vi nhờ vào tính năng xử lý ngắt c aủ MCS-51, đi uề này rất phù h pợ v iớ yêu c uầ l pậ trình hư ngớ đi uề khi n N i ộ dung bài g mồ cả lý thuyết và thực hành trên bộ thực t pậ UNIKIT, thiết bị ngo iạ cượ trang bị s nẳ trên board UNIKIT vi có thể giao ti pế v iớ 8051 thông qua các ngỏ I/O đ như: Công tắc, nút nhấn, đèn, chuông, đ ngộ cơ...
M CỤ TIÊU TH CỰ HI NỆ
cượ tác d ngụ thực tế của một hệ th ngố đ cượ đi uề khi nể b ngằ tín hi uệ
• Hi uể đ ngắt. Biết đ cượ tổ chức ngắt và cơ chế thực hi nệ chư ngơ trình ph cụ vụ ngắt • c aủ
• 8051 Biết cách kh iở t oạ ngắt theo yêu cầu.
NỘI DUNG CHÍNH
Vai trò c aủ ngắt trong yêu c uầ đi uề khi nể Tổ chức ngắt trong 8051
Phư ngơ pháp kh iở t oạ ngắt
N iộ dung bài h cọ t pậ trung về các chủ đề chính như sau: • • • Các thanh ghi chức năng đ cặ biệt liên quan • • Cách viết chư ngơ trình ph cụ vụ ngắt kích thư cớ nhỏ và l nớ • Các ứng dụng đi nể hình
2
1. MỞ Đ UẦ
Một hệ th ngố đ
Ngắt là sự xuất hi nệ c aủ một đi uề kiện, một sự ki nệ làm t mạ dừng chư ngơ trình trong khi đi uề ki nệ này đ cượ ph cụ vụ bởI một chư ngơ trình khác. Ngắt có một vai trò quan tr ngọ trong thiết kế và thực hi nệ các ứng d ngụ c aủ vi đi uề khiển. Chúng cho phép hệ th ngố đáp ứng không đ ngồ bộ vớI một sự ki nệ và xử lý sự ki nệ trong khi một chư ngơ trình khác đang hoạt đ ng.ộ cượ đi uề khi nể b ngằ ngắt t oạ một oả giác thực hi nệ đ ngồ thờI nhi uề công vi cệ cùng một lúc.. Dỉ nhiên, tạI một thờI đi mễ CPU không thể thực hi nệ nhi uề h nơ một l nhệ nhưng nó có thể t mạ dừng chư ngơ trình để thực hi nệ một chư ngơ trình khác và sau đó trở lạI chư ngơ trình đ uầ tiên. Đi mễ khác là trong một hệ th ngố đi uề khi nể b ngằ ngắt, các ngắt không x yả ra như là kết quả c aủ một l nhệ (như l nhệ gọI chư ngơ trình con) mà là đáp ứng vớI một sự ki nệ x yả ra một cách không đ ngồ bộ vớI chư ngơ trình chính có nghĩa là không biết trư cớ chư ngơ trình chính sẻ bị ngắt lúc nào. Chư ngơ trình xử lý ngắt đ
cượ gọI là chư ngơ trình ph cụ vụ ngắt (Interrupt service routine) viết tắt là ISR hay qu nả lý ngắt. ISR hoạt đ ngộ để đáp ứng một ngắt và thư ngờ thực hi nệ một thao tác vào ho cặ ra đ nế một thiết bị. Khi xảy ra một ngắt thì chư ngơ trình chính t mạ thờI dừng lạI và rẻ nhánh đ nế ISR. ISR thực hi nệ các thao tác c nầ thiết và kết thúc vớI l nhệ trở về từ ngắt và chư ngơ trình chính lạI ti pế t cụ từ n iơ t mạ dừng. Như vậy có thể nói chư ngơ trình chính hoạt đ ngộ ở mức cơ sở và các ISR hoạt đ ngộ ở mức ngắt cũng có dùng các thuật ngữ: “phía trư c”ớ (foreground) để chỉ mức cơ sở và “phía sau” (backgrround) để chỉ mức ngắt, trong hình 6.1a trình bày hoạt đ ngộ c aủ một chư ngơ trình không có ngắt và 6.1b là hoạt đ ngộ c aủ chư ngơ trình chính ở mức cơ sở có ngắt và các ngắt hoạt động ở mức ngắt.
Thời gian
Chương trình chính
a) Thực hiện chương trình không có ngắt
ISR
ISR
ISR
main
main
main
main
b) Thực hiện chương trình với ngắt
Hình 6.1 Thực hiên chương trình
cượ đi uề khi nể b ngằ ph nầ m mề đang ch yạ trong hệ th ng.ố Một ví dụ đi nể hình về ngắt là vi cệ nh pậ dử liệu b ngằ tay dùng bàn phím. Hãy kh oả sát một ứng d ngụ về lò vi sóng: Chư ngơ trình chính đi uề khi nể ph nầ tử t oạ năng lư ngợ vi sóng để n uấ ăn, nhưng trong khi đang n uấ hệ thống c nầ phảI đáp ứng việc nh pậ b ngằ tay trên c aử lò ví dụ tăng ho cặ giãm thờI gian nấu. Khi ngườI xử d ngụ thả nút nhấn, một ngắt đ cượ t oạ ra (có thể là một tín hi uệ chuy nể từ mức cao xu ngố mức th p)ấ và chương trình chính bị dừng lạI, chương trình ISR hoạt đ ngộ đ cọ các mả c aủ bàn phím và thay đổI quá trình n uấ tư ngơ ứng sau đó ch mấ dứt b ngằ cách chuy nể đi uề khi nể về cho chư ngơ trình chính, chương trình chính lạI ti pế tục từ n iơ bị ngắt. Một đi mể quan tr ngọ trong ví dụ này là vi cệ nh pậ b ngằ tay x yả ra một cách không đ ngồ bộ có nghĩa là không biết trư cớ ho cặ Đó chính là đ cặ đi mễ không đ c aủ ngắt
2. TỔ CH CỨ NGẮT CỦA 8051
8051 có năm ngu nồ tín hi uệ ngắt: 2 ngắt ngoài, 2 ngắt đ nhị
th iờ và 1 ngắt c ngổ n iố tiếp. 8052 có thêm ngắt thứ sáu của timer thứ ba. Tr ngạ thái m cặ định c aủ các ngắt là không hoạt đ ngộ sau khi reset hệ th ngố và chuy nể sang hoạt đ ngộ từng ngắt riêng rẻ b ngằ ph nầ m m.ề
Trong trư ngờ h pợ có hai ho cặ nhi uề ngắt xuất hi nệ đ ngồ thời ho cặ một ngắt x yả ra trong khi một ngắt khác đang đ cượ ph cụ vụ. Có hai sơ đồ s pắ x pế ưu tiên các ngắt đó là: Chu iỗ pooling và ưu tiên hai cấp, thứ tự theo chu iỗ pooling thì cố định nhưng sơ đồ ưu tiên hai c pấ thì l pậ trình được. Sau đây là phư ngơ pháp cho phép và không cho phép sự hoạt đ ngộ c aủ các ngắt.
Cho phép và không cho phép các ng tắ
M iỗ một tín hi uệ ngắt đ cượ cho phép ho cặ không cho phép b iở đ aị chỉ bít iạ đ aị chỉ 0A8H, có một bít cho trong thanh ghi chức năng đ cặ biệt IE (Interrupt enable) t phép toàn cục, bít này khi bị xóa sẻ ngăn tất cả các ngắt. (b ngả 6.1). Để cho phép một ngắt c nầ ph iả set hai bít: Một bít cho phép riêng và bít cho phép toàn cục. VD Ngắt timer 1 đ cượ cho phép như sau:
SETB ET1 SETB EA Ho cặ MOV IE,#10001000B
M cặ dù hai cách trên có cùng kết quả sau khi reset hệ th ngố nhưng kết quả sẻ khác nhau n uế IE được ghi ở giữa chư ngơ trình trong khi đang chạy. Cách thứ nhất không nhả hư ngỡ đ nế 5 bít còn lại trong thanh ghi IE còn cách thứ hai sẻ xóa các bít còn lại khác. iạ vị trí bắt đ uầ chư ngơ trình (nghĩa là khi bắt đ uầ mở Tốt nhất nên dùng cách thứ hai t máy ho cặ reset hệ th nố g) nên dùng l nhệ SETB và CLR trong khi chư ngơ trình đang ch yạ để tránh nhả hư ngỡ các bít khác trong thanh ghi IE.
M c u tiên ứ ư M iỗ ngắt đ
cượ l pậ trình ở một trong hai mức ưu tiên bằng thanh ghi IP (Interrupt iạ đ aị chỉ oB8H (b ngả 6.2) Thanh ghi IP tự đ ngộ xóa sau khi reset hệ th ngố để
priority) t đặt các ngắt ở mức ưu tiên th pấ 6.1 Thanh ghi IE B NGẢ
BÍT Ký hi uệ Đ aị chỉ bít Mô tả (1=cho phép, 0=không cho phép)
IE.7 IE.6 IE.5 IE.4 IE.3 IE.2 IE.1 IE.0 AFH AEH ADH ACH ABH AAH A9H A8H EA - ET2 ES ET1 EX1 ET0 EX0 Cho phép toàn c cụ Không dùng Cho phép ngắt timer 2 (8052) Cho phép ngắt c ngổ n iố ti pế Cho phép ngắt timer 1 Cho phép ngắt 1 ngoài Cho phép ngắt timer 0 Cho phép ngắt 0 ngoài
6.2 Thanh ghi IP B NGẢ
BÍT Ký hi uệ Đ aị chỉ bít Mô tả (1=mức cao, 0=mức th p)ấ
IP.7 IP.6 IP.5 IP.4 IP.3 IP.2 IP.1 IP.0 - - PT2 PS PT1 PX1 PT0 PX0 - - 0BDH 0BCH 0BBH 0BAH 0B9H 0B8H Không dùng Không dùng uƯ tiên ngắt timer 2 (8052) uƯ tiên ngắt c ngổ n iố tiếp uƯ tiên ngắt timer 1 uƯ tiên ngắt 1 ngoài uƯ tiên ngắt timer 0 uƯ tiên ngắt 0 ngoài
Khái ni mệ “ưu tiên” cho phép một ISR bị dừng b iở một ngắt khác n uế ngắt m iớ xuất
iạ x yả ra một ngắt ưu tiên hi nệ này có mức ưu tiên cao h nơ ngắt đang được ph cụ vụ, đi uề này phù h pợ v iớ 8051 vì chỉ có hai mức ưu tiên, n uế một ISR ưu tiên th pấ đang chạy nhưng l cao thì ISR sẻ bị dừng. Một ISR ưu tiên không thể bị dừng.
Chư ngơ trình chính hoạt đ ngộ ở mức ưu tiên cơ sở và không liên hệ v iớ một ngắt bất kỳ nào nên luôn bị dừng khi x yả ra ngắt. N uế hai ngắt có mức ưu tiên khác nhau cùng x yả ra thì ngắt có mức ưu tiên cao sẻ đ cượ phục vụ trước.
Chu iỗ pooling
N uế đ ngồ th iờ xuất hi nệ hai ngắt có cùng mức ưu tiên thì ngắt đ cượ ph cụ vụ trư cớ cượ xác định theo thứ tự chu iỗ pooling: Ngắt 0 ngoài, ngắt timer 0, ngắt 1 ngoài, ngắt đ timer 1, ngắt c ngổ n iố tiếp, ngắt timer 2. Hình 6.2 trình bày năm ngu nồ tín hi uệ ngắt cùng cơ chế cho phép toàn c cụ và riêng
cượ cho phép thì ngắt tư ngơ ứng không đ
rẻ, chu iỗ pooling và các mức ưu tiên, tr ngạ thái c aủ tất cả các ngu nồ tín hi uệ ngắt có thể thông qua các bít cờ trong thanh ghi chức năng đ cặ biệt. Dỉ nhiên, n uế một ngắt nào đó không đ cượ t oạ ra nhưng ph nầ mềm v nẩ có thể ki mể tra cờ ngắt. Các ví dụ về timer và cổng n iố ti pế trong hai bài trư cớ đã sử d ngụ các cờ ngắt mà thực tế không dùng các ngắt. Một ngắt c ngổ n iố ti pế là kết quả từ phép OR c aủ ngắt thu (RI) v iớ ngắt phát (TI). cượ t oạ ra b iở cờ tràn TF2 ho cặ v iớ cờ nh pậ bên ngoài EXF2. Tư ngơ tự, ngắt timer 2 đ Khả năng t oạ ngắt c aủ các bít cờ đ cượ tóm tắt trong b ngả 6.3
3. XỬ LÝ NGẮT
Khi một ngắt xuất hi nệ đ cượ CPU nh nậ ra, chư ngơ trình chính sẻ dừng l iạ và kế ti pế là các thao tác như sau:
Lưu n iộ dung thanh ghi PC vào ngăn x pế Lưu tr ngạ thái ngắt hi nệ hành iạ mức ngắt iạ t
• Thực hi nệ hoàn tất l nhệ hi nệ hành • • • Các ngắt đ cượ ch nặ l • N pạ đ aị chỉ vectơ c aủ ISR vào PC • Thực hi nệ ISR Chư ngơ trình ISR hoạt đ ngộ và thực hi nệ các thao tác tương ứng v iớ ngắt. Sau đó, kết iạ giá trị c aủ PC từ ngăn thúc khi g pặ l nhệ RETI (return from interrupt), l nhệ này l yấ l x pế và ph cụ h iồ tr ngạ thái ngắt củ, chư ngơ trình ti pế t cụ chạy từ n iơ t mạ dừng.
B NGẢ 6.3 Các bít cờ ngắt
Cờ Thanh ghi SFR và vị trí bít
Ng tắ 0 ngoài 1 ngoài timer 1 timer 0 c ngổ n iố tiếp c ngổ n iố tiếp timer 2 timer 2 IE0 IE1 TF1 TF0 Ti Ri TF2 EXF2 TCON.1 TCON.3 TCON.7 TCON.5 SCON.1 SCON.0 T2CON.7 (8052) T2CON.6 (8052)
u tƯ iên cao
INT0
IE0
u tiƯ ên thấp
TF0
INT1
IE1
TF1
Chuỗi pooling
Ri
Ti
TF2
EXF2
Cho phép riêng
Cho phép toàn cục
Hình 6.2 Cấu trúc ngắt 8051
Các vec tơ ng tắ Khi một ngắt đ
cượ ch pấ nhận, giá trị n pạ vào bộ đ mế chư ngơ trình PC đ cượ g iọ là cượ véc tơ ngắt. Đây là đ aị chỉ bắt đ uầ c aủ ISR đ iố v iớ ngắt tư ngơ ứng. Các véc tơ ngắt đ cho trong bẳng 6.4. iạ đ aị chỉ 0000H) cũng đ Véc tơ reset hệ th ngố (RST t
nguyên nhân t oạ ngắt và sau đó cờ ngắt đ cượ ki mể tra trong ISR để xác đ nhị
cượ cho trong b ngả nên nó cũng gi ngố như một ngắt, nó dừng chư ngơ trình chính và n pạ vào PC một giá trị mới. Khi trỏ đ nế một ngắt, cờ gây ra ngắt sẻ bị xóa tự đ ngộ bị xóa b iở ph nầ cứng ngo iạ trừ Ri và Ti đ iố v iớ ngắt c ngổ nối ti pế và TF2, EXF2 đ iố v iớ ngắt timer 2. Do có hai nguyên nhân t oạ ngắt cho các ngắt này nên thật là không thực tế n uế CPU xóa cờ ngắt. Các bít này ph iả đ cượ xóa b ngằ ph nầ m m,ề thư ngờ có một sự rẻ nhánh đ nế các thao tác tương ứng phụ thu cộ vào ngu nồ t oạ ra ngắt. Vì các véc tơ ngắt được đặt phía dư iớ đáy c aủ bộ nhớ chư ngơ trình nên l nhệ đ u tiên ầ c aủ chư ngơ trình chính thư ngờ là l nhệ nh yả qua vùng này VD l nhệ LJMP 0030H.
4. THIẾT KẾ CHƯƠNG TRÌNH DÙNG NGẮT
Trong các bài trư cớ đây đã không dùng đ nế ngắt mà dùng nhi uề các vòng l pặ để ki mể tra cờ tràn c aủ timer TF0, TF1 ho cặ TF2 ho cặ các cờ thu phát của c ngổ n iố ti pế Ti ho cặ Ri, v nấ đề c aủ phư ngơ pháp này là th iờ gian hoạt đ ngộ c aủ CPU hoàn toàn được dùng vào vi cệ chờ các cờ này được set, đi uề này hoàn toàn không thích h pợ v iớ các ứng d ngụ hư ngớ đi uề khi nể mà trong đó yêu c uầ vi đi uề khi nể ph iả đ ngồ th iờ tư ngơ tác v iớ nhi uề thiết bị vào ra. Một ví dụ trong ph nầ này sẻ minh h aọ các phư ngơ pháp thực tế viết ph nầ m mề cho các ứng dụng hư ngớ đi uề khiển, thành ph nầ chính là các ngắt. M cặ dù các ví dụ này
cượ nh nậ ra bằng cách ti nế không c nầ thiết l nớ h nơ nhưng chúng sẻ phức t pạ hơn, điều này đ hành từng bước. Một số r cắ r iố x yả ra trong khi thiết kế hệ th ngố là do các ngắt. Các chư ngơ trình ví dụ sau đây đư cợ bắt đ uầ t iạ đ aị chỉ 0000H và chư ngơ trình sẻ các chư ngơ trình này phát tri nể cho các ứng d ngụ cượ lưu vào ROM ho cặ EPROM. Khuôn m uẫ đề nghị cho một chư ngơ trình bắt đ uầ thực hi nệ khi reset hệ th ng,ố thực tế và đ có xử d ngụ ngắt như sau:
ORG 0000H ; reset đi mễ nh pậ LJMP MAIN
; các đi mễ nh pậ ISR . . . ORG 0030H ; đi mễ nh pậ chư ngơ trình chính MAIN: ……….. ; bắt đ uầ chư ngơ trình chính
L nhệ đ uầ tiên nh yả đ nế đ aị chỉ 0030H ngay phía trên các vị trí c aủ véc tơ ngắt và cũng là n iơ bắt đ uầ các ISR như ở hình 6.3, chư ngơ trình chính bắt đ uầ t iạ đ aị chỉ 0030H
B NGẢ 6.4 Các véc tơ ngắt
Cờ Đ aị chỉ véc tơ
ROM ngoài
Ng tắ Reset hệ th ngố 0 bên ngoài Timer 0 1 bên ngoài Timer 1 C ngổ n iố tiếp Timer 2 0000H 0003H 000BH 0013H 001BH 0023H 002BH RST IE0 TF0 IE1 TF1 Ri ho cặ Ti TF2 ho cặ EXF2
Chương trình chính
FFFF
Điễm nhập reset và ngắt
0030 002F
Hình 6.3 T ổ chức ngắt trong b ộ nhớ
0000
Ch
c ướ nhỏ ngươ trình ph c vụ ụ ng tắ kích th Các chư ngơ trình ph cụ vụ ngắt ph iả bắt đ uầ g nầ phía dư iớ đáy c aủ bộ nhớ chư ngơ iạ các đ aị chỉ cho trong b ngả 6.4. M cặ dù giữa các đi mễ nh pậ chỉ có 8 byte nhưng
trình t thư ngờ cũng đủ để thực hi nệ các thao tác c nầ thiết và trở l iạ chư ngơ trình chính từ ISR N uế chỉ dùng một tín hi uệ ngắt ví dụ timer 0 thì có thể áp d ngụ chương trình sau đây
ORG 0000H ; reset LJMP MAIN ORG 000BH ; đi mễ nh pậ timer 0 T0ISR: ……… ; bắt đ uầ ISR c aủ timer 0
……….. ……… RETI ; trở về chư ngơ trình chính ; chư ngơ trình chính MAIN: ……….. ………..
N uế dùng nhi uề ngắt thì ph iả c nẩ th nậ để b oả đãm r ngằ chúng bắt đ uầ t
iạ các vị trí đúng (b ngả 6.4) và không đè lên các ISR kế ti pế vì trong ví dụ trên chỉ dùng có một ngắt nên chư ngơ trình chính có thể bắt đ uầ ngay phía dư iớ l nhệ RETI
Ch
iạ đó ISR có
ướ ớn c l ngươ trình ph c vụ ụ ng tắ kích th N uế một ISR có kích thư cớ nhi uề h nơ 8 byte thì có thể chuy nể nó đến vị trí khác trong bộ nhớ chư ngơ trình ho cặ cho l nấ sang đi mễ nh pậ c aủ ngắt kế tiếp. Đi nể hình là ISR bắt đ uầ b ngằ một lệnh nh yả đ nế n iơ khác trong bộ nhớ chư ngơ trình và t thể tr iả r ngộ ra. Hãy xem ví dụ sau chỉ dùng ngắt timer 0
ORG 0000H ; reset LJMP MAIN ORG 000BH ; đi mễ nh pậ timer 0 LJMP T0ISR ORG 0030H;; trên vùng véc tơ ngắt
MAIN: ………… ………… ; ISR c aủ timer 0
T0ISR: ……….. ……….. ……….. RETI ; trở về chư ngơ trình chính
Để cho đ nơ gi nả các chư ngơ trình chỉ làm một vi cệ t
iạ th iờ đi mễ bắt đầu, chương trình chính sẻ kh iở t oạ timer, c ngổ n iố ti pế và các thanh ghi ngắt tương ứng và sau đó không làm gì hết. Toàn bộ công vi cệ đ cượ thực hi nệ trong ISR, sau các dòng lệnh kh iở t oạ chư ngơ trình chính chỉ còn dòng l nhệ sau đây
HERE: SJMP HERE
đ ng,ộ trình l Khi một ngắt xảy ra, chư ngơ trình chính t mạ th iờ dừng l iạ trong khi ISR đang hoạt l nhệ RETI ở cu iố ISR trả quy nề đi uề khiển về cho chư ngơ trình chính và chư ngơ iạ ti pế t cụ không làm gì cả. Đi uề này cũng không có gì lạ, trong nhi uề ứng d ngụ hướng đi uề khi nể ph nầ lớn công vi cệ thư ngờ đ cượ thực hi nệ trong chư ngơ trình ph cụ vụ ngắt
Ví dụ 6-1: T oạ xung vuông b ngằ ng tắ timer
Viết chư ngơ trình dùng timer 0 và các ngắt để tạo xung vuông 1 KHz t iạ chân P1.0
Các ngắt timer xảy ra khi các thanh ghi THx/TLx tràn và cờ TFx đ cượ set, chương trình như sau
ORG 0 LJMP MAIN ORG 000BH P1.0 ; reset ; nh yả qua vùng véc tơ ngắt ; véc tơ ngắt timer 0 ; đ oả port bít
T0ISR: CPL RETI ORG 0030H MAIN: MOV TMOD,#02H ; timer 0 mode 2
MOV TH0,#-50 SETB TR0 MOV IE,#82H SJMP $ ; delay 50m S ; kh iở đ ngộ timer ; cho phép ngắt timer 0 ; không làm gì cả
ộ
Đây là một chư ngơ trình đ yầ đủ có thể n pạ vào EPROM và cài đặt vào UNIKIT để ch yạ thử. Ngay sau khi reset bộ đếm chư ngơ trình sẻ đư cợ n pạ giá trị 0000H, lệnh đ uầ cượ thực hi nệ là LJMP MAIN và chư ngơ trình nh yả qua ISR c aủ timer đ nế đ aị chỉ tiên đ 0030H trong bộ nhớ chư ngơ trình, ba l nhệ tiếp theo kh iở t oạ timer 0 ở chế độ tự đ ng n p ạ lại 8 bít và tràn sau m iỗ 50 m S. L nhệ MOV IE,#82H cho phép ngắt timer 0 có nghĩa l uấ m iỗ l nầ tràn c aủ timer sẻ t oạ ra một ngắt.
Dỉ nhiên l nầ tràn đ uầ tiên sẻ không xảy ra sau 50 m S do chư ngơ trình chính rơi vàovòng l pặ “không làm gì cả”. Cứ sau m iỗ 50 m S một ngắt sẻ xuất hiện, chư ngơ trình chính bị dừng và chư ngơ trình T0ISR hoạt đ ngộ đ oả trạng thái c aủ port bít và sau đó trở về chư ngơ trình chính thực hi nệ tiếp vòng l pặ “không làm gì c ”ả và chờ một ngắt khác sau 50 m S ti pế theo. Lưu ý là cờ timer TF0 không bị xóa b ngằ ph nầ mềm, khi các ngắt đư cợ cho phép
cượ l yấ l
iạ 08H (PCL) TF0 sẻ bị xóa tự đ ngộ b iở ph nầ cứng ngay khi CPU trỏ đ nế ngắt. Đ aị chỉ trở về trong cượ CPU cất vào trong ngăn x pế chư ngơ trình chính là vị trí c aủ l nhệ SJMP, đ aị chỉ này đ iạ từ ngăn x pế khi thực hi nệ l nhệ RETI ở cu iố trư cớ khi trỏ đ nế véc tơ ngắt và đ chư ngơ trình ngắt. Do thanh ghi SP đã không đư cợ kh iở tạo nên đ aị chỉ m cặ đ nhị sau khi reset c aủ ngăn x pế là 07H, l nhệ PUSH sẻ cất địa chỉ trở về trong RAM n iộ t và 09H (PCH)
Ví dụ 6-2: T oạ hai xung b ngằ ng tắ
iạ port Viết chư ngơ trình xử d ngụ ngắt t oạ đ ngồ th iờ hai xung vuông 7 KHz và 500 Hz t P1.7 và P1.6
C uấ hình ph nầ cứng và d ngạ sóng ra đ cượ trình bày ở hình 6.4
143 m S
7 KHz
P1.7
2 mS
P1.6
500 Hz
Hình 6.4 Dạng sóng
8051
Vi cệ kết h pợ các ngỏ ra là cực kỳ khó khăn đối v iớ các hệ th ngố không đ
cượ đi uề khi nể b ngằ ngắt. Timer 0 hoạt đ ngộ ở mode 2 cung c pấ xung 7 KHz và timer 1 hoạt đ ngộ ở mode 1 cung c pấ xung 500 Hz. Vì xung 500 Hz có th iờ gian mức cao là 1 mS và mức th pấ cũng là 1 mS nên không thể dùng mode 2, chư ngơ trình như sau
; đ aị chỉ véc tơ timer 0
; đ aị chỉ véc tơ timer 1
ORG 0 LJMP MAIN ORG 0BH JMP T0ISR ORG 1BH LJMP T1ISR ORG 30H MAIN: MOV TMOD,#12H ; timer 1=mode 1; timer 0=mode 2 ; t oạ xung 7 KHz
; t oạ ngắt timer 1 ; cho phép cả hai ngắt timer MOV TH0,#-71 SETB TR0 SETB TF1 MOV IE,#8AH SJMP $
P1.7 T0ISR: CPL RETI
T1ISR: CLR TR1
; 1 mS mức cao ; và 1 mS mức th pấ
MOV TH1,#HIGH (-1000) MOV TL1,#LOW (-1000) SETB TR1 CPL P1.6 RETI
Chư ngơ trình chính và các ISR đ cả hai d ngạ sóng đ cượ đặt phía trên vùng dành cho các véc tơ ngắt cượ t oạ ra b iở l nhệ CPL. Tuy nhiên, cách t oạ th iờ và reset hệ th ng,ố gian trì ho nả thì có khác nhau. Vì c pặ thanh ghi TL1/TH1 ph iả đ cượ n pạ l
ngắt ) nên ISR c aủ timer 1 hoạt đ ngộ như sau: (a) dừng timer, (b) n pạ l kh iở đ ngộ timer và sau đó (d) đ oả port bít. Một đi mễ lưu ý là TL1/TH1 không đ iạ sau m iỗ l nầ tràn ( có nghĩa là sau m iỗ iạ TL1/TH1, (c) cượ kh iở
iạ vị trí bắt đ uầ c aủ chư ngơ trình chính gi ngố như TH0 vì TL1/TH1 ph iả đ iạ sau m iỗ l nầ tràn. TF1 đ cượ kh iở cượ set trong chư ngơ trình chính b ngằ ph nầ m mề để t oạ ra t oạ t t oạ l ngắt ban đầu ngay khi các ngắt được cho phép để bắt đ uầ d ngạ sóng 500 Hz. ISR c aủ timer 0 chỉ có nhi mệ vụ đ nơ gi nả là đ oả port bít và sau đó trở về chương trình chính, SJMP $ là d ngạ viết tắt c aủ HERE: SJMP HERE
5. NGẮT C NGỔ NỐI TIẾP
Các ngắt của c ngổ n iố ti pế x yả ra khi một trong hai cờ ngắt phát Ti ho cặ cờ ngắt thu cượ set. Ngắt phát xuất hi nệ khi quá trình phát c aủ ký tự trư cớ đó đ cượ viết cượ nh nậ đ yầ đủ và đang Ri đ vào SBUF hoàn tất, một ngắt thu xuất hi nệ khi một ký tự đã đ ch đ c ờ ọ trong SBUF
Các ngắt c ngổ n iố tiếp khác v iớ các ngắt c aủ timer, cờ t oạ ra ngắt c ngổ nối tiếp cượ xóa b ngằ ph nầ cứng khi CPU trỏ đ nế véc tơ ngắt lý do là có hai ngu nồ t oạ ra cượ xác đ nhị cượ xóa b ngằ ph nầ m m.ề Trở l iạ v iớ các ngắt timer, cờ ngắt đ trong ISR cượ xóa b ngằ không đ một ngắt cổng n iố ti pế đó là Ti hoặc Ri. Ngu nồ t oạ ra ngắt ph iả đ và cờ ngắt đ ph nầ cứng khi CPU trỏ đ nế ISR
Ví dụ 6-3: Xu tấ ký tự b ngằ ng tắ
Viết chư ngơ trình dùng ngắt xuất liên t cụ b ngả mã ASCII (bao g mồ cả ký tự đi uề khi n)ể đ nế một thiết bị cu iố nối v iớ c ngổ n iố ti pế c aủ 8051
Có 128 mã 7 bít trong b ngả mã ASCII bao g mồ 95 mã đồ h aọ (20H đ nế 7EH) và 33 cượ thực hi nệ ngay sau khi mã đi uề khi nể (00H đ nế 1FH và 7FH) chư ngơ trình sau đây đ reset hệ thống
; đi mễ nh pậ ngắt c ngổ n iố ti pế
ORG 0 LJMP MAIN ORG 0023H LJMP SPISR ORG 0030H MAIN: MOV TMOD,#20H ; timer 1 mode 2
; n pạ giá trị 1200 baud ; kh iở đ ngộ timer MOV TH1,#-26 SETB TR1 MOV SCON,#42H ; mode 1, set Ti để t oạ ngắt đ uầ tiên
MOV A,#20H MOV IE,#90H SJMP $ ; g iở ký tự thứ nhất ; g iở ký tự tr ngắ đ uầ tiên ; cho phép ngắt c ngổ n iố ti pế ; không làm gì cả
SPISR: CJNE A,#7FH,SKIP MOV A,#20H SKIP: MOV SBUF, A
; xóa cờ ngắt INC A CLR Ti RETI
Sau khi nhảy đ nế MAIN t
iạ đ aị chỉ 003H, ba lệnh đ uầ tiên kh iở t oạ timer 1 để cung c pấ xung đ ngồ hồ 1200 baud cho cổng n iố tiếp. MOV SCON,#42H kh iở t oạ c ngổ n iố ti pế hoạt đ ngộ ở mode 1 (8 bít UART) và set Ti để gây ra một ngắt ngay khi các ngắt đ cượ cho phép. Sau đó mã ASCII đ uầ tiên (20H) đư cợ n pạ vào A và cho phép các ngắt, cu iố cùng ph nầ thân c aủ chư ngơ trình chính là vòng l pặ “không làm gì c ”ả (SJMP $)
cượ reset về cượ gởi đi là 7EH) thì bộ tích l yủ đ cượ g iở đ nế bộ đ mệ c ngổ n iố tiếp (MOV SBUF, A) mã được cượ cượ set khi kết Chư ngơ trình ph cụ vụ ngắt c ngổ n iố ti pế làm tất cả công vi cệ m iỗ khi chư ngơ trình chính thiết l pậ các đi uề ki nệ ban đầu. Hai l nhệ đ uầ tiên ki mể tra bộ tích l yủ và n uế mã ASCII có giá trị là 7FH (mã cu iố cùng đ 20H, sau đó mã ASCII đ tăng lên (INC A), cờ ngắt phát bị xóa (CLR Ti) và kết thúc ISR (RETI), đi uề khi nể đ trả về chương trình chính và thực hi nệ ti pế lệnh SJMP $ cho đ nế khi Ti đ thúc quá trình xuất ký tự ti pế theo.
cượ N uế so sánh t cố độ của CPU v iớ t cố độ truy nề ký tự sẻ th yấ r ngằ SJMP $ đ thực hi nệ v iớ ph nầ trăm rất l nớ về th iờ gian trong chư ngơ trình, tỉ lệ ph nầ trăm này là bao nhiêu ? V iớ t cố độ 1200 baud thì m iỗ bít truy nề đi c nầ 1/1200 = 0,833 mS, 8 bít dử li uệ c ngộ v iớ 1 bít start và 1 bít stop cần 8,33 mS ho cặ 8330 m S, th iờ gian thực hi nệ dài nhất c aủ SPISR là t ngổ các chu kỳ c aủ từng l nhệ nhân v iớ 1 m S (giả sử t nầ số th chạ anh là 12 MHz), trong trư ngờ h pợ này là 8 m S. Như vậy, v iớ m iỗ 8333 m S c nầ thiết để truy nề một ký tự thì chỉ cần 8 m S cho SPISR, l nhệ SJMP thực hi nệ v iớ tỉ lệ (8325/8333) x 100 = 99,90 % cượ thay thế b ngằ các l nhệ khác để thực th iờ gian. Do dùng ngắt nên l nhệ SJMP có thể đ Các ngắt v nẩ xảy ra sau m iỗ 8333 m S và hi nệ các công vi cệ c nầ thiết khác c aủ ứng d ng.ụ ký tự v nẩ đư cợ xuất ra c ngổ n iố tiếp như nêu trên.
6. CÁC NGẮT NGOÀI
Các ngắt ngoài x yả ra t iạ mức thấp ho cặ c nhạ âm ở chân INT0 ho cặ INT1 c aủ
8051, đây là các chân đa năng c aủ port 3: Bít P3.2 (chân 12) và bít P3.3 (chân 13). Các cờ t oạ ra các ngắt này là bít IE.0 và IE.1 trong thanh ghi TCON, cờ t oạ ra ngắt còn đ iố v iớ bị xóa b iở ph nầ cứng khi CPU trỏ đ nế ISR n uế ngắt là lo iạ tác đ ngộ c nh,ạ ngắt tác động b ngằ mức thì ngu nồ tạo ngắt bên ngoài sẻ đi uề khi nể mức c aủ cờ ngắt. Vi cệ ch nọ lựa ngắt tác đ ngộ mức th pấ ho cặ tác động c nhạ âm đ cượ đ cượ l pậ trình cượ
cượ kích bằng c nhậ âm. iạ chân INT1 ở mức cao trong một chu kỳ và ở mức th pấ cượ set và sau đó cờ này sẻ yêu c uầ thông qua bít IT0 và IT1 trong thanh ghi TCON. VD: N uế IT1 = 0 thì ngắt 1 ngoài đ iạ chân INT1 và n uế IT1 = 1 thì ngắt này đ kích b iở mức th pấ t Trong chế độ này n uế các m uẫ t trong các chu kỳ kế tiếp thì cờ IE1 trong TCON đ một ngắt. Vì các chân ngắt ngoài đ
cượ l yấ mẫu m iỗ chu kỳ máy một l nầ nên ngỏ vào này phải đ cượ duy trì ít nhất trong 12 chu kỳ dao đ ngộ để b oả đãm vi cệ l yấ mẫu là thích hợp. N uế là lo iạ tác đ ngộ c nhạ thì ngu nồ ngoài ph iả giữ ở mức cao ít nhất một chu kỳ và ở mức th pấ ít nhất một chu kỳ ho cặ h nơ để b oả đãm nh nậ ra đ cượ sự chuy nể mức. IE0 và IE1 đ cượ xóa tự đ ngộ khi CPU trỏ đ nế ngắt.
N uế ngắt ngoài là lo iạ tác đ ngộ mức thì ngu nồ ngoài ph iả duy trì mức tác đ ngộ cho cượ t oạ ra. Sau đó ph iả trở về mức không tác đ ngộ trư cớ cượ t oạ ra. Thông thư ngờ một thao tác đ nế khi ngắt yêu c uầ thực sự đ khi ISR hoàn tất ho cặ trư cớ khi một ngắt khác đ trong ISR làm cho ngu nồ t oạ ngắt trả tín hi uệ ngắt trở về tr ngạ thái không tác đ ng.ộ
Ví dụ 6-4: Đi uề khi nể lò sưởi
10C Xử d ngụ ngắt thiết kế chư ngơ trình đi uề khi nể lò sư iở nổ định t iạ nhiệt độ 200C –
Giả sử rờ le tắt/mở lò sư iở đ cượ đặt P1.7
P1.7 = 1 (lò sư iở m )ở P1.7 = 0 (lò sư iở tắt)
Các cãm bi nế nhiệt độ đ cượ n iố đến INT0 và INT1 và t oạ ra các tín hi uệ HOT và
COLD theo thứ tự
HOT = 0 COLD = 0
n uế T> 210C n uế T< 190C
Lò sư iở đư cợ mở n uế T< 190C và tắt khi T> 210C, c uấ trúc ph nầ cứng và đồ thị th i gian ờ đ cượ trình bày ở hình 6.5
8051
INT0
HOT
Lò sưởi
P1.7
COLD
INT1
210
200
190
HOT
COLD
P1.7
Hình 6,5 S ơ đồ lò sư i và
ở
đ tồ h tị hời gian
ORG 0 LJMP MAIN EX0ISR: CLR P1.7 ; véc tơ ngắt 0 ngoài t iạ 0003H; lò sư iở tắt
; đ aị chỉ véc tơ 1 ngoài, lò sư iở mở
RETI ORG 13H EX1ISR: SETB P1.7 RETI ORG 30H MAIN: MOV IE,#85H ; cho phép các ngắt ngoài ; tác đ ngộ c nhạ âm
P3.2,SKIP
SETB IT0 SETB IT1 SETB P1.7 JB CLR P1.7 SJMP $ SKIP: ; mở lò sư iở ; n uế T> 21 ; thì tắt lò sư iở ; không làm gì cả
Ba dòng l nhệ đ uầ tiên trong chư ngơ trình chính cho phép các ngắt ngoài và làm cho
cả hai INT0 và INT1 trở thành loại tác đ ngộ c nhạ âm. Vì tr ngạ thái hi nệ t iạ c aủ các ngỏ
vào HOT (P3.2) và COLD (P3.1) không biết trư cớ nên c nầ ba dòng lệnh ti pế theo để tắt cượ mở (SETB P1.7) và ngỏ vào HOT ho cặ mở lò sư iở tùy theo nhiệt độ. Trư cớ tiên, lò đ cượ l yấ m uẫ (JB P3.2,SKIP) n uế ngỏ vào này ở mức cao, nhiệt độ chưa cao h nơ 210C đ nên l nhệ kế ti pế bị bỏ qua và lò v nẩ ti pế t cụ được mở.
Ngư cợ lai, n uế ngỏ vào HOT ở mức th pấ (T> 210C) thì l nhệ kế ti pế CLR P1.7 đ cượ thực hi nệ để tắt lò trư cớ khi đi vào vòng lặp “không làm gì cả”.
Lưu ý là chỉ d nẩ ORG 0003H không c nầ thiết ph iả hi nệ di nệ ngay trên nh nả EX0ISR iạ đ aị chỉ 0003H, do l nhệ LJMP MAIN dài 3 byte nên EX0ISR ch cắ ch nắ đư cợ bắt đầu t đi mễ nh pậ c aủ ngắt 0 ngoài.
Ví dụ 6-5: Hệ th ngố báo động
8051
INT0
P1.7
7404
Xung cửa mở
1 giây
400 Hz
Hình 6.6 Điều khiển loa bằng ngắt
2,5 mS
Dùng ngắt để thiết kế một hệ th ngố báo đ ngộ tạo ra âm thanh 400 Hz trong 1 giây (nhờ 1 loa n iố vào chân P1.7) m iỗ khi cãm bi nế đặt ở cửa (n iỗ đ nế chân INT0 ) t oạ ra một sư nờ xu ng.ố
Hư ngớ gi iả quyết là dùng 3 ngắt: Ngắt 0 ngoài (cãm biến cửa), ngắt timer 0 (âm th iờ 1 giây). Sơ đồ m chạ và đồ thị th iờ gian trình bày thanh 400 Hz) và ngắt timer 1 (đ nhị ở hình 6.6
; véc tơ timer 0
; véc tơ timer 1
ORG 0 LJMP MAIN LJMP EX0ISR ORG 000BH LJMP T0ISR ORG 001BH LJMP T1ISR ORG 0030H MAIN: SETB IT0 ; tác đ ngộ c nhạ âm
; cho phép EX0 MOV TMOD,#11H ; chế độ định th iờ 16 bít MOV IE,#81H SJMP $
EX0ISR: MOV R7,#20
; 20x5000 m S = 1 S ; t oạ ngắt timer 0 ; t oạ ngắt timer 1 ; t oạ âm thanh trong 1 S
SETB TF0 SETB TF1 SETB ET0 SETB ET1 RETI
T0ISR: CLR TR0
; n uế chưa đủ 20 lần, thoát ; n uế đủ, kết thúc âm thanh
DJNZ R7,SKIP CLR ET0 CLR ET1 LJMP EXIT SKIP: MOV TH0,#HIGH(-50000) ; trì ho nả 0,05 S
MOV TL0,#LOW(-50000) SETB TR0 RETI EXIT:
T1ISR: CLR TR1
MOV TH1,#HIGH(1250) MOV Tl1,#LOW(-1250) CPL P1.7 SETB TR1 RETI
END
L nhệ SETB IT0 cho phép ngỏ vào ngắt n iố v iớ cãm bi nế cửa đ iạ đ aị chi3 0030H chỉ cượ kích bởi Chư ngơ trình trên g mồ 5 ph nầ phân biệt: Vị trí các véc tơ ngắt, chư ngơ trình chính và 3 chư ngơ trình ph cụ vụ ngắt. Các vị trí véc tơ ngắt chứa các l nhệ LJMP để chuy nể đi uề khi nể đ nế các ISR tư ngơ nứ g. Chư ngơ trình chính bắt đ uầ t g mồ 4 l nh.ệ c nhạ âm. L nhệ MOV TMOD,#11H xác đ nhị
chế độ hoạt đ ngộ c aủ cả hai timer là chế độ định cượ bắt đ uầ (MOV IE,#81H) khi cửa mở là đi uề ki nệ c nầ cượ ch pấ nhận. L nhệ cu iố cùng SJMP $ đưa chư ngơ cượ phát hiện (c nhạ
th iờ 16 bít, chỉ có ngắt 0 ngoài đ ph iả có trước khi một ngắt nào đó đ trình chính vào vòng lặp “không làm gì c ”ả khi tr ngạ thái mở cửa đ âm t iạ INT0 ) thì ngắt 0 ngoài sẻ đ cượ tạo ra.
Chư ngơ trình ph cụ vụ ngắt EX0ISR bắt đ uầ bằng vi cệ n pạ h ngằ số 20 cho R7 r iồ set cờ tràn c aủ cả hai timer để bu cộ các ngắt đ nhị th iờ xuất hiện. Tuy nhiên, các ngắt timer chỉ xuất hi nệ khi các bít tương ứng trong thanh ghi IE cho phép. Hai l nhệ kế ti pế SETB ET0 và SETB ET1 cho phép các ngắt bộ đ nhị thời, cu iố cung EX0ISR trở v ề chư ngơ trình chính bằng l nhệ RETI. Timer t oạ ra kho ngả th iờ gian trì hoãn 1 S và timer 1 t oạ ra âm thanh 400 Hz. Sau cượ l pậ tức t oạ ra và đ
cượ ph cụ vụ trư cớ tiên. Kho ngả th iờ gian 1 S đ cượ t oạ ra b ngằ cách l pậ trình để l pặ l iạ khi chư ngơ trình EX0ISR kết thúc, các ngắt timer đ cượ thực hi nệ sau khi thực hi nệ 1 lệnh SJMP $. Do tác d ngụ c aủ chu iỗ pooling nên ngắt c aủ timer 0 đ 20 l nầ khoảng th iờ gian đ nhị th iờ 50000 m S, thanh ghi R7 hoạt đ ngộ như một bộ đ m.ế
cượ n pạ l iạ và ngắt đ cượ kết thúc. Ở lần ngắt thứ 20, R7 đ
cượ l pậ trình bằng cách xử d ngụ ngắt timer 1, t nầ số 400 Hz tư ngơ
Chư ngơ trình ph cụ vụ ngắt T0ISR hoạt động như sau: Trư cớ tiên, timer 0 được iạ giá trị -50000, đi uề khi nể dừng và thanh ghi R7 bị giãm 1, ti pế theo TH0/TL0 đ cượ giãm xu ngố 0 (đã timer 0 ch yạ trở l trôi qua 1 S), các ngắt c aủ cả hai timer bị ngăn (CLR ET0, CLR ET1) và ngắt kết thúc. Không còn ngắt do bộ đ nhị th iờ tạo ra nữa cho đ nế khi phát hi nệ cửa mở một l nầ nữa. Âm thanh 400 Hz đ ngươ chu kỳ là 2500 m S v iớ 1250 m S mức cao và 1250 m S mức thấp. Chư ngơ trình đ T1ISR chỉ đ nơ gi nả n pạ -1250 cho TH1/TL1, đ oả port bít để đi uề khi nể loa và kết thúc.
7. ĐỒ THỊ THỜI GIAN C AỦ NGẮT
Các ngắt đ cượ l yấ m uẫ và đ cượ xoay vòng đ nế chu kỳ máy kế ti pế và n uế có một điều ki nệ ngắt t nồ tại, ngắt đ cượ chốt ở S5P2 c aủ m iỗ chu kỳ máy (hình 6.7), chúng cượ đ ch pấ nh nậ nếu:
a) Không có ngắt nào khác có ưu tiên b ngằ hay cao h nơ đsng x yả ra. b) Chu kỳ xoay vòng là chu kỳ cu iố c aủ một l nh.ệ c) L nhệ hi nệ hành không ph iả là l nhệ RETI ho cặ l nhệ truy xuất đ nế thanh ghi IE ho cặ IP. Trong suốt hai chu kỳ kế tiếp, CPU cất n iộ dung c aủ PC vào ngăn x pế và n pạ cho PC đ aị chỉ véc tơ ngắt, chư ngơ trình ph cụ vụ ngắt đ cượ bắt đ uầ
Một chu kỳ máy (1 m S)
S1
S2
S3
S4
S5
S6
S5P1
S5P2
S6P1
S6P2
0,25 m S
Ngắt đư c lợ ấy mẫu
Hình 6.7 Lấy mẫu các ngắt tại S5P2
Đi uề ki nệ l nhệ hi nệ hành không ph iả là l nhệ RETI nh mằ b oả đãm rằng có ít nhất một l nhệ đ cượ thực hiện sau m iỗ một ISR
Chu kỳ 1
Chu kỳ 2 *
Chu kỳ 3
Chu kỳ 4
Chu kỳ 5
Lấy mẫu ngắt
Xoay vòng ngắt
Chấp nhận ngắt (Cất PC vào stack)
Bắt đầu ISR
* Phải là chu kỳ cuối cùng của lệnh hiện hành
Hình 6.8 Quá trình thực hiện ngắt
Th iờ gian từ lúc có một đi uề ki nệ ngắt xuất hi nệ đ nế khi ISR bắt đ uầ đ cượ g iọ là interrupt latency và rất quan tr ngọ trong một số các ứng dụng đi uề khiển.
Ngắt mức 1
Ngắt mức 0
Chương trình chính
RETI
MUL AB
Cất PC
9 m S
ở đây (c ơ hội cuối cùng
Ngắt mức 1 xuất hiện b ị b ỏ qua trước khi xuất hiện lệnh RETI)
Hình 6.9 Interrupt latency
cượ theo sau b iở một l nhệ nhân (hình V iớ th chạ anh 12 MHz, interrupt latency có thể ng nắ khoảng 3,25 m S đ iố v iớ 8051. Một hệ th ngố dùng 8051 v iớ ngắt ưu tiên cao sẻ có interrupt latency x uấ nhất là 9,25 m S (giả sử ngắt ưu tiên cao luôn luôn đư cợ phép). Đi uề này xảy ra n uế đi uề ki nệ ngắt xuất hi nệ ngay trư cớ khi có l nhệ RETI c aủ ISR mưc 0 đ 6.9)
8. BÀI TẬP 1. Viết l
iạ chư ngơ trình ở ví dụ 1 để ngăn các ngắt và kết thúc khi có một phím bất kỳ đ cượ ấn. iạ chân P1.7 2. Viết chương trình dùng ngắt t oạ xung vuông 1 KHz t 3. Dùng ngắt viết chương trình t oạ xung vuông 7 KHz v iớ chu kỳ làm vi cệ là 30% iạ chân P1.6 t
4. Kết h pợ ví dụ 6.1 và 6.3 thành một chư ngơ trình duy nhất 5. Viết l iạ ví dụ 6.3 để g iở 1 ký tự trong 1 S