BÀI 6: HOẠT ĐỘNG NGẮT (Interrupt) docx

18 241 0
BÀI 6: HOẠT ĐỘNG NGẮT (Interrupt) docx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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, t hiế t bị ngoại vi có th ể giao ti ếp với 8051 thông qua các ngỏ I/O được trang bị sẳn t rên board UNIKIT như : Công t ắ c, nút nhấ n, đèn, chuôn g, động cơ MỤC TIÊU THỰC HIỆN • Hiểu đượ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 ngắ t. • Biế t được t ổ chức ngắ t và cơ chế th ực hiện chương trìn h phục vụ ngắ t của 8051 • Biế t cách khởi t ạo ngắ t t heo yêu cầ u. NỘ I DUNG CHÍNH Nội dung bài học t ập trung về các chủ đề chính như sau: • Vai trò của ngắ t trong yêu cầu điều khiển • T ổ chức ngắ t trong 8051 • Các thanh ghi chức năng đặc biệ t liên quan • Phương pháp khởi t ạo ngắ t • 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 1 1. MỞ ĐẦU 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. Mộ t hệ th ố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ìn h để 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ìn h chính có nghĩa là không biế t tr ước chương trìn h 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à t hườ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 t hờ I dừng lạ I và rẻ nhánh đến ISR. IS R 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. 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 t rong 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 không được điều khiển bằng phần mềm đang chạy trong hệ th ống. Đó chính là đặc điễm của 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 2 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 t iên hai cấ p, t hứ 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 trong thanh ghi chức năng đặc biệ t IE (I nterrupt enable) t ại địa chỉ 0A8H, có mộ t bít cho 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. V D 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. T ố t nhấ t nên dùng cách th ứ hai t ại vị trí bắ t đầu chương trình (nghĩa là khi bắ t đầu mở máy hoặc reset hệ th ống) 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 priority) t ại địa chỉ oB8H (bảng 6.2) Thanh ghi IP t ự động xóa sau khi reset hệ th ống để đặ t các ngắ t ở mức ưu tiên th ấp B ẢNG 6.1 Thanh ghi IE 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 EA - ET2 ES ET1 EX 1 ET0 EX 0 AFH AEH ADH ACH ABH AAH A9H A8H 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 B ẢNG 6.2 Thanh ghi IP 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 PX 1 PT0 PX 0 - - 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 IS R bị dừng bởi mộ t ngắ t khác nếu ngắ t mới xuấ t 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ại xảy ra mộ t ngắ t ưu tiên cao thì IS R 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 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 cho phép thì ngắ t t ương ứng 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 th u (RI) với ngắ t phát (TI ) . T ương t ự , ngắ t timer 2 được t ạo ra bởi cờ tràn TF2 hoặc với cờ nhập bên ngoài EX F2 . 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 t hao tác như sau: • Thực hiện hoàn t ấ t lệnh hiện hành • 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 • Các ngắ t được chặn lại t ại mức ngắ t • Nạp địa chỉ vec t ơ của ISR vào PC • Thực hiện IS R Chương trình ISR hoạ t động và th ực hiện các t hao tác t ương ứng với ngắ t. Sau đ ó, kế t thúc khi gặp lệnh R ETI (return from interrupt), lệnh này lấy lại giá tr ị của PC t ừ ngăn 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 Ngắt Cờ Thanh ghi SFR và vị trí bí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 EX F2 TCON.1 TCON.3 TCON.7 TCON.5 SCON.1 SCON.0 T2CON.7 (8052) T2CON.6 (8052) INT0 TF0 IE0 Ưu tiên cao Ưu tiên thấp 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à 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 được cho trong bẳng 6.4. Véc t ơ reset hệ th ống (RST t ại địa chỉ 0000H) cũng được cho trong bảng nên nó cũng giống như mộ t ngắ t, nó dừng chương trìn h 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, EX F2 đố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 t hực t ế nếu CPU xóa cờ ngắ t. Các bít này phải được kiểm tra trong ISR để xác định nguyên nhân t ạo ngắ t và sau đó cờ ngắ t được xóa bằng phần mềm, th ường có mộ t sự rẻ nhánh đến các t hao 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, t hành phần chính là các ngắ t. Mặc dù các v í dụ này không cần th iế t lớn hơn nhưng chúng sẻ phức t ạp hơ n, điều này được nhận ra bằng cách ti ến 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ẻ bắ t đầu th ực hiện khi reset hệ th ống, các chương trình này phát tri ển cho các ứng dụng th ực t ế và được lưu vào ROM hoặc EPROM. Khuôn mẫu đề nghị cho mộ t chương t rình có xử dụng ngắ t như sa u: 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ìn h 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ìn h chính bắ t đầu t ại địa chỉ 0030H B ẢNG 6.4 Các véc t ơ ngắ t Ngắt Cờ Địa chỉ véc 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 RST IE0 TF0 IE1 TF1 Ri hoặc Ti TF2 hoặc EX F2 0000H 0003H 000BH 0013H 001BH 0023H 002BH ROM ngoài FFFF Chương trình chính 0030 002F Điễm nhập reset và ngắt 0000 Hình 6.3 Tổ chức ngắt trong bộ nhớ Chương trình phục vụ ngắt kích thước nhỏ 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 trình t ạ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 th ường cũng đủ để th ực hiện các t hao 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 t r ì 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 MAIN: ……… ; chương trì nh chính ……… 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ương trình phục vụ ngắt kích thước lớn 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 t rong bộ nhớ chương trình và t ại đó IS R có 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: ………… ………… T0ISR: ……… ; ISR của timer 0 ……… ……… 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 Khi mộ t ngắ t xảy ra, chương trình chính t ạm t hời dừng lại trong khi ISR đang hoạ t động, lệnh RETI ở cuối ISR tr ả quyền điều khiển về cho chương trình chính và chương trình lạ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 tr ong 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 ; reset LJMP MAIN ; nhảy qua vùng véc t ơ ngắ t ORG 000BH ; véc t ơ ngắ t timer 0 T0ISR: CPL P1.0 ; đảo port bít RETI ORG 0030H MAIN: MOV TMOD,#02H ; timer 0 mode 2 MOV TH0,#-50 ; delay 50µ S SETB TR0 ; khởi động t imer MOV IE,#82H ; cho phép ngắ t timer 0 SJMP $ ; không làm gì cả Đây là mộ t chương trìn h đầ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 t rình sẻ được nạp giá tr ị 0000H, lệnh đầu tiên được th ực hiện là LJMP MAIN và chương t rình nhảy qua ISR của timer đến địa chỉ 0030H trong bộ nhớ chương trình , ba lệnh t iế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 µ S. Lệnh MOV IE,#82H cho phép ngắ t timer 0 có nghĩa lấu mỗi lần t rà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 µ 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 µ S mộ t ngắ t sẻ xuấ t hiệ n, chương trình chính bị dừng và chương trình T0IS R hoạ t động đảo tr ạng thái của po rt b ít và sau đó tr ở về chương trình chính t hực hiện t iếp vòng lặp “không làm gì cả” và chờ mộ t ngắ t khác sau 50 µ 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 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 chương trìn h chính là vị trí của lệnh SJMP, địa chỉ này được CPU cấ t vào trong ngăn xếp tr ước khi tr ỏ đến véc t ơ ngắ t và được lấy lại t ừ ngăn xếp khi th ực hiện lệnh RETI ở cuối chương trìn h ngắ t. Do t hanh 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 ại 08H (PCL) và 09H (PCH) Ví dụ 6-2 : Tạo hai xung bằng ngắt 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 ại port 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 µS 8051 P1.7 7 KHz 2 mS P1.6 500 Hz Hình 6.4 Dạng sóng 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à t imer 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 m S và mức th ấp cũng là 1 mS nên không th ể dùng mode 2, chương trìn h như sau OR G 0 LJMP MAIN OR G 0BH ; địa chỉ véc t ơ timer 0 JM P T0ISR OR G 1BH ; địa chỉ véc t ơ timer 1 LJMP T1ISR ORG 30H MAIN: MOV TMOD,#12H ; timer 1=mode 1; timer 0=mode 2 MOV TH0,#-71 ; t ạo xung 7 KHz SETB TR0 SETB TF1 ; t ạo ngắ t timer 1 MOV IE,#8AH ; cho phép cả hai ngắ t timer SJMP $ T0ISR: CPL P1.7 RETI T1ISR: CLR TR1 MOV TH1,#HIGH (-1000) ; 1 mS mức cao MOV TL1,#LOW (-1000) ; và 1 mS mức th ấp SETB TR1 CPL P1.6 RETI Chương trình chính và các ISR được đặ t phía trên vùng dành cho các véc t ơ ngắ t và rese t hệ th ống, cả hai dạng sóng được t ạo ra bởi lệnh CPL. Tuy nhiên, cách t ạo th ời gian trì hoản thì có khác nhau. Vì cặp thanh ghi TL1/TH1 phải được nạp lại sau mỗi lần t ràn ( có nghĩa là sau mỗi ngắ t ) nên IS R của timer 1 hoạ t động như sau: (a) dừng timer, (b) nạp lại TL1/TH1, (c) khởi động timer và sau đó (d) đảo port bít. Mộ t điễm lưu ý là TL1/TH1 không được khởi t ạo t ại vị trí bắ t đầu của chương trì nh chính giống như TH0 vì TL1/TH1 phải được khởi t ạo lại sau mỗi lần tràn. TF1 được set trong chương trình chính bằng phần mềm để t ạo ra 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 t iếp xảy ra khi mộ t trong hai cờ ngắ t phát Ti hoặc cờ ngắ t th u Ri được s et. Ngắ t phát xuấ t hiện khi quá trình phát của ký t ự tr ước đó được viế t vào SBUF hoàn t ấ t, mộ t ngắ t thu xuấ t hiện khi mộ t ký t ự đã được nhận đầy đủ và đang chờ đọc trong SBUF Các ngắ t cổng nối ti ếp khác với các ngắ t của t ime r, cờ t ạo ra ngắ t cổng nối t iếp không đượ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 mộ t ngắ t cổng nối ti ếp đó là Ti hoặc Ri. Nguồn t ạo ra ngắ t phải được xác định trong ISR và cờ ngắ t được xóa bằng phần mềm. Trở lại với các ngắ t t imer , cờ ngắ t được xóa bằng 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 mã điều khiển (00H đến 1FH và 7FH) chương trình sau đây được th ực hiện ngay sau khi reset hệ th ống OR G 0 LJMP MAIN ORG 0023H ; điễm nhập ngắ t cổng nối ti ếp LJMP SPISR ORG 0030H MAIN: MOV TMOD,#20H ; timer 1 mode 2 MOV TH1,#-26 ; nạp giá tr ị 1200 baud SETB TR1 ; khởi động t imer MOV SCON,#42H ; mode 1, set Ti để t ạo ngắ t đầu tiên ; gởi ký t ự th ứ nhấ t MOV A,#20H ; gởi ký t ự tr ắng đầu tiên MOV IE,#90H ; cho phép ngắ t cổng nối ti ếp SJMP $ ; không làm gì cả SPISR: CJNE A,#7FH,SKIP MOV A,#20H SKIP: MOV SBUF, A INC A CLR Ti ; xóa cờ ngắ t RETI [...]... tạo ra ngắt 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, còn đối với 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 thông qua bít IT0 và IT1 trong thanh ghi TCON VD: Nếu IT1 = 0 thì ngắt 1 ngoài được kích bởi mức thấp tại chân INT1 và nếu IT1 = 1 thì ngắt này... µS, thanh ghi R7 hoạt động như một bộ đếm Chương trình phục vụ ngắt T0ISR hoạt động như sau: Trước tiên, timer 0 được điều khiển dừng và thanh ghi R7 bị giãm 1, tiếp theo TH0/TL0 được nạp lại giá trị -50000, timer 0 chạy trở lại và ngắt được kết thúc Ở lần ngắt thứ 20, R7 được giãm xuống 0 (đã 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... 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 đến khi ngắt yêu cầu thực sự được tạo ra Sau đó phải trở về mức không tác động trước khi ISR hoàn tất hoặc trước khi một ngắt khác được tạo ra Thông thường một thao tá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 0 0 Xử dụng ngắt thiết kế chương trình... 0003H, điễm nhập của ngắt 0 ngoài Ví dụ 6-5: Hệ thống báo động 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 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 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... 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 ứng Chương trình chính bắt đầu tại địa chi3 0030H chỉ gồm 4 lệnh Lệnh SETB IT0 cho phép ngỏ vào ngắt nối với cãm biến cửa được kích bởi cạnh âm Lệnh MOV TMOD,#11H xác định chế độ hoạt động của cả hai timer là chế độ định thời 16 bít, chỉ có ngắt 0 ngoài... yêu cầu 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... kỳ máy (1 µS) S1 S5P1 S2 S3 S5P2 S4 S5 S6P1 0,25 µS Ngắt được lấy mẫu Hình 6.7 Lấy mẫu các ngắt tại S5P2 S6 S6P2 Chu kỳ 1 Lấy mẫu ngắt Chu kỳ 2 * Chu kỳ 3 Chu kỳ 4 Chu kỳ 5 Chấp nhận ngắt (Cất PC vào stack) Xoay vòng ngắt * Phải là chu kỳ cuối cùng của lệnh hiện hành Bắt đầu ISR 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... 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 $) 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... khoảng 3,25 µ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 µ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 được theo sau bởi một lệnh nhân (hình 6.9) Ngắt mức 0 Ngắt mức 1 Chương trình chính RETI MUL AB Cất PC 9 µS Ngắt mức 1 xuất hiện ở đây (cơ hội cuối cùng bị bỏ... dùng ngắt nên lệnh SJMP có thể được thay thế bằng các lệnh khác để thực hiện các công việc cần thiết khác của ứng dụng Các ngắt vẩn xảy ra sau mỗi 8333 µS và 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 . 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 . S6 S5P1 S5P2 S6P1 S6P2 0,25 µS Ngắt được lấy mẫu Hình 6.7 Lấy mẫu các ngắt tại S5P2 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) * Phải. (hình 6.9) Ngắt mức 0 Chương trình chính Ngắt mức 1 RETI MUL AB Cất PC 9 µS Ngắt mức 1 xuất hiện ở đây (cơ hội cuối cùng bị bỏ qua trước khi xuất hiện lệnh RETI) Hình 6.9 Interrupt latency 8. BÀI

Ngày đăng: 13/08/2014, 10:21

Tài liệu cùng người dùng

Tài liệu liên quan