Giáo trình Vi xử lý - Chương 6: Hoạt động ngắt (Interrupt) - Phạm Quang Trí
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.
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.
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Vi xử lý - Chương 6: Hoạt động ngắt (Interrupt) - Phạm Quang Trí", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.
File đính kèm:
- giao_trinh_vi_xu_ly_chuong_6_hoat_dong_ngat_interrupt_pham_q.pdf
Nội dung text: Giáo trình Vi xử lý - Chương 6: Hoạt động ngắt (Interrupt) - Phạm Quang Trí
- Chương 6: Ho t ñ ng ng t (Interrupt). Trư ng ðH Công nghi p Tp.HCM. 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: • Hoà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. Giáo trình Vi x lý. 183 Biên so n: Ph m Quang Trí
- Chương 6: Ho t ñ ng ng t (Interrupt). Trư ng ðH Công nghi p Tp.HCM. T ch c b nh khi s d ng ng t: Khuông 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 quá 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 nguyên 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 nguyên 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 quá 8 byte ). Giáo trình Vi x lý. 185 Biên so n: Ph m Quang Trí
- Chương 6: Ho t ñ ng ng t (Interrupt). Trư ng ðH Công nghi p Tp.HCM. • Nh n xét t ng quát: 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 yêu c u ñ t ra và r i không làm gì c . Công vi c hoàn toà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 vuông có t n s 10 KHz trên chân P1.0, fOsc = 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 vuông 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 vuông 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 Giáo trình Vi x lý. 187 Biên so n: Ph m Quang Trí
- Chương 6: Ho t ñ ng ng t (Interrupt). Trư ng ðH Công nghi p Tp.HCM. 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 vuông f = 7KHz và f = 500Hz t i chân P1.7 và chân P1.6. Vì c sau m i 71 s và 1ms thì nh ng công vi c ñó s b t m d ng ( ng t Timer 0 và ng t Timer 1 xu t hi n ) ñ CPU th c hi n vi c t o sóng vuông r i quay v th c hi n ti p nh ng công vi c ñó. Vi c t h p các ngõ ra này r t khó t o ra ñư c trên m t h th ng không s d ng ñi u khi n ng t. Timer 0 ho t ñ ng ch ñ 2, ñư c s d ng ñ t o ra d ng sóng 7 KHz trên chân P1.7. Timer 1 ho t ñ ng ch ñ 1, ñư c s d ng ñ t o ra d ng sóng 500 Hz trên chân P1.6. S dĩ trong trư ng h p này, Timer 1 ph i ñư c thi t l p ñ ho t ñ ng ch ñ 1 là do d ng sóng 500Hz yêu c u th i gian m c cao và th i gian m c th p là 1ms, ch ñ 2 không s d ng ñư c trong trư ng h p này. Cũng c n chú ý là các thanh ghi TH1/TL1 không ñư c kh i ñ ng ñ u chương trình chính như trư ng h p c a thanh ghi TH0. Do TH1/TL1 ph i ñư c n p l i sau m i l n b ñ nh th i tràn, TF1 ñư c set b ng 1 trong chương trình chính b i ph n m m ( l nh SETB TF1) ñư c s d ng ñ bu c ph i có m t ng t ban ñ u ngay trư c khi các ng t ñư c cho phép. ði u này có hi u qu cho vi c b t ñ u d ng sóng 500Hz. Ví d 3: Vi t chương trình liên t c nh n d li u 8 bit c ng P0 và sau ñó g i d li u này ñ n c ng P1. Trong th i gian này c n t o ra trên chân P2.1 m t sóng vuông có chu kỳ là 200 s. S d ng Timer 0 ñ t o sóng vuông, fOsc = 11,0592MHz. 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. CPL P2.1 ;ð o tr ng thái chân P2.1, t o xung. 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 P0, #0FFH ;C u hình Port 0 là c ng vào. MOV TH0, #( 92) ;ð nh th i 100 s (n a chu kỳ). MOV IE, #82H ;Cho phép ng t Timer 0 ho t ñ ng. SETB TR0 ;Cho Timer 0 ho t ñ ng. BACK: MOV A, P0 ;Nh n d li u t P0. MOV P1, A ;Xu t d li u v a nh n ñư c ra P1. SJMP BACK END ;K t thúc chương trình. Giáo trình Vi x lý. 189 Biên so n: Ph m Quang Trí
- Chương 6: Ho t ñ ng ng t (Interrupt). Trư ng ðH Công nghi p Tp.HCM. 2. Ví d minh h a x lý ng t port n i ti p: Các ng t do port n i ti p xu t hi n khi c ng t phát TI ho c c ng t thu RI ñư c set b ng 1. M t ng t phát xu t hi n khi vi c phát m t ký t ñã ghi vào SBUF hoàn t t. M t ng t thu xu t hi n khi m t ký t ñư c thu nh n ñ y ñ và ñang trong SBUF ñ ch ñư c ñ c. Như v y, ng t phát x y ra khi b ñ m phát SBUF r ng, ng t thu x y ra khi b ñ m thu SBUF ñ y. Các ng t do port n i ti p có khác v i các ng t do b ñ nh th i. C gây ra ng t port n i ti p không ñư c xóa b i ph n c ng khi CPU tr t i trình ph c v ng t. Lý do là vì ñây ta có hai ngyên nhân t o ra ng t port n i ti p, c th là hai ng t t o ra b i hai c TI và RI. Nguyên nhân ng t ph i ñư c xác ñ nh trong trình ph c v ng t và c t o ra ng t ñư c xóa b i ph n m m. C n nh c l i là v i các ng t do b ñ nh th i, c t o ra ng t ñư c xóa b i ph n c ng khi CPU tr t i trình ph c v ng t. Ví d 1: Vi t chương trình s d ng các ng t ñ liên t c phát ñi mã ASCII (có giá tr t 20H ñ n 7EH) ñ n m t thi t b ñ u cu i n i v i 8051 qua port n i ti p. Bi t r ng fOsc =11,0592MHz. Gi i ORG 0000H ;ði m nh p reset. LJMP MAIN ;Nh y qua kh i các vectơ ng t. ORG 0023H ;ði m nh p ISR port n i ti p. LJMP SPISR ;L nh nh y ñ n ISR port n i ti p. ORG 0030H ;ði m nh p chương trình chính. MAIN: ;Chương trình chính b t ñ u. MOV SCON, #42H ;Ch n ch ñ 1 cho port n i ;ti p, TI=1 ñ bu c có ng t ;và g i ký t ñ u tiên. MOV TMOD, #20H ;Ch n ch ñ 2 cho Timer 1. MOV TH1, #( 24) ;T c ñ baud = 1200. SETB TR1 ;Cho Timer 1 ho t ñ ng. MOV A, #20H ;N p mã cho ký t ñ u tiên. MOV IE, #90H ;Cho phép ng t port n i ti p. SJMP $ ;Không làm gì ( nh y t i ch ). SPISR: ;ISR c a ng t port n i ti p. CJNE A, #7FH, SKIP ;Ki m tra k t thúc b ng mã. MOV A, #20H ;Tr l i ký t ñ u tiên. SKIP: MOV SBUF, A ;Truy n ký t ra port n i ti p. INC A ;L y mã c a ký t k ti p. CLR TI ;Xóa c ng t phát. RETI ;K t thúc ISR c a port n i ti p. 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 phát mã ASCII thông qua port n i ti p. Vì c sau m i l n port n i ti p truy n xong m t ký t thì nh ng công vi c ñó s b t m d ng ( ng t port n i ti p xu t hi n ) ñ CPU th c hi n vi c ki m tra ký t k t thúc b ng mã và l y mã c a ký t k ti p ñ ti p t c phát ñi r i quay v th c hi n ti p nh ng công vi c ñó. B ng mã ASCII bao g m 128 mã 7 bit ( xem thêm trong ph n ph l c “ Ph l c 4 – B ng mã ASCII ”). Sau khi nh y ñ n nhãn MAIN ñ a ch 0030H, ba l nh ñ u tiên dùng kh i ñ ng Timer 1 ñ cung c p xung clock 1200 baud cho port n i ti p, l nh MOV SCON,#42H kh i ñ ng port n i ti p Giáo trình Vi x lý. 191 Biên so n: Ph m Quang Trí
- Chương 6: Ho t ñ ng ng t (Interrupt). Trư ng ðH Công nghi p Tp.HCM. RETI ;K t thúc ISR c a port n i ti p. END ;K t thúc chương trình. Ví d 3: Vi t chương trình ñi u khi n 8051 ñ c d li u t c ng P1 và ghi liên t c t i c ng P2. Trong khi ñó d li u nh n ñư c t port n i ti p thì ñư c g i ñ n c ng P0. Bi t r ng t c ñ truy n là 9600 baud và fOsc = 11,0592MHz Gi i ORG 0000H ;ði m nh p reset. LJMP MAIN ;Nh y qua kh i các vectơ ng t. ORG 0023H ;ði m nh p ISR port n i ti p. LJMP SPISR ;L nh nh y ñ n ISR port n i ti p. ORG 0030H ;ði m nh p chương trình chính. MAIN: ;Chương trình chính b t ñ u. MOV P1, #0FFH ;C u hình Port 1 là c ng vào. MOV SCON, #52H ;Ch n ch ñ 1 cho port n i ti p. MOV TMOD, #20H ;Ch n ch ñ 2 cho Timer 1. MOV TH1, #( 3) ;T c ñ baud = 9600. MOV IE, #90H ;Cho phép ng t port n i ti p. SETB TR1 ;Cho Timer 1 ho t ñ ng. BACK: MOV A, P1 ;ð c d li u t P1. MOV P2, A ;Xu t d li u nh n ñư c ra P2. SJMP BACK ;L p l i các thao tác trên. SPISR: ;ISR c a ng t port n i ti p. CLR RI ;Xóa c ng t thu RI. MOV A, SBUF ;Nh n d li u t port n i ti p. MOV P0, A ;Xu t d li u nh n ñư c ra P0. RETI ;K t thúc ISR c a port n i ti p. END ;K t thúc chương trình. Ví d 4: Vi t chương trình có s d ng các ng t ñ th c hi n các c ng vi c sau: • Nh n d li u t port n i ti p, sau ñó thì g i d li u này ñ n c ng P0. • Nh n d li u t c ng P1, sau ñó thì g i d li u này ñ n port n i ti p và c ng P2. • S d ng Timer 0 ñ t o sóng vuông có t n s 5KHz t i P0.1. Bi t r ng t c ñ truy n là 4800 baud và fOsc = 11,0592MHz 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 Timer 0. CPL P0.1 ;L y bù chân P1.0, t o xung. RETI ;K t thúc ISR c a port n i ti p. ORG 0023H ;ði m nh p ISR port n i ti p. LJMP SPISR ;L nh nh y ñ n ISR port n i ti p. ORG 0030H ;ði m nh p chương trình chính. MAIN: ;Chương trình chính b t ñ u. MOV P1, #0FFH ;C u hình Port 1 là c ng vào. Giáo trình Vi x lý. 193 Biên so n: Ph m Quang Trí
- Chương 6: Ho t ñ ng ng t (Interrupt). Trư ng ðH Công nghi p Tp.HCM. ORG 0000H ;ði m nh p reset. LJMP MAIN ;Nh y qua kh i các vectơ ng t. ORG 0003H ;ði m nh p ISR ng t ngoài 0. EX0ISR: CLR P1.7 ;T t lò. RETI ;K t thúc ISR c a ng t ngoài 0. ORG 0013H ;ði m nh p ISR ng t ngoài 1. EX1ISR: SETB P1.7 ;M lò. RETI ;K t thúc ISR c a ng t ngoài 1. ORG 0030H ;ði m nh p chương trình chính. MAIN: ;Chương trình chính b t ñ u. MOV IE, #85H ;Cho phép ng t ngoài 0 và 1. SETB IT0 ;Ng t ngoài kích kh i c nh âm. SETB IT1 ði u khi n t t/m lò tùy SETB P1.7 ;M lò. thu c tr ng thái nhi t ñ JB P3.2, SKIP ;N u t >