Bài 3 : Khảo sát cơ chế ngắt quãng, giao tiếp LCD ký tự
3.1.1 Tóm tắt các thanh ghi điều khiển ngắt
Thanh ghi INTCON:
Thanh ghi PIE1:
Thanh ghi PIE2:
Thanh ghi PIR1:
Sơ đồ điều khiển ngắt:
3.2 Các bước hiện thực yêu cầu 1
Bước 1. Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là Interrupt, tạo file interrupt.asm và chọn chip 18f4520. Ta được hình sau:
Bước 2. Include file p18f4520.inc vào file interrupt.asm Bước 3. Khởi tạo PortB là output sử dụng các lệnh clrf, bcf
init clrf LATB
Bộ mơn Kỹ Thuật Máy Tính 23 Thực hành Vi xử lý
movwf ADCON1
bsf TRISB,RB0 ; RB0 là ngỏ nhập (nút nhấn)
bcf TRISB,RB1 ; RB1 là ngỏ xuất (Led)
bcf TRISB,RB2 ; RB2 là ngỏ xuất (Led)
bcf TRISB,RB3 ; RB3 là ngỏ xuất (Led)
movlw .10 ; khởi động biến delay=10
movwf delay
return
Bước 4. Khởi tạo timer 0 tạo ngắt 100 ms (với xung clock 4 MHz, chọn prescaler 2:1, số đếm 50000), cho ngắt timer 0 có độ ưu tiên thấp.
init_timer0
bsf RCON,IPEN ; cho phép ưu tiên ngắt.
bcf INTCON2,TMR0IP ; timer0 ưu tiên thấp
bcf INTCON,TMR0IF ; xóa cờ ngắt timer0
bsf INTCON,TMR0IE ; cho phép ngắt timer0
bsf INTCON,GIEL ; cho phép các ngắt ưu tiên thấ p
clrf T0CON ; tỉ lệ đếm trước 2:1
movlw HIGH(-.50000) ; nạp số đếm 50000 cho timer0
movwf TMR0H
movlw LOW(-.50000)
movwf TMR0L
bsf T0CON,TMR0ON ; cho phép timer0 đếm
return
Bước 5. Khởi tạo ngắt ngoài 0 tích cực cạnh xuống.
Đối với ngắt ngồi INT1 và INT2, độ ưu tiên phụ thuộc vào 2 bit INT1IP và INT2IP trong thanh ghi INTCON3. Cịn với ngắt ngồi INT0 thì độ ưu tiên ln là cao.
init_int0
bcf INTCON2,INTEDG0 ; tác động cạnh xuống
bcf INTCON,INT0IF ; xóa cờ ngắt
bsf INTCON,INT0IE ; cho phép ngắt ngoà i INT0
bsf INTCON,GIEH ; cho phép các ngắt ưu tiên cao
return
Bước 6. Viết chương trình cho ngắt ngồi 0, bật 3 đèn led đơn cùng sáng và khởi tạo lại giá trị cho biến delay để 1s sau thì ngắt timer sẽ tắt 3 đèn đó.
int0_isr bcf INTCON,INT0IF bsf LATB,RB1 bsf LATB,RB2 bsf LATB,RB3 movlw .10 movwf delay return
Bước 7. Viết chương trình cho ngắt timer0, sau 1s sau khi led được bật sáng thì nó sẽ làm cho led tắt.
Thời gian để timer đếm lên 1 đơn vị đượ c tính bằng cơng thức :
Như vậy, muốn có thời khoảng 100 ms (=50000*2μs), ta cần đếm 50000 lần. timer0_isr
bcf INTCON,TMR0IF bcf T0CON,TMR0ON
movlw HIGH(-.50000) ; nạp lại số đếm 50000 cho timer0
movwf TMR0H
movlw LOW(-.50000)
movwf TMR0L
bsf T0CON,TMR0ON ; cho phép timer0 đếm lại ; decfsz delay,1 bra timer0_isr_1 bcf LATB,RB1 bcf LATB,RB2 bcf LATB,RB3 movlw .10 movwf delay timer0_isr_1 return
3.3 Chương trình mẫu yêu cầu 1
;=====================================; ; Name: led_don.asm
; Project: Viết chương trình khởi tạo 2 ngắt: ; -Ngắt ngoài 0 với độ ưu tiên cao. ; -Ngắt timer 0 với độ ưu tiên thấp.
; -Ngắt INT0 : bật 3 led đơn RB1, RB2, RB3sáng cùng ;lúc
; -Ngắttimer0 : tắt 3 led đơn RB1, RB2, RB3sau 1s ; Author: BKIT HARDWARE CLUB
; Homepage: http://www.bkit4u.com/forum ; Creation Date: 7 - 31 - 2009 ;======================================; list p = PIC18F4520 #include P18f4520.inc code 0x00000 goto main org 0x00008 goto isr_high org 0x00018 goto isr_low ; Vung du lieu udata delay res .1
; Vung bat dau code
PRG code
Bộ mơn Kỹ Thuật Máy Tính 25 Thực hành Vi xử lý main call init call init_timer0 call init_int0 goto $
; Ham khoi dong ban dau
init clrf LATB
movlw 0x0F ; dung RB0 nhu Digital, khong phai Analog
movwf ADCON1
bsf TRISB,RB0 ;RB0 la ngo nhap (nut nhan)
bcf TRISB,RB1 ;RB1 la ngo xuat (Led)
bcf TRISB,RB2 ;RB2 la ngo xuat (Led)
bcf TRISB,RB3 ;RB3 la ngo xuat (Led)
movlw .10 ; khoi dong bien delay=10
movwf delay
return
; Ham khoi dong timer0 init_timer0
bsf RCON,IPEN ; cho phep uu tien ngat.
bcf INTCON2,TMR0IP ; timer0 uu tien thap
bcf INTCON,TMR0IF ; xoa co ngat timer0
bsf INTCON,TMR0IE ; cho phep ngat timer0
bsf INTCON,GIEL ; cho phep ngat uu tien thap
clrf T0CON ; prescaler 2:1
movlw HIGH(-.50000) ; nap so dem 50000 cho timer0
movwf TMR0H
movlw LOW(-.50000)
movwf TMR0L
bsf T0CON,TMR0ON ; cho phep timer0 dem
return
; Ham khoi dong int0 init_int0
bcf INTCON2,INTEDG0 ; tac dong canh xuong
bcf INTCON,INT0IF ; xoa co ngat
bsf INTCON,INT0IE ; cho phep ngat ngoai INT0
bsf INTCON,GIEH ; cho phep ngat uu tien cao
return
; Ham xu ly ngat timer0 timer0_isr
bcf INTCON,TMR0IF bcf T0CON,TMR0ON
movlw HIGH(-.50000) ; nap lai so dem 50000 cho timer0
movwf TMR0H
movlw LOW(-.50000)
movwf TMR0L
; decfsz delay,1 bra timer0_isr_1 bcf LATB,RB1 bcf LATB,RB2 bcf LATB,RB3 movlw .10 movwf delay timer0_isr_1 return
; Ham xu ly ngat int0 int0_isr bcf INTCON,INT0IF bsf LATB,RB1 bsf LATB,RB2 bsf LATB,RB3 movlw .10 movwf delay return
; Ham xu ly ngat uu tien cao isr_high
call int0_isr
retfie
; Ham xu ly ngat uu tien thap isr_low
call timer0_isr
retfie end
Sau khi có chương trình mẫu ta thực hiện việc compile chương trình và nạp xuống mạch để chạy chương trình như hướng dẫn ở chương 1.