1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

ngắt trong vi điều khiển

54 275 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 54
Dung lượng 552,03 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Ở phương pháp ngắt, mỗi khi có một thiết bị cần phục vụ thì thiết bị sẽ báo cho bộ vi ñiều khiển biết bằng cách ñiều khiển dừng mọi công việc ñang thực hiện ñể ngắt gọi là trình phục v

Trang 2

HOẠT ðỘNG NGẮT

Trang 3

Một bộ vi ñiều khiển có thể phục vụ một số thiết bị Có

2 phương pháp phục vụ thiết bị, ñó là sử dụng ngắt và phương pháp thăm dò (polling).

Ở phương pháp ngắt, mỗi khi có một thiết bị cần phục

vụ thì thiết bị sẽ báo cho bộ vi ñiều khiển biết bằng cách

ñiều khiển dừng mọi công việc ñang thực hiện ñể

ngắt gọi là trình phục vụ ngắt (Interrupt Service Routine).

Trang 4

ðối với phương pháp thăm dò, bộ vi ñiều khiển liên tục kiểm tra tình trạng của thiết

bị và khi ñiều kiện ñược ñáp ứng thì tiến hành phục vụ thiết bị Sau ñó bộ vi ñiều khiển chuyển qua kiểm tra trạng thái của thiết bị tiếp theo cho ñến khi tất cả ñều ñược phục vụ.

Trang 5

ðiểm mạnh của phương pháp ngắt là bộ vi ñiều khiển

không cùng một thời ñiểm Mỗi thiết bị có thể ñược bộ vi ñiều khiển phục vụ dựa theo mức ưu tiên ñược gán Ở phương pháp thăm dò thì không thể gán mức ưu tiên cho thiết bị ñược vì bộ vi ñiều khiển tiến hành kiểm tra các thiết bị theo phương pháp hỏi vòng Ngoài ra, phương pháp ngắt cho phép bộ vi ñiều khiển che hoặc bỏ qua một yêu cầu phục vụ của thiết bị, ñiều mà phương pháp thăm

dò không thực hiện ñược.

Trang 6

Ngắt (interrupt) là sự xảy ra của một ñiều kiện

- một sự kiện - làm cho chương trình chính bị tạm ngưng trong khi ñiều kiện ñược phục vụ bởi một chương trình khác.

Trong một hệ thống ñược ñiều khiển bởi ngắt,

này xuất hiện không ñồng bộ với chương trình chính ñang ñược thực thi và chương trình chính

sẽ bị ngắt khi nào

Trang 7

Chương trình xử lý một ngắt ñược gọi là Trình phục vụ ngắt (ISR) hay Quản lý ngắt (Interrupt Handler) Khi một ngắt xuất hiện, việc thực thi

chương trình chính bị tạm dừngCPU thực hiện việc rẽ nhánh ñến trình phục vụ ngắt ISR CPU thực thi ISR và kết thúc việc thực thi này khi gặp lệnh RETI; chương trình chính ñược tiếp tục tại nơi bị tạm dừng

Trang 9

1 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 Lưu tình trạng hiện tại của tất cả các ngắt vào bên trong (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 ñịa chỉ ñó

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 gặp 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 nạp 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ỉ ñó.

Trang 10

Có 5 nguyên nhân tạo ra ngắt (ñối với chip

và 1 ngắt do port nối tiếp

Khi ta thiết lập trạng thái ban ñầu của hệ thống (reset), tất cả các ngắt ñều bị vô hiệu hóa (cấm) và sau ñó chúng ñược cho phép riêng rẽ bằng phần mềm.

Trang 11

Trình phục vụ ngắt của mỗi ngắt có một vị trí cố ñịnh trong bộ nhớ ñể lưu trữ ñịa chỉ ISR Tập hợp các ô nhớ lưu

trữ ñịa chỉ của tất cả các ISR gọi là bảng vectơ ngắt

Trang 12

1 RESET: Khi chân Reset ñược kích

hoạt thì 8051 nhảy về ñịa chỉ 0000.

2 Hai ngắt dành cho bộ ñịnh thời Timer

0 và Timer 1 ðịa chỉ ở bảng vector ngắt

của hai ngắt này tương ứng với Timer 0 và Timer 1 là 000B và 001B

*Số lượng byte hạn chế dành riêng cho từng ngắt: 8 byte

Trang 13

3 Hai ngắt phần cứng dành cho các thiết bị bên ngoài nối tới chân 12 (P3.2) và 13 (P3.3) của cổng P3 là INT0 và INT1 tương ứng Các ngắt ngoài cũng còn ñược gọi là EX1 và EX2 Vị trí nhớ trong bảng vector ngắt của hai ngắt INT0 và INT1 này là 0003H và 0013H.

4 Truyền thông nối tiếp có một ngắt cho cả thu lẫn phát ðịa chỉ của ngắt này trong bảng vector ngắt là 0023H.

Trang 14

Khi xảy ra 2 hay nhiều ngắt ñồng thời hoặc xảy ra một ngắt trong khi một ngắt khác ñang ñược phục vụ, ta có 2 sơ ñồ xử

lý các ngắt: Sơ ñồ chuỗi vòng và sơ ñồ hai mức ưu tiên

Sơ ñồ chuỗi vòng là sơ ñồ cố ñịnh còn

sơ ñồ ưu tiên ngắt ñược lập trình bởi người

sử dụng

Trang 15

CHO PHÉP MỘT NGẮT

Khi Reset thì tất cả mọi ngắt ñều bị cấm (bị che) có nghĩa là không có ngắt nào sẽ ñược bộ vi ñiều khiển ñáp ứng nếu chúng ñược kích hoạt

Các ngắt phải ñược kích hoạt bằng phần mềm ñể bộ vi ñiều khiển ñáp ứng chúng Có một thanh ghi ñược gọi là cho phép ngắt IE (Interrupt Enable) chịu trách nhiệm về việc cho phép (không che) và cấm (che) các ngắt IE là thanh ghi có thể ñịnh ñịa chỉ theo bít

Trang 16

Thanh ghi cho phép ngắt IE

EA ET2 ES ET1 EX1 ET0 EX0

D0 D7

EA IE.7 Cho phép ngắt toàn cục.

- - 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 Timer2 (8051).

ES IE.4 Cho phép hoặc cấm ngắt cổng nối tiếp.

ET1 IE.3 Cho phép hoặc cấm ngắt tràn của Timer1.

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 Timer0.

EX0 IE.0 Cho phép hoặc cấm ngắt ngoài 0.

Trang 17

CHO PHÉP MỘT NGẮT

ñể cho phép các bít còn lại của thanh ghi có hiệu lực.

ñược ñáp ứng nếu các bít tương ứng của chúng trong

ñược ñáp ứng cho dù bít tương ứng của nó trong IE có giá trị cao.

Trang 18

Khi một ngắt ñược chấp nhận, giá trị vector ngắt ñược nạp cho bộ ñếm chương trình PC Vector ngắt là ñịa chỉ bắt ñầu của trình phục vụ ngắt của nguyên nhân ngắt tương ứng.

Khi một chương trình phục vụ ngắt ñược trỏ tới, cờ gây

lệ bao gồm các cờ RI và TI ñối với các ngắt do port nối tiếp; TF2 và EXF2 ñối với các cờ ngắt do bộ ñịnh thời 2 Các nguyên nhân ngắt thuộc 2 ngoại lệ vừa nêu trên do có

2 khả năng tạo ra ngắt nên trong thực tế CPU không xóa

cờ ngắt.

Trang 21

Khuôn mẫu ñề nghị cho một chương trình thực thi ñộc

lập có sử dụng ngắt.

ORG 0000H ; ðiểm nhập sau khi reset

LJMP MAIN ; Nhảy qua vùng ngắt

; Các ñiểm nhập của ISR (Interrupt Service Routine)

ORG 0030H ; ðiểm nhập chương trình chính

MAIN: ; Chương trình chính bắt ñầu

.

Trang 22

Các trình phục vụ ngắt phải ñược bắt ñầu ở gần ñáy bộ nhớ Mặc dù chỉ có 8 byte giữa các ñiểm nhập của các trình phục vụ ngắt, dung lượng này thường ñủ ñể thực hiện các công việc ñược yêu cầu và quay trở về chương trình chính từ một

phục vụ ngắt cho các ngắt tương ứng thường không dài quá 8 bytes

Trang 23

Nếu chỉ có một nguyên nhân ngắt ñược dùng, thí dụ ngắt do

bộ ñịnh thời 0, khuôn mẫu chương trình dưới ñây ñược ñề nghị

sử dụng.

ORG 0000H ; reset

LJMP MAIN ; Nhảy qua vùng ngắt

ORG 000BH ; ðiểm nhập của ngắt do bộ ñịnh thời 0

T0ISR: ; Bắt ñầu ISR cho bộ ñịnh thời 0

RETI ; Trở về chương trình chính

MAIN: ; Chương trình chính bắt ñầu

.

Trang 24

Nếu có nhiều ngắt ñược

Trang 25

Nếu một trình phục vụ ngắt dài hơn 8 byte ñược cần ñến, ta phải di chuyển chương trình này ñến một nơi khác trong bộ nhớ chương trình hoặc ta có thể cho lấn qua ñiểm nhập của ISR kế.

Phương án ñiển hình là cho ISR bắt ñầu với một lệnh nhảy ñến một vùng khác của bộ nhớ chương trình, ở ñó ISR ñược trải rộng nếu cần.

Trang 26

ORG 0000H ; reset

LJMP MAIN

ORG 000BH ; ðiểm nhập của ngắt do bộ ñịnh thời 0

LJMP T0ISR ; Bắt ñầu ISR cho bộ ñịnh thời 0

MAIN: ; Chương trình chính bắt ñầu

.

T0ISR: ; ISR của bộ ñịnh thời 0

RETI ; Trở về chương trình chính

Trang 27

Trong các ứ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 chương trình chính chỉ làm một số việc khởi ñộng ở thời ñiểm bắt ñầu Chương trình chính khởi ñộng bộ ñịnh thời, port nối tiếp, khởi tạo biến, nạp giá trị cho các thanh ghi ngắt sao cho thích hợp…… rồi không làm gì cả.

Trang 28

Các công việc hoàn toàn ñược thực thi trong ngắt, sau khi khởi ñộng, chương trình chính chứa lệnh sau:

HERE: SJMP HERE

Khi có một ngắt xuất hiện, chương trình chính tạm

thời bị ngắt trong khi ISR ñược thực thi Lệnh RETI

cuối chương trình ngắt trả ñiều khiển về chương trình chính và chương trình này tiếp tục không làm

gì cả.

Trang 29

ñiều khiển bị ngắt tại bất kỳ việc gì nó ñ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 này thì

bộ vi ñiều khiển có thể làm những công việc khác cho ñến khi nào nó ñược thông báo rằng bộ ñịnh thời ñã quay về 0.

Trang 30

Bài 1 : Viết một chương trình sử dụng bộ ñịnh thời 0 và các ngắt ñể tạo ra một

sóng vuông có tần số 10kHz trên chân P1.0.

8051

P1.0

100µ µ µs

50µ µ µs

Trang 31

LJMP MAIN ORG 000BH ; Vector ngắt của bộ ñịnh thời 0

T0ISR: CPL P1.0 ; Lấy bù

RETI ORG 0030H ; ðiểm nhập chương trình chính

MAIN: MOV TMOD, #02H ; Dùng bộ ñịnh thời 2, chế ñộ 0

MOV TH0,#-50 ; ðịnh thời 50µs SETB TR0 ; Bắt ñầu ñịnh thời MOV IE, #82H ; IE = 1000 0010 -> Cho phép ngắt do T0 SJMP $ ; Không làm gì

END.

Trang 32

Ngay khi reset hệ thống, bộ ñếm chương trình

PC ñược nạp giá trị 0000H Lệnh ñầu tiên ñược

chương trình chính ở ñịa chỉ 0030H trong bộ nhớ chương trình.

3 lệnh ñầu tiên của chương trình chính khởi ñộng bộ ñịnh thời 0 ở chế ñộ 2 (tự nạp lại 8-bit)

IE,#82H cho phép ngắt do bộ ñịnh thời 0 tạo ra.

Trang 33

Mỗi một lần bộ ñịnh thời tràn sẽ tạo ra một ngắt Khi

và trình phục vụ ngắt cho bộ ñịnh thời 0 ñược thực thi Ở thí dụ này chương trình dịch vụ ngắt chỉ ñơn giản lấy bù bit P1.0 và quay trở về chương trình chính nơi vòng lặp

“không làm gì” ñược thực thi ñể chờ một ngắt mới sau 50

µs

Cờ tràn của bộ ñịnh thời TF0 không cần xóa bởi phần

ñộng xóa bởi phần cứng khi CPU trỏ tới trình phục vụ ngắt.

Trang 34

Bài 2 : Viết một chương trình sử dụng các ngắt ñể tạo ñồng thời các dạng sóng

vuông có tần số là 7kHz và 500Hz trên các chân P1.7 và P1.6.

Chu kỳ xung:

T0 = 1/f0 = 1/7kHz ≈ 142µ µ µs

=> Thời gian cần ñịnh thời:

t0 = 71 µ µ µs T1 = 1/f1 = 1/500Hz= 2ms => t1 = 1ms

Số cần nạp cho thanh ghi của bộ ñịnh thời:

TH0: -71

TH1: FC TL1: 18

142µ µ µs

71µ µ µs

8051

P1.6 P1.7

2ms

1ms

Trang 35

Bộ ñịnh thời 0 hoạt ñộng ở Mode 2 ñược

sử dụng ñể tạo ra dạng sóng 7kHz trên chân P1.7, còn bộ ñịnh thời 1 hoạt ñộng ở Mode 1 tạo ra dạng sóng 500kHz trên chân P1.6 Vì dạng sóng 500kHz yêu cầu thời gian mức cao là 1ms và thời gian mức thấp là 1ms, chế

ñộ 2 không sử dụng ñược.

Trang 36

LJMP T0ISR ORG 001BH LJMP T1ISR ORG 0030H

MAIN: MOV TMOD,#00010010B

MOV TH0,#-71 ; Tần số 7kHz sử dụng bộ ñịnh thời 0

SETB TR0 SETB TF1 ; Buộc ngắt do bộ ñịnh thời 1

MOV IE,#8AH ; Cho phép ngắt do các bộ ñịnh thời

SJMP $

T0ISR: CPL P1.7

RETI

T1ISR: CLR TR1

MOV TH1,#0xFC ;#-1000 thoi gian muc cao 1ms

MOV TL1,#0x18 ;#-1000 thoi gian muc thap 1ms

SETB TR1 CPL P1.6 RETI END.

Trang 37

Các thanh ghi TH1,TL1 phải ñược nạp lại sau mỗi lần tràn (sau mỗi ngắt), trình phục vụ ngắt cho bộ ñịnh thời 1 làm các công việc sau:

Trang 38

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 còn ngắt thu xảy ra khi bộ ñệm thu SBUF ñầy.

Trang 39

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ó 2 nguyên nhân tạo ra ngắt

ở port nối tiếp, cụ thể là 2 nguyên nhân ngắt tạo ra bởi

2 cờ TIRI

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 (ðối với ngắt do các bộ ñịnh thời, cờ tạo ra ngắt ñược xóa bởi phần cứng khi CPU trỏ tới ISR).

Trang 40

Ví d ụ: Xuất ký tự sử dụng ngắt

Viết một chương trình sử dụng các ngắt ñể liên tục phát ñi tập mã ASCII (bao gồm cả các mã ñiều khiển)

ñến một thiết bị ñầu cuối nối với 8051 qua port nối tiếp

Có 128 mã ASCII 7-bit trong bảng mã ASCII Các mã này bao gồm 95 mã ñồ họa (từ 20H ñến 7EH) và 33 mã ñiều khiển (từ 00H ñến 1FH và 7FH).

Trang 41

LJMP SPISR ORG 0030H

MAIN: MOV TMOD, #20H ; Bộ ñịnh thời 1, chế ñộ 2

MOV TH1,#-26 ; giá trị nạp lại: 1200 baud

SETB TR1 ; bắt ñầu ñịnh thời

MOV SCON,#42 ; chế ñộ 1, set TI bằng 1 ñể buộc có 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 do port nối tiếp

SJMP $ ; Ko làm gì

SPISR: CJNE A,#7FH,SKIP ; Nếu kết thúc tập mã ASCII

MOV A,#20H ; reset ñến SPACE

SKIP: MOV SBUF,A ; Gửi ký tự ñến port nối tiếp

INC A ; Ký tự tiếp theo

CLR TI ; Xóa cờ ngắt phát

RETI

Trang 42

Sau khi nhảy ñến nhãn MAIN ở ñịa chỉ 0030H, ba lệnh ñầu tiên khởi ñộng bộ ñịnh thời 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 ở chế ñộ 1 (UART 8-bit) và set cờ

TI bằng 1 ñể buộc phải tạo ra một ngắt.

Sau ñó mã ASCII ñầu tiên (20H) ñược nạp cho thanh ghi

A và các ngắt do port nối tiếp ñược cho phép Cuối cùng

chương trình chính ñi vào vòng lặp “không làm gì” (chờ

ngắt).

Trang 43

Trình phục vụ ngắt của port nối tiếp làm tất cả các công việc một khi chương trình chính ñã thiết lập các ñiều kiện ban ñầu Hai lệnh ñầu tiên kiểm tra thanh chứa và nếu mã ASCII ñạt ñến 7FH (nghĩa

là mã vừa mới phát ñi là 7EH), thanh chứa ñược thiết lập lại với nội dung là 20H.

Sau ñó mã ASCII ñược gửi ñến bộ ñệm của port nối tiếp ( MOV

SBUF,A ), tăng thanh ghi chứa A ñể có mã kế tiếp, cờ ngắt phát ñược xóa ( CLR TI ) và trình phục vụ ngắt kết thúc ðiều khiển trả

về chương trình chính và lệnh SJMP $ ñược thực thi cho ñến khi

TI lại ñược set bằng 1

Trang 44

LẬP TRÌNH NGẮT NGOÀI

Ngắt ngoài xảy ra khi có mức thấp hoặc có cạnh âm trên chân

/INT0 hoặc /INT1 của 8051.

Thực tế các cờ tạo ra các ngắt này là các bit IE0IE1 của thanh ghi TCON Khi một ngắt ngoài ñược tạo ra, cờ tạo ra ngắt ñược xóa bởi phần cứng khi CPU trỏ ñến trình phục vụ ngắt chỉ nếu ngắt thuộc loại tác ñộng cạnh Nếu ngắt thuộc loại tác ñộng mức, nguyên nhân ngắt ngoài sẽ ñiều khiển mức của cờ thay vì

Trang 45

Việc chọn các ngắt loại tác ñộng cạnh hay các ngắt loại tác ñộng mức ñược lập trình thông qua các bit IT0IT1 của thanh ghi TCON

Ví d ụ: Nếu IT1 = 0 , ngắt ngoài 1 ñược kích khởi bởi việc phát hiện mức thấp ở chân /INT1 Nếu IT1 = 1 , ngắt ngoài 1 ñược kích khởi cạnh Ở chế ñộ này, nếu các mẫu liên tiếp ở chân

thấp trong một chu kỳ kế, cờ ngắt IE1 trong thanh ghi TCON

ñược set bằng 1; kế ñến IE1 yêu cầu 1 ngắt.

Trang 46

Vì các chân ngắt ngoài ñược lấy mẫu một lần ở mỗi một chu kỳ máy, các ngõ vào này phải ñược duy trì tối thiểu 12 chu kỳ dao ñộng ñể ñảm bảo rằng việc lấy mẫu là ñúng.

Nếu ngắt ngoài thuộc loại tác ñộng cạnh , nguyên nhân ngắt ngoài phải ñược duy trì ở chân yêu cầu ở mức cao tối thiểu 1 chu kỳ và sau ñó ở mức thấp tối thiểu một chu kỳ nữa ñể ñảm bảo việc chuyển trạng thái ñược phát hiện IE0 và IE1 tự ñộng ñược xóa khi CPU trỏ tới trình phục vụ ngắt tương ứng.

Trang 47

Nếu ngắt ngoài thuộc loại tác ñộng mức, nguyên nhân

ngắt ngoài phải ñược duy trì trạng thái tích cực cho ñến khi ngắt theo yêu cầu thực sự ñược tạo ra Sau ñó nguyên nhân ngắt phải ở trạng thái thụ ñộng trước khi trình phục vụ ngắt ñược thực thi xong hoặc trước khi có một ngắt khác ñược tạo ra.

Thông thường, một công việc ñược thực thi bên trong trình phục vụ ngắt làm cho nguyên nhân ngắt trả tín hiệu yêu cầu ngắt trở về trạng thái không tích cực.

Ngày đăng: 30/10/2015, 18:19

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w