Slide 1 CHƯƠNG 3 HỌ VI ĐiỀU KHIỂN 8051 ĐHBK Tp HCM Khoa Đ ĐT BMĐT GVPT Hồ Trung Mỹ Môn học Vi Xử Lý 3 7 Ngắt (Interrupt) Giới thiệu ngắt • Hệ thống được điều khiển bằng ngắt – làm nhiều việc đồng thời[.]
Trang 23.7 Ngắt (Interrupt)
Trang 3– Khi có các sự kiện cụ thể (ngắt) xảy ra, CPU sẽ nhảy đến
1 chương trình con cụ thể – chương trình phục vụ ngắt (ISR), xử lý ngắt
– Công việc mức nền ( ở Foreground) vớicông việc mức ngắt ( ở Background)
Trang 4Thực thi chương trình
Trang 5Tổng quan về cấu trúc ngắt của 8051
Trang 6Các nguồn ngắt
Trang 7Thanh ghi cho phép ngắt IE
• Mặt nạ ngắt
• Nếu có nhiều nguồn ngắt xảy ra?
– Mã hóa ưu tiên được sử dụng.
– Chỉ có 2 cấp ưu tiên trong 8051 Vẫn có nhiều ngắt có thể có cùng ưu tiên ngắt
Trang 8Thứ tự ưu tiên ngắt
Trang 9– Nếu CPU nhận tín hiệu ngắt
– CPU sẽ cất PC vào ngăn xếp (địa chỉ quay về)
– CPU sẽ nhảy đến ISR khác nhau theo nguồn ngắt khác nhau
– PC địa chỉ vector ngắt (= 3+( # of nguồn ngắt)*8)
Xử lý ngắt
Trang 10Tổ chức bộ nhớ khi sử dụng ngắt
Trang 12Chương trình phục vụ ngắt có kích thước nhỏ
Nếu chỉ có một nguồn ngắt được sử dụng, ví dụ Timer 0, thì
có thể sử dụng khung chương trình sau :
LJMP MAIN
Nếu sử dụng nhiều ngắt, thì phải bảo đảm là chúng bắt đầu ở
vị trí đúng và không chạy lố sang ISR kế Vì chỉ có một ngắt được sử dụng trong ví dụ trên, chương trình chính có thể bắt đầu ngay sau lệnh RETI
Trang 13Chương trình phục vụ ngắt có
kích thước lớn
Thí dụ lúc này chỉ xét Timer 0, có thể sử dụng khung sau :
ORG 0000H ; Điểm vào reset
RETI ; Quay về chương trình chính.
Để đơn giản, chương trình của chúng ta sẽ chỉ làm một việc lúc ban đầu
Chương trình khởi động timer, cổng nối tiếp và các thanh ghi ngắt cho thích hợp
và rồi không làm gì cả Công việc hoàn toàn được làm trong ISR Sau các lệnh khởi động, chương trình chính chứa lệnh sau :
HERE: SJMP HERE
hay dạng viết gọn như sau:
SJMP $
Trang 14Thí dụ: Tạo sóng vuông bằng ngắt của Timer
Các ngắt của Timer xảy ra khi các thanh ghi timer
TLx/THx tràn và đặt cờ báo tràn lên 1 (TFx) Ta có
chương trình như sau:
Trang 15Phân tích CT Tạo sóng vuông bằng ngắt Timer
• Ngay sau khi reset, PC được nạp trị 0000H
• Lệnh đầu tiên được thực thi LJMP MAIN mà rẽ nhánh bỏ qua ISR của Timer 0 đến địa chỉ 0030H trong bộ nhớ mã
• Ba lệnh kế (các dòng 11–13) khởi trị Timer 0 chế độ 2 tràn sau 50 s
• Lệnh MOV IE, #82H cho phép ngắt của Timer 0 Dĩ nhiên tràn thứ nhất sẽ không xảy ra trong vì có trì hoãn ở các lệnh khởi tạo trị
• Cứ sau 50 s một ngắt xảy ra; chương trình chính bị ngắt và ISR (của Timer 0) thực thi ISR này đảo trạng thái bit cổng và quay về chương trình gọi nó (vòng lặp tại chỗ)
và tiếp tục như vậy với 50 s kế.
• Chú ý là cờ timer TF0 không bị xóa bằng phần mềm Khi các ngắt được cho
phép, TF0 tự động bị xóa bằng phần cứng khi CPU chỉ đến ngắt.
• Tình cờ địa chỉ quay về trong chương trình chính là địa chỉ của lệnh SJMP Địa chỉ được cất vào ngăn xếp bên trong trước khi chỉ đến mỗi ngắt và được lấy lại từ ngăn xếp khi thực thi lệnh RETI ở cuối ISR Vì SP đã không được khởi tạo trị, do đó mặc nhiên nó có giá trị reset là 07H Tác vụ cất (PUSH) để địa chỉ quay về trong các ô nhớ RAM nội 08H (PCL = byte thấp của PC) và 09H (PCH = byte cao của PC).
Trang 16Thí dụ: Tạo hai sóng vuông dùng ngắt (1/2)
Viết chương trình dùng các ngắt để tạo ra các sóng vuông đồng thời 7 KHz và 500 Hz ở các chân P1.7 và P1.6
Bài giải
Cấu hình phần cứng với những định thì cho các dạng sóng mong muốn được cho trong hình sau:
Trang 17Thí dụ: Tạo hai sóng vuông dùng ngắt (2/2)
Trang 18Ngắt cổng nối tiếp
• SPISR phải kiểm tra RI hoặcTI và xóa nó
• TI xảy ra ở cuối thời gian bit thứ 8 trong chế độ 0 hoặc
bắt đầu bit dừng trong các chế độ khác TI phải bị xóa bằng phần mềm
• RI xảy ra ở cuối thời gian bit thứ 8 trong chế độ 0 hoặc
ở giữa bit dừng trong các chế độ khác khi SM2 =0 Nếu SM2 = 1, RI = RB8 trong chế độ 2,3 và RI = 1 chỉ khi bit dừng hợp lệ nhận được trong chế độ 1
Trang 19Xuất tập mã ASCII dùng ngắt (1/2)
; xu t các mã ASCII ra c ng n i ti pất các mã ASCII ra cổng nối tiếp ổng nối tiếp ối tiếp ếp
ORG 0 LJMP Main ORG 0023H ; vector c ng n i ti p ổng nối tiếp ối tiếp ếp LJMP SPISR
ORG 0030H ; đi m vào chính ểm vào chính
MOV TH1,#-26 ; dùng 1200 baud
MOV SCON,#42H ; mode 1, cho TI = 1 đ ép ng t ểm vào chính ắt
; g i ký t th nh t ửi ký tự thứ nhất ự thứ nhất ứ nhất ất.
MOV A,#20H ; tr ước hết gửi khoảng trống ếp ửi ký tự thứ nhất c h t g i kho ng tr ng ảng trống ối tiếp MOV IE,#90H ; cho phép ng t c ng n i ti p ắt ổng nối tiếp ối tiếp ếp SJMP $ ; đ i có ng t ợi có ngắt ắt
Trang 20SPISR: CJNE A,#7FH,Skip ; n u mã ASCII = 7FH ếp
MOV A,#20H ; xu t l i t đ u t 20H ất ạy ừ đầu từ 20H ầu từ 20H ừ đầu từ 20H Skip: MOV SBUF,A ; b t đ u phát n i ti p ắt ầu từ 20H ối tiếp ếp
RETI
• Tốc độ CPU phải lớn hơn nhiều truyền nối tiếp1200 baud
Do đó phần lớn thời gian CPU thực thi SJMP.
• Thời gian cho 1 ký tự = (1/1200 baud)(8+1+1) = 8333.3 mS
so với 1 µS machine cycle!
• Ta nên thay lệnh SJMP bằng các lệnh hữu dụng để làm
việc gì đó.
Xuất tập mã ASCII dùng ngắt (2/2)
Trang 21trong chu kỳ máy kế.
• IE0 và IE1 được tự động xóa khi CPU chuyển sang ISR
Trang 22• Nếu ngắt ngoài được kích mức thấp (IT0 hoặc IT1 =0), thì nguồn bên ngoài phải ở tích cực cho đến khi ngắt
yêu cầu được sinh ra
• Tiếp theo nó phải không tích cực trước khi ISR hoàn tất, hoặc ngắt khác sẽ được tạo ra
• Thường thì có tác động trong ISR làm cho nguồn yêu cầu ngắt quay về trang thái không tích cực
Ngắt ngoài
Trang 231 = solenoid engaged (furnace on) if T < 19C
0 = solenoid disengaged (furnace off) if T > 21C
Trang 24ORG 0 LJMP Main
RETI ORG 13H
RETI ORG 0030H Main: MOV IE,#85H ; cho phép ng t ngoài ắt
SETB IT0 ; kích c nh âm ạy SETB IT1
SETB P1.7 ; tr ước hết gửi khoảng trống ếp ở lò c h t m lò
JB P3.2,Skip ; n u T>21? ếp CLR P1.7 ; đúng thì t t lò ắt Skip: SJMP $ ; không làm gì c ảng trống
TD: Bộ điều khiển lò (2/2)
Trang 26ORG 0 LJMP Main LJMP EX0ISR ORG 0BH LJMP T0ISR ; T0 và R7=20 t o tr 1s ạy ễ 1s ORG 1BH
LJMP T1ISR ; dùng T1 t o âm c nh báo ạy ảng trống
MOV TMOD,#11H ; timer 16 bit MOV IE,#81H ; cho phép ng t ngoài 0 ắt Skip: SJMP $ ; đ i ng t ợi có ngắt ắt
TD: Hệ thống cảnh báo có người lạ (2/4)
Trang 27EX0ISR: MOV R7,#20 ; 20x50000 s = 1 s
SETB TF0 ; ép ph c v T0 ISR ục vụ T0 ISR ục vụ T0 ISR SETB TF1 ; ép ph c v T1 ISR ục vụ T0 ISR ục vụ T0 ISR SETB ET0 ; cho phép ng t T0 ắt SETB ET1 ; cho phép ng t T1 ắt RETI
MOV TL0,#LOW(-50000) ; làm tr ễ 1s
SETB TR0 ; cho T0 ch y l n n a ạy ầu từ 20H ữa
TD: Hệ thống cảnh báo có người lạ (3/4)
Trang 28TD: Hệ thống cảnh báo có người lạ (4/4)
Trang 29Interrupt Timing 1
• Since the external interrupt pins are sampled once each machine cycle, an input high or low should hold for at least 12 oscillator periods to ensure
sampling.
• If the external interrupt is transition-activated , the external source has to hold the request pin high for at least one cycle, and then hold it low for at least one cycle This is done to ensure that the
transition is seen so that interrupt request flag IEx will be set
• IEx will be automatically cleared by the CPU when
the service routine is called.
Trang 30Interrupt Timing 2
• If the external interrupt is level-activated,
the external source has to hold the
request active until the requested interrupt
is actually generated Then it has to
deactivate the request before the interrupt service routine is completed, or else
another interrupt will be generated.
Trang 31Interrupt Timing 3
• Response Time
The /INT0 and /INT1 levels are inverted and latched into IE0 and IE1 at S5P2 of every machine cycle The values are not actually polled by the circuitry until
the next machine cycle
• If a request is active and conditions are right for it to
be acknowledged, a hardware subroutine call to the requested service routine will be the next instruction
to be executed The call itself takes two cycles Thus,
a minimum of three complete machine cycles elapse between activation of an external interrupt request and the beginning of execution of the first instruction
of the service routine
Trang 32Interrupt Timing 4
• A longer response time would result if the request is
blocked by one of the 3 previously listed conditions.
1 An interrupt of equal or higher priority level is
already in progress.
2 The current (polling) cycle is not the final cycle in the execution of the instruction in progress
(ensure completion)
3 The instruction in progress is RETI or any write
to the IE or IP registers (one more instruction will
be executed)
• If an interrupt of equal or higher priority level is
already in progress, the additional wait time
obviously depends on the nature of the other
interrupt’s service routine.
Trang 33Interrupt Timing 5
• If the instruction in progress is not in its final cycle,
the additional wait time cannot be more than 3 cycles, since the longest instructions (MUL and DIV) are only
4 cycles long, and if the instruction in progress is
RETI or an access to IE or IP , the additional wait time cannot be more than 5 cycles (a maximum of one
more cycle to complete the instruction in progress, plus 4 cycles to complete the next instruction if the instruction is MUL or DIV).
• Thus, in a single-interrupt system, the response time
is always more than 3 cycles and less than 9 cycles.
Trang 34Interrupt Response Timing Diagram: Fastest
Trang 35Interrupt Response Timing Diagram: Longest
RETI MUL AB Save PC ISR Level 0 ISR Main program Level 0 ISR
9 cycles
Level 1 interrupt occurs here (missed last chance before RETI instruction)
Trang 36Interrupt Timing 6
Single-Step Operation
• The 80C51 interrupt structure allows single-step
execution with very little software overhead As
previously noted, an interrupt request will not be
responded to while an interrupt of equal priority level
is still in progress, nor will it be responded to after RETI until at least one other instruction has been
executed Thus, once an interrupt routine has been entered, it cannot be re-entered until at least one
instruction of the interrupted program is executed
• One way to use this feature for single-step operation
is to program one of the external interrupts (e.g.,
/INT0) to be level-activated
Trang 37Interrupt Timing 7
• The service routine for the interrupt will terminate with
the following code:
JNB P3.2,$ ;Wait Till /INT0 Goes High
JB P3.2,$ ;Wait Till /INT0 Goes Low
RETI ;Go Back and Execute One Instruction
• Now if the /INT0 pin, which is also the P3.2 pin, is held
Interrupt 0 routine and stay there until /INT0 is pulsed (from low to high to low) Then it will execute RETI, go back to the task program, execute one instruction, and immediately re-enter the External Interrupt 0 routine to await the next pulsing of P3.2 One step of the task
Trang 38periods ), while the oscillator is running The CPU
responds by generating an internal reset.
• The external reset signal is asynchronous to the
internal clock The RST pin is sampled during State 5 Phase 2 of every machine cycle The port pins will
maintain their current activities for 19 oscillator
periods after a logic 1 has been sampled at the RST pin; that is, for 19 to 31 oscillator periods after the
external reset signal has been applied to the RST pin.
Trang 39Reset Timing
Trang 40Interrupt Timing 9
• The internal reset algorithm writes 0s to all
the SFRs except the port latches, the Stack
Pointer, and SBUF
• The port latches are initialized to FFH (input
mode), the Stack Pointer to 07H, and SBUF is indeterminate
• The internal RAM is not affected by reset On
power up the RAM content is indeterminate.