IE.0 EA ET2 ES ET1 EX1 ET0 E

Một phần của tài liệu BÀI 7.1: LẬP TRÌNH HỢP NGỮ pot (Trang 30 - 35)

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

Một phần của tài liệu BÀI 7.1: LẬP TRÌNH HỢP NGỮ pot (Trang 30 - 35)