Trích:
Nguyên văn bởi thiengiang
Cảm ơn bạn DTM nhiều.Mình đã làm chạy được rồi nhưng trong chương trình bạn viết mình có sửa lại một tí lúc đầu chạy theo code bạn sửa thì chỉ đếm được đến 10 thôi và không đếm lên tiếp được. sau đó mình có bỏ đoạn code bạn thêm vào chỉ giữ lại
MOVLW b'00000111'
MOVWF OPTION_REG
hai dòng code này thì mạch chạy đúng.
Vậy nếu như không bỏ những đoạn code kia của bạn
; CÁC THAO TÁC CHÍNH TRONG NGAT
DECFSZ dem,1
GOTO exit_int
và
MOVLW D'20';toc do dem
MOVWF dem
thì mình có cách nào để sửa code cho chay đúng ko. MÌnh cũng đã thử nhưng ko được.
Thứ hai là bạn nói "Thời gian delay > thời gian time0 tràn." Vậy làm thế nào để mình tránh được tình huống này. Có phải là mình phải đặt PS2:PS0 là "111" là tốt nhất ko.
Mong nhận được sự giúp đỡ từ DTM và các anh em khác.
Cảm ơn vì sự giúp đỡ.
|
coi lại code thì thấy sai cho này:
Code:
LIST P=16F877A
#INCLUDE P16F877A.INC
; khai bao bien
COUNT1 EQU 0x20
COUNTA EQU 0x21
COUNTB EQU 0x22
HANGCHUC EQU 0x23
HANGDONVI EQU 0x24
W_SAVE EQU 0x25
PCLATH_save EQU 0x26
STATUS_save EQU 0x27
FSR_SAVE EQU 0x28
dem EQU 0x29
ORG 0x004
GOTO ISR
ISR ;CHUONG TRINH 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 exit_int
BCF INTCON,TMR0IF
;------------------------------------------------
; CÁC THAO TÁC CHÍNH TRONG NGAT
DECFSZ dem,1
GOTO exit_int
;******************************
INCF HANGDONVI,1
MOVLW 0x0A
XORWF HANGDONVI,0
BTFSS STATUS,Z
GOTO exit
CLRF HANGDONVI
INCF HANGCHUC,1
MOVLW 0x0A
XORWF HANGCHUC,0
BTFSS STATUS,Z
GOTO exit;sửa tại đây
CLRF HANGCHUC
GOTO exit
exit
MOVLW D'20';toc do dem
MOVWF dem
;----------------------------
;ket thuc ngat
exit_int
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 chinh
ORG 0x00
GOTO MAIN
ORG 0x050
MAIN
;khoi taoj port
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW 0x00
MOVWF TRISD
MOVLW 0x00
MOVWF TRISC
MOVLW b'11111100'
MOVWF TRISB
BCF STATUS,RP0
CLRF PORTD
MOVLW b'00000011'
MOVWF PORTB
MOVLW d'20'
MOVWF dem
MOVWF PORTC
; KHOI TAO TIME0
CLRF TMR0
CLRF INTCON
BSF STATUS,RP0
MOVLW b'00000111'
MOVWF OPTION_REG
BCF STATUS,RP0
BSF INTCON,TMR0IE
BSF INTCON,PEIE
BSF INTCON,GIE
;khoi tao bien
CLRF HANGCHUC
CLRF HANGDONVI
START
CALL HIENTHI
GOTO START
HIENTHI
MOVF HANGCHUC,0
CALL TABLE
MOVWF PORTD
MOVLW b'11111101'
MOVWF PORTB
CALL DELAY
CLRF PORTB
MOVF HANGDONVI,0
CALL TABLE
MOVWF PORTD
MOVLW b'11111110'
MOVWF PORTB
CALL DELAY
CLRF PORTB
RETURN
TABLE
ADDWF PCL,1
RETLW 0xC0
RETLW 0xF9
RETLW 0xA4
RETLW 0xB0
RETLW 0x99
RETLW 0x92
RETLW 0x82
RETLW 0xF8
RETLW 0x80
RETLW 0x90
DELAY
MOVLW 0xC7
MOVWF COUNTA
delay_1
DECFSZ COUNTA,1
GOTO delay_1
RETURN
END
bạn cứ làm theo như vậy là chạy thôi (thay đổi giá trị biến đếm để có tốc độ đếm mong muốn.)
hàm delay không cho quá lớn tránh để led hiển thị sẽ bị nháy.