Mình thử viết một chương trình chớp tắt led đơn giản, sử dụng ngắt timer1. Chương trình như sau :
Code:
processor 16f877a ;vi dieu khien duoc su dung la PIC16F877A cua Microchip
include <p16f877a.inc> ;header file kem theo
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;===================================================================================================
;NHOM CAC THANH GHI TRONG CHUONG TRINH NGAT
W_save EQU 0x20
PCLATH_save EQU 0x21
STATUS_save EQU 0x22
FSR_save EQU 0x23
DEM EQU 0X24
count1 EQU 0x25
counta EQU 0x26
countb EQU 0x27
;===================================================================================================
ORG 0X004
GOTO ISR
ISR
;===================================================================================================
;DOAN CHUONG TRINH BAT BUOC KHI VAO NGAT
MOVWF W_save
SWAPF STATUS_save,W
CLRF STATUS
MOVWF STATUS_save
MOVF PCLATH,W
MOVWF PCLATH_save
CLRF PCLATH
MOVF FSR,W
MOVWF FSR_save
;===================================================================================================
;CHUONG TRINH CHINH CUA NGAT
;===================================================================================================
BTFSS PIR1,TMR1IF
GOTO exit_int
BCF PIR1,TMR1IF
BCF T1CON,TMR1ON
CLRF T1CON
CLRF TMR1L
CLRF TMR1H
MOVLW 0X00
MOVWF T1CON
MOVLW 0XC3
MOVWF TMR1H
MOVLW 0X50
MOVWF TMR1L
BSF T1CON,TMR1ON
DECFSZ DEM,1
GOTO exit_int
COMF PORTB,1
MOVLW D'100'
MOVWF DEM
GOTO exit_int
;===================================================================================================
;DOAN CHUONG TRINH BAT BUOC KHI KET THUC CHUONG TRINH NGAT
exit_int
MOVF FSR_save,W
MOVWF FSR
MOVF PCLATH_save
MOVWF PCLATH
SWAPF STATUS_save,W
MOVWF STATUS
SWAPF W_save,1
SWAPF W_save,0
RETFIE
ORG 0X0000
GOTO start
ORG 0X050
;=================================================================================================
;CHUONG TRINH CHINH
;=================================================================================================
start
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW 0X00
MOVWF TRISB
BCF STATUS,RP0
MOVLW D'100'
MOVWF DEM
;------------------------------------------------------------------------------------------------
;KHOI TAO TIMER 1
;------------------------------------------------------------------------------------------------
CLRF T1CON
CLRF INTCON
CLRF TMR1H
CLRF TMR1L
BSF STATUS,RP0
CLRF PIE1
BSF PIE1,TMR1IE
BCF STATUS,RP0
CLRF PIR1
MOVLW 0X00
MOVWF T1CON
MOVLW 0XC3
MOVWF TMR1H
MOVLW 0X50
MOVWF TMR1L
BSF T1CON,TMR1ON
BSF INTCON,TMR1IE
BSF INTCON,PEIE
BSF INTCON,GIE
BSF PIR1,TMR1IF
MOVLW B'00000011'
MOVWF PORTC
MOVLW B'11111111'
MOVWF PORTB
GOTO $
delay20
MOVLW d'10' ;nap 20 cho count1 de tao tre 20ms
MOVWF count1
lap1
MOVLW d'199'
MOVWF counta
MOVLW d'1'
MOVWF countb
delay1
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay1
DECFSZ count1,1
GOTO lap1 ;het doan chuong trinh delay 100ms
RETURN
END
Kết quả là nó chạy được. Thế nhưng, mình thử rút dây nguồn ra, rồi cấm vào lại thì lúc chạy được, lúc ko chạy được (không chạy được nhưng led vẫn sáng mà ko nhấp nháy theo ý muốn). Vậy là sao ta?
To Jerry : mình đã thử không dùng lệnh xóa và đặt bit TMR1ON nhưng chương trình ko chạy được.
Cho mình hỏi cách khai báo sử dụng cùng một lúc timer0 và timer1 và ngắt của chúng như thế nào? (mình khai báo như bình thường nhưng ko chạy được)
Xin cảm ơn.