CL RA ;Nội dung thanh gh iA bằng zero.
45. Lệnh giả mô nhớ trực tiếp và nhảy
3.4.7.7. Lập trình ngắt phần cứng ngoà
Bộ vi điều khiển 8051 có hai ngắt phần cứng bên ngoài là chân 12 (P3.2) và chân 13 (P3.3) dùng cho ngắt INT0 và INT1 địa chỉ trong bảng vector ngắt là 0003H và 0013H. Khi kích hoạt những chân này thì vi điều khiển 8051 ngừng ngay mọi công việc đang thực hiện và nhảy đến bảng vector ngắt để chạy trình phục vụ ngắt (hình 5.5.5a).
Hình 5.5.5a. Kích hoạt INT0 và INT1
Có hai cách kích hoạt ngắt phần cứng ngoài, đó là theo mức và theo sườn.
Ngắt kích phát mức
Ở chế độ ngắt theo mức, các chân INT0 và INT1 bình thường ở mức cao. Nếu có tín hiệu mức thấp cấp tới thì tín hiệu này kích hoạt ngắt. Trước khi thực hiện lệnh cuối cùng của trình phục vụ ngắt RETI, thì mức thấp tại chân INT phải chuyển sang cao, nếu không sẽ tạo ra một ngắt mới và nhảy đến bảng vector ngắt để thực hiện ISR
Ví dụ: Giả sử INT1 được nối tới một công tắc hành trình, bình thường ở mức cao (nối với tiếp điểm thường đóng). Mỗi khi chân này xuống mức thấp thì bật đèn LED. Đèn LED được nối tới chân P1.2 và bình thường ở chế độ tắt. Nếu đèn LED được bật sáng thì phải sáng trong vài giây. Khi công tắc được chuyển xuống thấp, đèn LED phải sáng liên tục.
Giải:
ORG 0000H
LJMP MAIN ;bo qua bang vector ngat
;--- chuong trinh con xu ly ngat
IE0 (TCON.1) (TCON.1) INT0 (Pin 3.2) Kích hoạt mức Kích hoạt sườn 0003 IT0 0 1 IE1 (TCON.3) INT1 (Pin 3.3) Kích hoạt mức Kích hoạt sườn 0013 IT1 0 1 INTI 8051 P1.2 LED Tới Vcc
ORG 0013H ;trinh ISR cho INT1 LJMP ISR_INT1 ;den trinh phuc vu ngat ;--- chuong trinh chinh
ORG 30H
MAIN: MOV IE, #84H;cho phep ngat ngoai INT1
HERE: SJMP HERE ;doi cho den khi duoc ngat
ISR_INT1:
SETB P1.2 ;bat den LED
MOV R3, #0FFH
BACK: DJNZ R3, BACK;giu den LED sang mot luc
CLR P1.2 ;tat den LED
RETI ;ve chuong trinh chinh
END
Chúng ta cũng cần chú ý rằng chân P3.2 và P3.3 thường được dùng cho vào/ra nếu các bit INT0 và INT1 ở thanh ghi IE không được kích hoạt. Nếu các ngắt này được kích hoạt thì nó phải được giữ ở mức thấp cho đến khi bắt đầu thực hiện trình phục vụ ngắt, Nếu INT0 hoặc INT1 được đưa lên mức cao trước khi bắt đầu thực hiện ISR thì chẳng có ngắt nào được thực hiện. Tuy nhiên khi kích hoạt ngắt theo mức thấp thì cần đưa trở lại mức cao trước khi thực hiện lệnh RETI, nếu chân INT0 hoặc INT1 vẫn ở mức thấp cả sau lệnh RETI thì một ngắt khác lại được kích hoạt. Do vậy để đảm bảo việc kích hoạt ngắt phần cứng tại các chân INT0 hoặc INT1 phải khẳng định thời gian tồn tại tín hiệu mức thấp là khoảng 4 chu kỳ máy và không được lâu hơn vì ngắt theo mức thấp không được chốt. Do vậy chân ngắt phải được duy trì ở mức thấp cho đến khi ISR bắt đầu được thực hiện (hình 5.5.5b).
Chúng ta cũng cần chú ý rằng khi bật lại nguồn (RESET) thì cả hai chân INT0 và INT1 đều ở mức cao.
Hình 5.5.5b. Thời gian tối thiểu của ngắt kích phát mức với XTAL = 11, 0592MHz.
Ngắt kích phát sườn
Như đã nói ở trên khi RESET thì 8051 đặt ngắt INT0 và INT1 ở chế độ kích phát mức thấp. Để đổi các ngắt thành kích phát sườn thì cần phải viết chương trình cho các bit của thanh ghi TCON (hình 5.5.5c). Thanh ghi TCON
1 chu kỳ máy 1.085µs 4 chu kỳ máy (4MC) 4 × 1.085µs Đến chân INT0 hoặc INT1
có các bit cờ IT0 và IT1 xác định chế độ kích phát sườn hay mức của ngắt phần cứng. Các bit này có thể viết dưới dạng TCON.0 và TCON.2 vì thanh ghi TCON có thể định địa chỉ bit. Khi RESET thì TCON.0 và TCON.2 đều ở mức thấp, nghĩa là các ngắt phần cứng ngoài của các chân INT0 và INT1 là ngắt theo mức thấp. Nếu chuyển các bit TCON.0 và TCON.2 lên cao nhờ lệnh “SETB TCON.0” và “SETB TCON.2” thì các ngắt phần cứng ngoài INT0 và INT1 trở thành ngắt theo sườn. Khi đó nếu có một tín hiệu chuyển từ cao xuống thấp cấp cho chân P3.2 hoặc P3.3 thì bộ vi điều khiển sẽ bị ngắt và buộc nhảy đến bảng vector ngắt tại địa chỉ 0003H hoặc 0013H để thực hiện trình phục vụ ngắt. Tuy nhiên phải giả thiết rằng bit ngắt tương ứng trên thanh ghi IE đã được đặt.
Hình 5.5.5c. Thanh ghi TCON (Timer/Counter)
TF1 TCON.7 Cờ tràn của Timer 1, được thiết lập bởi phần cứng khi bộ
đếm/bộ định thời 1 bị tràn, và được xoá bởi phần cứng
khi bộ xử lý nhảy đến trình phục vụ ngắt.
TR1 TCON.6 Bit điều khiển hoạt động của Timer 1, được thiết lập và Xoá bởi phầm mềm để bật/tắt bộ đếm/bộ định thời 1.
TF0 TCON.5 Tương tự TF1 nhưng là cho Timer 0. TR0 TCON.4 Tương tự TR1 nhưng là cho Timer 0.
IE1 TCON.3 Cờ ngắt ngoài 1 kích phát sườn, được CPU thiết lập khi phát hiện có sườn xuống ngắt ngoài và được CPU xoá khi ngắt được xử lý. Cờ này chỉ chốt ngắt kích phát sườn nhưng không chốt ngắt kích phát mức thấp.
IT1 TCON.2 Bit điều khiển ngắt 1 được thiết lập và xoá bởi phần mềm để xác định kiểu ngắt ngoài kích phát sườn xuống hay mức thấp.
IE0 TCON.1 Tương tự IE1 nhưng là cho ngăt ngoài 0. IT0 TCON.0 Tương tự IT1 nhưng là cho ngắt ngoài 0.
Chúng ta phải chú ý một điểm nữa rằng: đối với ngắt kích phát sườn, nguồn ngắt ngoài phải được giữ ở mức cao tối thiểu một chu kỳ máy, và sau đó duy trì ở mức thấp cũng tối thiểu một chu kỳ máy để đảm bảo bộ vi điều khiển TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
D0 D7 D7
nhận biết được quá trình chuyển sườn xung từ cao xuống thấp. Hình 5.5.5d biểu diễn thời gian xung tối thiểu để phát hiện ra ngắt phát sườn với tần số XTAL = 11, 0592MHz.
Hình 5.5.5d. Thời gian tối thiểu phát hiện ngắt kích phát sườn.
Sườn xuống của xung được 8051 chốt ở thanh ghi TCON. Các bit TCON.1 và TCON.3 giữ các sườn được chốt của chân INT0 và INT1 tương ứng. Các bit này hoạt động như các cờ “ngắt đang được phục vụ”. Khi một cờ “ngắt đang được phục vụ” bật lên thì nó báo cho các thiết bị bên ngoài biết rằng ngắt hiện nay đang được xử lý và trên chân INT0 hoặc INT1 sẽ không có ngắt nào được đáp ứng chừng nào ngắt này chưa được phục vụ xong. Khi trình phục vụ ngắt kết thúc thì TCON.1 hoặc TCON.3 được xoá để báo trình phục vụ ngắt đã thực hiện xong và sẵn sàng đáp ứng ngắt bên ngoài khác trên chân đó. Để có thể nhận được ngắt khác thì tín hiệu trên chân đó phải trở lại mức cao và sau đó xuống thấp để tạo nên một ngắt kích phát sườn.
Ví dụ: Giả thiết chân P3.3 (INT1) được nối với một máy tạo xung. Hãy viết chương trình trong đó sườn xuống của xung sẽ chuyển chân P1.3 lên cao, chân này được nối tới LED báo.
Giải:
ORG 0000H
LJMP MAIN ;bo qua bang vector ngat
;--- chuong trinh ngat
ORG 0013H ;trinh ISR cho INT1
SETB P1.3 ;bat den LED
MOV R3, #0FFH
BACK: DJNZ R3, BACK;giu den LED sang mot luc
CLR P1.3 ;tat den LED
RETI ;ve chuong trinh chinh
;--- chuong trinh chinh
ORG 30H
MAIN: SETB TCON.2 ;chuyen ve kieu ngat kich
;phat suon
MOV IE, #84H;cho phep ngat ngoai INT1
HERE: SJMP HERE ;doi cho den khi duoc ngat
END 1.085µs 1.085µs 1M C 1M C