7.1 Giới thiệu Ngắt là 1 hoạt động bất đồng bộ tác động vào chương trình đang thực hiện tuần tự Khi yêu cầu ngắt được đáp ứng,chương trình chính sẽ tạm dừng,chuyển sang thực hiện chư
Trang 1CHƯƠNG 7
NGẮT(INTERRUPT)
Trang 27.4 Thiết kế chương trình sử dụng ngắt
7.4.1 ISR ngắn 7.4.2 ISR dài 7.5 Ngắt Timer
7.6 Ngắt SPI
7.7 Ngắt ngoài
7.8 Định thì ngắt
Trang 37.1 Giới thiệu
Ngắt là 1 hoạt động bất đồng bộ tác động vào chương trình đang thực hiện tuần tự
Khi yêu cầu ngắt được đáp ứng,chương trình chính sẽ tạm dừng,chuyển sang thực hiện chương trình phục vụ ngắt và khi thực hiện xong sẽ quay về thực hiện tiếp chương trình chính tại điểm dừng ban đầu
Ngắt có thể tác động tại bất kỳ điểm nào trong chương trình chính
Chương trình thực hiện theo tác động ngắt gọi là trình phục vụ ngắt(ISR: Interrupt Sevice Routine)
Địa chỉ bắt đầu ISR gọi là vector ngắt(do nhà sản xuất quy định)
Kết thúc ISR bằng lệnh RETI(Return from Interrupt)
Hình 7.1 mô tả hoạt động của MCU khi có tác động ngắt:
Chương trình chính=Base-level(Foreground)
ISR=Interrupt-level(Background)
Trang 47.1 Giới thiệu
Hình 7.1: (a) Chương trình không có ngắt;(b) Chương trình có ngắt
Trang 57.1 Giới thiệu
Một số ví dụ về tác động ngắt:
1 Trong các ví dụ về nhận dạng phím nhấn,thay vì chương trình chính liên tục hỏi vòng đọc trạng thái phím và chờ phím nhấn,sử dụng tác động nhấn phím làm điều kiện
ngắt.Chương trình chính sẽ thực hiện các công việc khác,khi có phím nhấn sẽ tạo
ngắt,chương trình chính sẽ chuyển sang ISR phục vụ theo yêu cầu có phím nhấn
2 Trong ví dụ về giao tiếp ADC0809,thay vì MCU phải chờ tín hiệu EOC tích cực hay phải thực hiện chương trình con tạo trễ 120µs,sử dụng tín hiệu EOC tích cực làm tín hiệu ngắt.MCU sẽ thực hiện các công việc khác,khi ADC biển đổi xong sẽ tạo tín hiệu EOC tích cực báo ngắt,MCU sẽ chuyển sang ISR tương ứng để đọc giá trị AD về
Hoạt động ngắt giải phóng cho MCU khỏi khoảng “thời gian chết” chờ thực hiện điều kiện(như chờ nhấn phím,chờ ADC biến đổi xong…),tiết kiệm thời gian thực thi của MCU
và MCU gần như đáp ứng tức thời với một tác động hay sự kiện xảy ra!
Trang 67.2 Tổ chức ngắt của MCU8051
MCU8051 có 5 nguồn ngắt: 2 ngắt ngoài,2 ngắt Timer,1 ngắt cổng nối tiếp(SPI)
Ngắt ngoài ngõ /INT0=P3.2: Tín hiệu tạo ngắt đưa vào ngõ /INT0 tích cực mức thấp hoặc cạnh xuống
Ngắt ngoài ngõ /INT1=P3.3: Tín hiệu tạo ngắt đưa vào ngõ /INT1 tích cực mức thấp hoặc cạnh xuống
Ngắt Timer0: Tín hiệu tạo ngắt khi Timer0 tràn TF0=1
Ngắt Timer1: Tín hiệu tạo ngắt khi Timer1 tràn TF1=1
Ngắt SPI: Tín hiệu báo ngắt khi phát xong ký tự TI=1 hay thu xong ký tự RI=1
MCU8052 có thêm ngắt Timer2
Khi Timer2 tràn TF2=1 hay khi bắt/nạp lại làm EXF2=1
Tất cả các nguồn ngắt bị cấm khi reset hệ thống và được khai báo cho phép/cấm riêng rẽ từng nguồn ngắt qua SFR IE
Trường hợp có 2 hay nhiều nguồn ngắt xảy ra đồng thời,mức ưu tiên ngắt sẽ được khai báo
ưu tiên từng nguồn ngắt qua SFR IP hay trình tự hỏi vòng mặc định
Trang 77.2 Tổ chức ngắt của MCU8051
7.2.1 SFR IE- Cấm/cho phép các nguồn ngắt
IE địa chỉ byte 0A8H,truy xuất bit được
Chứa các bit cấm/cho phép toàn bộ hoặc từng nguồn ngắt độc lập
Bảng 7-1: Tóm tắt SFR IE
Ví dụ 7.1: Khai báo cho phép ngắt Timer1
Giải:
Bit Ký hiệu Đia chỉ bit Mô tả(1= cho phép;0= cấm)
IE.7 EA 0AFH Cho phép/cấm toàn cục
IE.5 ET2 0ADH Cho phép ngắt Timer2(8052)
IE.4 ES 0ACH Cho phép ngắt SPI
IE.3 ET1 0ABH Cho phép ngắt Timer1
IE.2 EX1 0AAH Cho phép ngắt ngoài ngõ /INT1
IE.1 ET0 0A9H Cho phép ngắt Timer0
IE.0 EX0 0A8H Cho phép ngắt ngoài ngõ /INT0
Trang 87.2 Tổ chức ngắt của MCU8051
7.2.2 SFR IP- Mức ưu tiên ngắt
IP địa chỉ bit B8H,truy xuất bit được
Khai báo các bit ưu tiên cao=1/ ưu tiên thấp=0 cho từng nguồn ngắt độc lập
Khi mới reset hệ thống (IP)=00H→các nguồn ngắt cùng mức ưu tiên
Bảng 7-2: Tóm tắt SFR IP
Bit Ký hiệu Đia chỉ bit Mô tả(1= ưu tiên cao;0= ưu tiên thấp)
IP.5 PT2 0BDH Ưu tiên ngắt Timer2(8052)
IP.3 PT1 0BBH Ưu tiên ngắt Timer1
IP.2 PX1 0BAH Ưu tiên ngắt ngoài ngõ /INT1
IP.0 PX0 0B8H Ưu tiên ngắt ngoài ngõ /INT0
Trang 97.2 Tổ chức ngắt của MCU8051
7.2.2 SFR IP- Mức ưu tiên ngắt
Thực hiện ngắt ưu tiên:
- Khi 2 nguồn ngắt xảy ra đồng thời điểm,MCU sẽ thực hiện trước nguồn ngắt mức ưu tiên cao,sau đó mới thực hiện nguồn ngắt mức ưu tiên thấp
- Khi MCU đang thực hiện ISR nguồn ngắt mức ưu tiên thấp,có tín hiệu yêu cầu nguồn ngắt mức ưu tiên cao,MCU sẽ tạm dừng thực hiện ISR nguồn ngắt ưu tiên thấp,chuyển sang thực hiện ISR nguồn ngắt ưu tiên cao hơn,sau đó sẽ quay thực hiện tiếp ISR nguồn ngắt mức ưu tiên thấp tại điểm dừng trước đó
7.2.3 Trình tự hỏi vòng
Trường hợp 2 nguồn ngắt cùng cấp ưu tiên,MCU sẽ xác định mức ưu tiên theo trình tự hỏi vòng theo thứ tự nguồn ngắt ưu tiên đứng trước: /INT0,Time0,/INT1,Timer1,SPI,Timer2
Trang 10 MCU đang thực hiện ISR Timer0→ngắt /INT0 xảy ra,do sau khi reset hệ thống mức ưu tiên
2 nguồn ngắt này bằng nhau(PX0=PT0=0)→xét trình tự hỏi vòng ngắt /INT0 ưu tiên cao hơn→MCU tạm dừng ISR Timer0 và chuyển đến thực hiện ISR /INT0
MCU đang thực hiện ISR /INT0→ngắt SPI xảy ra,do PS=1→mức ưu tiên cao hơn→MCU tạm dừng ISR /INT0 và chuyển đến thực hiện ISR SPI
Sau khi thực hiện xong ISR SPI,MCU quay về thực hiện tiếp ISR /INT0
Sau khi thực hiện xong ISR /INT0,MCU quay về thực hiện tiếp ISR Timer0
Sau khi thực hiện xong ISR Timer0,MCU quay về thực hiện tiếp chương trình chính
Giáo Trình Vi Xử Lý Lưu Phú 10
Trang 11 Lưu ý là cờ báo tràn TF0,TF1 của Timer0 và Timer1 vẫn set khi Timer tràn hoặc cờ RI,TI vẫn set khi thu đủ/phát xong 1 ký tự,cho dù không khai báo ngắt.Ngắt Timer hay ngắt SPI chỉ tác động khi khai báo cho phép ngắt tương ứng
Giáo Trình Vi Xử Lý Lưu Phú 11
Trang 127.2 Tổ chức ngắt của MCU8051
7.2.4 Các cờ báo ngắt
Bảng 7-3: Tóm tắt các cờ báo ngắt
Ngắt SPI có 2 cờ báo ngắt là TI(phát) và RI(thu)
Ngắt Timer2 có 2 cờ báo ngắt là TF2(báo tràn) và EXF2(báo điều khiển ngoài)
Hình 7.2 tóm tắt tổ chức ngắt MCU8051(8052) gồm cho phép/cấm,mức ưu tiên ngắt,cờ báo ngắt,tín hiệu từ nguồn ngắt
Giáo Trình Vi Xử Lý Lưu Phú 12
Loại ngắt Ký hiệu cờ Đia chỉ bit trong SFR
Trang 137.2 Tổ chức ngắt của MCU8051
7.2.4 Các cờ báo ngắt
Giáo Trình Vi Xử Lý Lưu Phú 13
Hình 7.2: Tóm tắt tổ chức ngắt MCU8051(8052)
Trang 147.3 Xử lý ngắt
Khi có một ngắt xảy ra và được MCU chấp nhận,chương trình chính tạm dừng,các hoạt động sau được thực hiện:
Thực thi xong lệnh hiện hành
Nội dung PC được cất vào trong stack
Trạng thái ngắt hiện hành được lưu bên trong
Các ngắt được chặn theo mức ưu tiên ngắt
PC nạp địa chỉ vector ngắt ISR
Thực thi ISR
ISR thực thi đáp ứng theo yêu cầu ngắt tương ứng
Kết thúc ISR bằng lệnh RETI→PC phục hồi lại nội dung cất vào stack trước đó và trạng thái ngắt trước đó cũng được phục hồi lại,chương trình tiếp tục thực hiện từ điểm dừng trước đó
Giáo Trình Vi Xử Lý Lưu Phú 14
Trang 157.3 Xử lý ngắt
Vector ngắt
Khi một ngắt được chấp nhận,giá trị nạp vào PC gọi là vector ngắt
Vector ngắt chính là địa chỉ đầu tiên của ISR thuộc nguồn ngắt tương ứng
Trang 167.3 Xử lý ngắt
Reset hệ thống xem như là một ngắt ngoài đặc biệt,tín hiệu ngắt chính là tín hiệu reset mức
1 đưa vào chân Reset(pin 9)→PC nạp vector ngắt 0000H
Khi PC được nạp vector ngắt bắt đầu thực thi ISR,các cờ báo ngắt tương ứng được tự động xóa bằng phần cứng,trừ ngắt SPI và Timer2
Ngắt SPI có 2 cờ báo ngắt là TI và RI,ngắt Timer2 có 2 cờ báo ngắt là TF2 và EXF2→phần cứng không biết chính xác là ngắt từ nguồn nào( thu hay phát,Timer2 tràn hay bắt/nạp
lại),nên sẽ không xóa cờ báo ngắt.Trong ISR tương ứng,phần mềm sẽ kiểm tra loại ngắt nào
và sẽ xóa cờ báo ngắt tương ứng
Chiều dài vùng nhớ giữa 2 vector ngắt chỉ có 8 byte,nếu dung lượng ISR dài quá 8 byte sẽ
đè lên vector ngắt kế tiếp→không sử dụng được ngắt kế tiếp
Do các vector ngắt ở vùng địa chỉ đầu của chương trình→lệnh đầu tiên trong chương trình chính thường là lệnh nhảy,ví dụ LJMP 0030H để dự trữ vùng địa chỉ vector ngắt
Giáo Trình Vi Xử Lý Lưu Phú 16
Trang 187.4 Thiết kế chương trình sử dụng ngắt
Sau khi reset hệ thống,địa chỉ đầu tiên thực hiện chương trình là 0000H,để dự trữ vùng
vector ngắt,lệnh đầu tiên trong chương trình chính là lệnh nhảy dài đến địa chỉ thực sự bắt đầu chương trình chính:
LJMP MAIN ; lệnh đầu tiên sau reset
… ; điểm vào các ISR theo các vector ngắt
ORG 0030H ; điểm vào chương trình chính
Lệnh đầu tiên dài 3 byte chiếm địa chỉ từ 0000-0002H,nhảy đến nhãn MAIN địa chỉ 0030H
Từ địa chỉ 0003H là vector ngắt cho ISR /INT0,mỗi ISR dài 8 byte,nên dự trữ vùng địa chỉ các vector ngắt và bắt đầu chương trình chính tại địa chỉ 0030H
7.4.1 ISR ngắn
Trường hợp các ISR ngắn chiều dài không quá 8 byte,có thể viết trực tiếp các ISR tại các địa chỉ vector ngắt
Giáo Trình Vi Xử Lý Lưu Phú 18
Trang 19ORG 0030H ;bắt đầu chương trình chính
SETB ET0 ;cho phép ngắt Timer0
…
Vector ngắt 000BH là địa chỉ bắt đầu ISR Timer0
ISR Timer0 dài 3 byte không đè lên địa chỉ vector ngắt kế tiếp là 0013H của ngắt /INT1
Giáo Trình Vi Xử Lý Lưu Phú 19
Trang 217.4 Thiết kế chương trình sử dụng ngắt
ORG 0000H LJMP MAIN ;nhảy đến chương trình chính ORG 000BH ; điểm vào ISR Timer0
LJMP T0_ISR ; nhảy đến T0_ISR
SETB TR0 RETI
Tại điểm vào ISR Timer0 tại địa chỉ 000BH,lệnh LJMP T0_ISR chỉ dài 3 byte chuyển điểm bắt đầu thực sự ISR Timer0 tại nhãn T0_ISR nằm ngoài vùng địa chỉ vector ngắt→không giới hạn chiều dài ISR Timer0
So với các ví dụ ở chương 5 Timer,trong ví dụ 7.4 và 7.5 không có lệnh chờ cờ báo tràn TF0 set và xóa TF0→Do có khai báo ngắt Timer0,khi Timer0 tràn TF0=1 tạo tín hiệu ngắt→MCU tạm dừng chương trình chính và PC nạp địa chỉ vector ngắt là 000BH,đồng thời phần cứng tự động xóa cờ TF0
Giáo Trình Vi Xử Lý Lưu Phú 21
Trang 227.5 Ngắt Timer
Ngắt Timerx xảy ra khi Timerx báo trán,cờ báo tràn TFx=1
Khi MCU chuyển đến ISR Timerx tương ứng phần cứng tự động xóa cờ báo tràn TFx
Khi khai báo cho phép ngắt Timer,chương trình chính không cần kiểm tra và xóa cờ báo tràn tương ứng
Ví dụ 7.6: Viết một chương trình sử dụng ngắt Timer0 tạo chuỗi xung vuông đối xứng f=10Khz trên P1.0 (Fosc=12Mhz)
MOV TH0,#-50 ;giá trị nạp lại
MOV IE,#82H ;cho phép ngắt Timer0
END Giáo Trình Vi Xử Lý Lưu Phú 22
Trang 237.5 Ngắt Timer
Để tạo chuỗi xung vuông đối xứng Timer0 chạy mode 2 giá trị nạp lại -50
Khi Timer0 tràn TF0=1→tạo tín hiệu ngắt Timer0→PCHH được cất vào stack và nạp vector ngắt Timer0 000BH,địa chỉ bắt đầu ISR Timer0,đồng thời xóa cờ TF0
ISR Timer0 thực hiện đảo bit P1.0,kết thúc ISR PC nạp lại địa chỉ đã cất vào stack trước đó
và tiếp tục chạy chương trình chính cho đến khi có yêu cầu ngắt mới
Trong chương trình chính lệnh SJMP $ là lệnh “giả” để hoàn chỉnh chương trình.Trong thực tế,thay cho lệnh SJMP $,MCU sẽ thực hiện các lệnh tương ứng với các công việc khác
Ví dụ 7.7: Viết chương trình tạo chuỗi xung đối xứng tần số 7Khz và 500Hz lần lượt xuất ra P1.7 và P1.6 (Cho Fosc=12Mhz)
Giải:
Để tạo chuỗi xung 7Khz, = 142.8 ≈ 143
→chọn Timer0 mode 2,giá trị nạp lại -71
Để tạo chuỗi xung 500Hz,T=1000µs
→chọn Timer1 mode1,giá trị nạp lại -1000
Giáo Trình Vi Xử Lý Lưu Phú 23
Hình vd7.7
Trang 247.5 Ngắt Timer
ORG 0
RETI END
Giáo Trình Vi Xử Lý Lưu Phú 24
Trang 25 ISR Timer0 chỉ là lệnh đảo bit P1.7
ISR Timer1 thực hiện:
Trang 267.6 Ngắt SPI
Ngắt SPI xảy ra từ một trong hai nguồn ngắt sau:
- Khi phát xong 1 ký tự,SBUF phát rỗng,cờ ngắt phát TI=1
- Khi thu đủ 1 ký tự,SBUF thu đầy,cờ ngắt thu RI=1
Khi MCU chuyển đến địa chỉ vector ngắt SPI,phần cứng sẽ không xóa TI hay RI do không biết ngắt từ nguồn nào
Trong ISR SPI sẽ kiểm tra các cờ báo ngắt và xóa bằng mềm cờ báo ngắt tương ứng
Ví dụ 7.8: Viết một chương trình sử dụng ngắt SPI liên tục truyền các ký tự mã ASCII nhìn thấy được ra cổng nối tiếp,với baudrate=9600,cho Fosc=11.059Mhz
Giải:
Mã ASCII nhìn thấy được giá trị từ 20H đến 7EH
Với Fosc=11.059Mhz,giá trị nạp lại cho TH1 bằng -3(SMOD=0)tạo BR=9600
Trong chương trình khai báo SPI cấm thu nên khi có ngắt SPI chắc chắn là ngắt phát TI=1
Khi khai báo SPI qua SCON,TI=1 tạo ép ngắt ngay vì SBUF phát rỗng khi mới reset
Mỗi lần SPI phát xong 1 ký tự SBUF phát rỗng,TI=1 tạo ngắt SPI
Trong ISR SPI phát tiếp ký tự và xóa TI
Giáo Trình Vi Xử Lý Lưu Phú 26
Trang 277.6 Ngắt SPI
LJMP MAIN ORG 0023H ;vector ngắt SPI LJMP SPI_ISR
ORG 0030H
MOV TH1,#-3 ; giá trị nạp lại tạo BR=9600 SETB TR1
MOV SCON,#42H ;SPI UART 8 bit cấm thu,TI=1ép ngắt MOV A,#20H ;Ký tự đầu tiên
MOV IE,#90H ;cho phép ngắt SPI SJMP $
SPI_ISR: CJNE A,#7FH,SKIP ;phát ký tự cuối?
MOV A,#20H ;phát lại ký tự đ62u SKIP: MOV SBUF,A ;phát ký tự ra SPI
RETI END Giáo Trình Vi Xử Lý Lưu Phú 27
Trang 28- IT1(TCON.2)=0: ngắt tác động mức thấp;IT1=1: ngắt tác động cạnh xuống
Khi khai báo ngắt tác động cạnh xuống ITx=1,khi MCU chuyển đến ISR,cờ báo ngắt IEx tương ứng sẽ tự động xóa bằng phần cứng
Khi khai báo ngắt tác động mức thấp,khi MCU chuyển đến ISR,cờ báo ngắt IEx không bị
xóa bằng phần cứng,mà chỉ xóa khi tín hiệu yêu cầu ngắt ngoài đưa vào ngõ /INTx lên mức 1
→Trước khi RETI,tín hiệu yêu cầu ngắt ngoài phải lên mức 1 hoặc thực hiện lệnh cấm ngắt ngoài tương ứng,nếu không sau khi kết thúc ISR,cờ IEx vẫn =1 sẽ làm MCU ngắt tiếp→tạo vòng lặp ngắt cho đến khi tín hiệu yêu cầu ngắt ngoài lên mức 1
Giáo Trình Vi Xử Lý Lưu Phú 28
Trang 297.7 Ngắt ngoài
Ví dụ 7.10: Mạch điều khiển nhiệt độ như hình vd7.7 hoạt động như sau:
- P1.7 điều khiển mạch lái nguồn nhiệt : P1.7=1 lò nung on,P1.7=0 lò nung off
RETI ORG 000BH;vector ngắt /INT1 EX1_ISR: SETB P1.7 ;on lò nung
RETI ORG 0030H MAIN: MOV IE,#85H ; cho phép ngắt /INT0 và /INT1
SETB IT0 ;ngắt /INT0 cạnh xuống SETB IT1 ;ngắt /INT1 cạnh xuống SETB P1.7 ; on lò nung
SJMP $ END Giáo Trình Vi Xử Lý Lưu Phú Hình vd7.10 29
Trang 307.7 Ngắt ngoài
Ví dụ 7.11: Thiết kế mạch phát âm thanh cảnh báo tần số 400Hz trong một giây khi cảm biến cửa mở phát tín hiệu logic từ 1→0 theo sơ đồ mạch như hình vd7.11(Fosc=12Mhz)
Giải:
Sử dụng tín hiệu cảm biến cửa mở làm tín hiệu ngắt ngoài /INT0:
- Trong ISR /INT0 cho phép ngắt Timer0 và Timer1
Sử dụng ngắt Timer0 tạo chuỗi xung vuông đối xứng f=400Hz→T=2500µs:
- Khai báo Timer0 mode 1,giá trị nạp lại=-1250
Sử dụng ngắt Timer1 tạo thời gian delay 50ms và đếm số lần ngắt 20 lần→tạo trễ 1s:
- Khai báo Timer1 mode 1,giá trị nạp lại=-50000
LJMP EX0_ISR ;vector ngắt /INT0
LJMP T1_ISR
Giáo Trình Vi Xử Lý Lưu Phú 30
Trang 317.7 Ngắt ngoài
ORG 0030H MAIN: SETB IT0 ;ngắt /INT0 cạnh xuống
MOV TMOD,#11H ;Timer0 và Timer1 mode 1 MOV IE,#81H ; cho phép ngắt /INT0 SJMP $
EX0_ISR: MOV R7,#20 ;đếm số lần ngắt /INT0
SETB TF0 ;ép ngắt Timer0 SETB TF1 ;ép ngắt Timer1 SETB ET0 ;cho phép ngắt Timer0 SETB ET1 ;cho phép ngắt Timer1 RETI
T0_ISR: CLR TR0
MOV TH0,#HIGH(N0);giá trị nạp lại Timer0 MOV TL0,#LOW(N0)
CPL P1.7 ;xuất xung ra P1.7 SETB TR0
RETI T1_ISR: CLR TR1
DJNZ R7,SKIP ;đếm số lần ngắt đủ 20?
CLR ET0 ;cấm ngắt Timer0 CLR ET1 ;cấm ngắt Timer1 SJMP EXIT
Giáo Trình Vi Xử Lý Lưu Phú 31
SKIP: MOV TH1,#HIGH(N1);giá trị nạp lại Timer1 MOV TL1,#LOW(N1)
SETB TR1 EXIT: RETI
END
Hình vd7.11