PDA

View Full Version : Xin hỏi về ngắt timer của pic16f877a


cancel
10-07-2009, 05:45 PM
Mấy ngày nay em trầy trật hoài với cái ngắt timer trong pic. Em không biết là mình cho chạy timer bằng cách nào? (timer0) (trong C có hàm set_timer0()). Trong chương trình phục vụ ngắt mình có dừng timer lại như trong 8051 không?
Đoạn code này em đánh dựa trên hướng dẫn của mấy bài trên diễn đàn. Lúc đầu led sáng số 0, rồi tăng dần khi timer tràn. Trong code em chưa tính thời gian tràn( cho nó nhảy trước rồi tính toán sau), và sau mấy ngày kiếm cách set_timer0() bằng ASM chương trình này chắp vá lung tung rồi. Em mong các tiền bối cảm phiền chỉ dùm em LÀM SAO CHO TIMER0 chạy?
;xuat ra port D
;a la MSB noi voi PD.7
TITLE "TIMER0"
PROCESSOR P16F877A
INCLUDE <P16F877A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF & _LVP_OFF & _CPD_OFF

ORG 0x020
V_DONVI EQU 0x20
VDEM EQU 0x25
PCLATH_save EQU 0x26
W_save EQU 0x27
STATUS_save EQU 0x28
FSR_save EQU 0x29

ORG 0x0000
GOTO MAIN
ORG 0x0004
GOTO ISR_TMR0

ORG 0x0005
MAIN
;dat cau hinh xuat nhap
;----------------------------------------------
BCF STATUS,RP1
BSF STATUS,RP0 ; chon BANK1

MOVLW 0x00
MOVWF TRISD
MOVLW b'11111100'
MOVWF TRISB ;



;----------------------------------------------
BCF STATUS,RP0 ; chon BANK0
movlw 0xff
movfw VDEM
movlw 0x00
movwf V_DONVI
call HIENTHI

CLRF TMR0
CLRF INTCON
BSF STATUS,RP0
MOVWF OPTION_REG

BCF STATUS,RP0
BSF INTCON,TMR0IE
BSF INTCON,GIE

goto $
;END MAIN
;--------------------------------------------------
;chuong trinh phuc vu ngat cua timer 0
;--------------------------------------------------
ISR_TMR0
;doan chuong trinh bat buoc khi di vao ngat
MOVWF W_save
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_save
MOVF PCLATH,W
MOVWF PCLATH_save
CLRF PCLATH
MOVF FSR,W
MOVWF FSR_save

BTFSS INTCON,TMR0IF
GOTO EXIT1

BCF INTCON,TMR0IF
;---------------------------------------------------
decfsz VDEM,f
goto EXIT1
movlw 0xff
movfw VDEM
banksel V_DONVI
incf V_DONVI,f
call HIENTHI
EXIT1
;------------------------------------------
MOVF FSR_save,W
MOVWF FSR
MOVF PCLATH_save,W
MOVWF PCLATH
SWAPF STATUS_save,W
MOVWF STATUS
SWAPF W_save,1
SWAPF W_save,0
RETFIE
;---------------------------------------------------
;chuong trinh con hien thi
;---------------------------------------------------
HIENTHI

banksel V_DONVI
movwf V_DONVI
movfw V_DONVI
call TABLE
banksel PORTD
movwf PORTD

RETURN
;---------------------------------------------------
;Xay dung bang
;---------------------------------------------------
ORG 0x80
TABLE
addwf PCL,F
retlw 0x03 ;so 0
retlw 0x9f ;so 1
retlw 0x25 ;so 2
retlw 0x0d ;so 3
retlw 0x99 ;so 4
retlw 0x49 ;so 5
retlw 0x41 ;so 6
retlw 0x1f ;so 7
retlw 0x01 ;so 8
retlw 0x09 ;so 9
END

phandinh
12-07-2009, 11:29 AM
Khi bạn nạp 1 giá tri vào thanh ghi OPTION_REG thì timer0 bắt đầu chạy, bạn không thể kiếm soát việc Start, Stop của nó được. Nói chính xác là timer0 chạy song song với chương trình.
Đây là bài đơn giản tôi viết để test ngắt Timer0, hy vọng giúp ích cho bạn

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 xe 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

cancel
24-07-2009, 05:29 PM
thankiều sư huynh phandinh. Tui đã làm lại theo hướng dẫn của sư huynh và kết quả là chạy ngon lành!

vinhlec4
02-05-2010, 10:22 AM
cho e hoi may huynh ty. sao vd tren khong thấy mấy a chon bank? e thấy các vd khac diều chon bank truoc khi thao tac lệnh TRISA.....doi voi pic 18f4331 co nhiều bank thế thì nen chon sau a?

thangkho89
03-05-2010, 07:43 PM
em dang lam bai tap lon ve dong ho dem thoi gian thuc dung pic 16f877a lap trinh bang asm
em nghien cuu mai ma khong hieu timer1
bac nao hieu chi e voi
cam on cac bac nhieu

DSP
14-05-2010, 11:41 PM
cho e hoi may huynh ty. sao vd tren khong thấy mấy a chon bank? e thấy các vd khac diều chon bank truoc khi thao tac lệnh TRISA.....doi voi pic 18f4331 co nhiều bank thế thì nen chon sau a?

tất nhiên khi truy cập và xử lý các thanh ghi, bạn phải dùng lệnh chọn bank chứa các thanh ghi đó.
chẳng hạn với pic16:
-có thể dùng lệnh banksel thanhghi, để truy cập trực tiếp vào vùng bank chứa thanh ghi đó
-có thể thao tác với 2 bit rp0, rp1 của thanh ghi STATUS để chọn bank. bạn xem datasheet sẽ rõ.