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