tppdua
10-02-2010, 08:08 PM
em mới học pic, đang tìm hiểu về ngắt và định thời của pic, nhưng ko có tài liệu cụ thể, nên em coi về các thanh ghi liên quan trong datasheet rồi xem các vd, có chỗ em ko hiểu , mong anh chị giải đáp
TITLE " nhap nhay rb0_dung timer0 "
PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC &_LVP_OFF &_CPD_OFF &_BODEN_OFF
;============phan dat bien=============================
COUNT EQU 0X23
;===========Phan chuong trình chính======================
ORG 0x00
GOTO MAIN
ORG 0X04 ; dia chi vector ngat, tat ca ngat chi co dia chi nay
GOTO NGAT
ORG 0x0005
MAIN
MOVLW .56 ; nap 56 vao de timer0 dem dc 200 lan thi tran
MOVWF TMR0
BANKSEL TRISB
CLRF TRISB
MOVLW B'10100000' ; cho phep ngat GLOBAL, ngat TIMER0
MOVWF INTCON
MOVLW B'00000111' ; che do chia 256 , tuc la 256 ckm thi timer0 dem len 1
MOVWF OPTION_REG ; nap vao OPTION, timer0 bat dau chay
BANKSEL PORTB
CLRF PORTB
MOVLW .20 ; viec tang giam thoi gian la do gia tri nap trong COUNT
MOVWF COUNT
GOTO $ ; cho ngat o day
NGAT
BTFSS INTCON,T0IF ; Kiem tra xem co phai ngat xay ra la ngat timer_0 hay khong
GOTO THOAT_NGAT ; khong phai ngat timer_0 thi thoat
BCF INTCON,7 ; ko cho phep ngat nao xay ra nua
; ko can thiet vi khi ngat xay ra, c.trinh tu dong
; xoa bit GIE ( ngat toan cuc).
DECFSZ COUNT,1 ; giam COUNT de duoc 20 lan ngat
GOTO THOAT_NGAT ; chua du thi thoat
MOVLW .20
MOVWF COUNT
;########## doan c.trinh set / clear RB0.############
BTFSS PORTB,0
GOTO SET_RB0
CLR_RB0
BCF PORTB,0
GOTO THOAT_NGAT
SET_RB0
BSF PORTB,0
;######### ket thuc doan c.trinh set / clear RB0 ###########
THOAT_NGAT
MOVLW .56 ; nap lai gia tri ban dau cho timer 0
MOVWF TMR0
BCF INTCON,2 ; xoa co tran timer 0 (cung la co bao ngat)
; phai xoa co nay de co ngat tiep theo xay ra
RETFIE ; lenh nay cung set bit GIE ( ngat toan cuc).
END
_CHỗ kiểm tra ngắt xem có phải là ngắt timer 0 hay ko?? Tại sao phải kiểm tra và bit T0IF là bit gì (trong datasheet em thấy trong thanh ghi INTCON, chỉ có bit INT0IF (bit 1) là cờ của ngắt ngoài RB0, ko bik INT0IF có phải là nó T0IF hay ko? Và nếu là nó thì liên quan gì tới ngắt timer 0, vì em nghĩ là cờ ngắt timer phải là TMR0IF (bit 2). Anh chị giải thích dùm em chỗ đếm và ngắt nha. Còn biến count , theo như code là để nạp số lần ngắt, ngắt đủ 20 lần rồi mới đổi trạng thái PB.0. Cho em hỏi là tại sao cần phải có count? Có phải là để tăng thời gian giữa 2 lần Pb.0 sáng/tắt
TITLE " nhap nhay rb0_dung timer0 "
PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC &_LVP_OFF &_CPD_OFF &_BODEN_OFF
;============phan dat bien=============================
COUNT EQU 0X23
;===========Phan chuong trình chính======================
ORG 0x00
GOTO MAIN
ORG 0X04 ; dia chi vector ngat, tat ca ngat chi co dia chi nay
GOTO NGAT
ORG 0x0005
MAIN
MOVLW .56 ; nap 56 vao de timer0 dem dc 200 lan thi tran
MOVWF TMR0
BANKSEL TRISB
CLRF TRISB
MOVLW B'10100000' ; cho phep ngat GLOBAL, ngat TIMER0
MOVWF INTCON
MOVLW B'00000111' ; che do chia 256 , tuc la 256 ckm thi timer0 dem len 1
MOVWF OPTION_REG ; nap vao OPTION, timer0 bat dau chay
BANKSEL PORTB
CLRF PORTB
MOVLW .20 ; viec tang giam thoi gian la do gia tri nap trong COUNT
MOVWF COUNT
GOTO $ ; cho ngat o day
NGAT
BTFSS INTCON,T0IF ; Kiem tra xem co phai ngat xay ra la ngat timer_0 hay khong
GOTO THOAT_NGAT ; khong phai ngat timer_0 thi thoat
BCF INTCON,7 ; ko cho phep ngat nao xay ra nua
; ko can thiet vi khi ngat xay ra, c.trinh tu dong
; xoa bit GIE ( ngat toan cuc).
DECFSZ COUNT,1 ; giam COUNT de duoc 20 lan ngat
GOTO THOAT_NGAT ; chua du thi thoat
MOVLW .20
MOVWF COUNT
;########## doan c.trinh set / clear RB0.############
BTFSS PORTB,0
GOTO SET_RB0
CLR_RB0
BCF PORTB,0
GOTO THOAT_NGAT
SET_RB0
BSF PORTB,0
;######### ket thuc doan c.trinh set / clear RB0 ###########
THOAT_NGAT
MOVLW .56 ; nap lai gia tri ban dau cho timer 0
MOVWF TMR0
BCF INTCON,2 ; xoa co tran timer 0 (cung la co bao ngat)
; phai xoa co nay de co ngat tiep theo xay ra
RETFIE ; lenh nay cung set bit GIE ( ngat toan cuc).
END
_CHỗ kiểm tra ngắt xem có phải là ngắt timer 0 hay ko?? Tại sao phải kiểm tra và bit T0IF là bit gì (trong datasheet em thấy trong thanh ghi INTCON, chỉ có bit INT0IF (bit 1) là cờ của ngắt ngoài RB0, ko bik INT0IF có phải là nó T0IF hay ko? Và nếu là nó thì liên quan gì tới ngắt timer 0, vì em nghĩ là cờ ngắt timer phải là TMR0IF (bit 2). Anh chị giải thích dùm em chỗ đếm và ngắt nha. Còn biến count , theo như code là để nạp số lần ngắt, ngắt đủ 20 lần rồi mới đổi trạng thái PB.0. Cho em hỏi là tại sao cần phải có count? Có phải là để tăng thời gian giữa 2 lần Pb.0 sáng/tắt