EA --- ET2 ES ET1 EX1 ET0 EX0
IE.1IE.2 IE.2 IE.3 IE.4 IE.5 IE.6 IE.7
EA IE.7 Nếu EA = 0 thì không ngắt nào được báo nhận.
cách bật hoặc xoá bít tương ứng. --- IE.6 Dự phòng cho tương lai.
ET2 IE.5 Cho phép hoặc cấm ngắt tràn hoặc thu của Timer 2 (AT89C52). ES IE.4 Cho phép hoặc cấm ngắt tràn cổng nối tiếp.
ET1 IE.3 Cho phép hoặc cấm ngắt tràn của Timer 1. EX1 IE.2 Cho phép hoặc cấm ngắt ngoài 1. ET0 IE.1 Cho phép hoặc cấm ngắt tràn của Timer 0. EX0 IE.0 Cho phép hoặc cấm ngắt ngoài 0.
Chúng ta cần lưu ý rằng bit EA là bit cho phép các ngắt làm việc. Để thanh ghi làm việc, bit này cần được thiết lập lên 1. Bit IE.6 không sử dụng (thường đặt bằng 0), bit D5 là dành cho 8052.
3.1.4.5. Điều kiện cho phép một ngắt
Để cho phép một ngắt trình tự thực hiện các bước như sau:
1. Bit D7 của thanh ghi IE là EA phải được bật lên cao cho phép các bit còn lại của thanh ghi có hiệu lực.
2. Nếu EA = 1 thì tất cả mọi ngắt đều được phép và sẽ được đáp ứng nếu các bit tương ứng của ngắt này trong IE có mức cao. Nếu EA = 0 thì không có ngắt nào được đáp ứng, cho dù bit tương ứng trong IE có giá trị cao.
Ví dụ: Hãy viết lệnh thực hiện nhiệm vụ sau
- Cho phép ngắt nối tiếp, ngắt Timer 1 và ngắt phần cứng ngoài 0 (EX0). - Cấm ngắt Timer 0
- Cấm tất cả mọi ngắt chỉ bằng một lệnh duy nhất.
Giải:
MOV IE, #10010011B ;cho phep ngat noi tiep, Timer 0
;va cho phep ngat phan cung ngoai
CLR IE.1 ;xoa (che) ngat Timer 0
CLR IE.7 ;Cam tat ca moi ngat.
Khi kích hoạt một ngắt bộ vi điều khiển đi qua các bước sau:
1. Nó kết thúc lệnh đang thực hiện và lưu địa chỉ của lệnh kế tiếp (PC) vào ngăn xếp.
2. Nó cũng lưu tình trạng hiện tại của tất cả các ngắt vào bên trong (nghĩa là không lưu vào ngăn xếp).
3. Nó nhảy đến một vị trí cố định trong bộ nhớ được gọi là bảng véc tơ ngắt nới lưu giữ địa chỉ của một trình phục vụ ngắt.
4. Bộ vi điều khiển nhận địa chỉ ISR từ bảng véc tơ ngắt và nhảy tới đó. Nó bắt đầu thực hiện trình phục vụ ngắt cho đến lệnh cuối cùng của ISR là RETI (trở về từ ngắt).
5. Khi thực hiện lệnh RETI bộ vi điều khiển quay trở về nơi nó đã bị ngắt. Trước hết nó nhận địa chỉ của bộ đếm chương trình PC từ ngăn xếp bằng cách kéo hai byte trên đỉnh của ngăn xếp vào PC. Sau đó bắt đầu thực hiện các lệnh từ địa chỉ đó.
3.1.4.6. Lập trình ngắt bộ định thời 8051
Trong phần trước chúng ta đã giới thiệu cách sử dụng các bộ định thời Timer 0 và Timer 1 bằng phương pháp thăm dò. Trong phần này chúng ta sẽ sử dụng các ngắt để lập trình cho các bộ định thời. Nếu bit ngắt bộ định thời ở thanh ghi IE được phép thì mỗi khi bộ định thời này quay về 0, cờ TF được bật lên và bộ vi điều khiển ngừng mọi việc đang thực hiện và nhảy tới bảng véc tơ ngắt để phục vụ ISR. Bằng cách đó bộ vi điều khiển có thể làm những công việc khác nhau cho đến khi nào được thông báo rằng bộ định thời đã quay về 0 (hình 5.4.4a)
Hình 5.4.4a. Các ngắt bộ định thời Timer 0 và Timer 1
Ví dụ: Viết chương trình nhận liên tục dữ liệu 8 bit ở cổng P0 và gửi đế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 tần số 50Hz. Sử dụng bộ Timer 0 để tạo sóng vuông, tần số thạch anh của 8051 XTAL = 11, 0592MHz.
Giải:
Giả sử ta sử dụng Timer 0 chế độ 1, trước hết cần tính giá trị cần nạp cho thanh ghi TH0 và TL0.
- Chu kỳ sóng vuông: T = 1/f = 1/50 = 0, 02s = 20ms
- Thời gian nửa chu kỳ phần cao: 0.5T = 0, 5.20 = 10ms = 10000µs - Số nhịp đồng hồ: n = 10000/1, 085 = 9216
- Giá trị cần nạp vào TH0 và TL0 là:65536 – 9216 = 56320 = DC00H. Chương trình được viết như sau:
ORG 0000H
LJMP MAIN ;bo qua bang vec to ngat
;--- Trinh ISR cho Timer0 de tao xung vuong
ORG 000BH ;dia chi ngat Timer 0
LJMP ISR_T0 ;nhay den ISR
;--- Chuong trinh chinh
ORG 0030H ;dia chi chuong trinh chinh
MAIN: MOV TMOD, #01H ;chon Timer 0 che do 1
MOV P0, #0FFH ;chon P0 lam cong vao
1 000BH
TF0
Nhaỷy tụựi
Vector ngaột Timer 0
1 001BH
TF1
Nhaỷy tụựi
MOV TL0, #00H ;dat TL0=00H
MOV TH0, #0DCH ;dat TH0=DCH
MOV IE, #82H ;cho phep ngat Timer 0
SETB TR0 ;khoi dong Timer 0
BACK: MOV A, P0 ;doc cong P0
MOV P1, A ;chuyen ra cong P1
SJMP BACK ;tiep tuc doc
;--- Trinh ISR cua Timer 0 che do 1 phai duoc nap lai
ISR_T0: CPL P2.1 ;dao tin hieu tren chan
P2.1
MOV TL0, #00H ;nap lai TL0
MOV TH0, #0DCH ;nap lai TH0
RETI ;ve chuong trinh chinh
END
3.1.4.7. Lập trình ngắt phần cứng ngoài
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
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
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
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).
INTI
8051
P1.2 LEDTới Vcc
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 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 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