PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   lỗi ngắt timer0 (http://www.picvietnam.com/forum/showthread.php?t=9942)

thiengiang 01-07-2011 05:49 PM

lỗi ngắt timer0
 
1 Attachment(s)
chào mọi người hiện giờ mình đang bắt đầu học pic nhưng bị lỗi mong các đàn anh giúp đỡ.
em viết một chương trình đếm đơn giản từ 0->99.
mà tại sao khi em gọi trong hàm delay nếu cho "d'50'" thì mạch chạy đúng nhưng khi cho những giá trị khác thì lại sai.
mong các đàn anh giúp đỡ


Đây là code của em

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

INCF HANGDONVI,1
MOVLW 0x0A
XORWF HANGDONVI,0
BTFSS STATUS,Z
GOTO exit_int
CLRF HANGDONVI
INCF HANGCHUC,1
MOVLW 0x0A
XORWF HANGCHUC,0
BTFSS STATUS,Z
GOTO exit_int
CLRF HANGCHUC
GOTO exit_int
;----------------------------
;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 b'11111100'
MOVWF TRISB
BCF STATUS,RP0
CLRF PORTD
MOVLW b'00000011'
MOVWF PORTB
; KHOI TAO TIME0
CLRF TMR0
CLRF INTCON
BSF STATUS,RP0
MOVLW b'10000001'
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 d'60'
MOVWF COUNT1
d2 MOVLW 0xC7
MOVWF COUNTA
MOVLW 0x01
MOVWF COUNTB
delay_1
DECFSZ COUNTA,1
GOTO $+2
DECFSZ COUNTB,1
GOTO delay_1
DECFSZ COUNT1,1
GOTO d2
RETURN
END ; c

thiengiang 02-07-2011 03:57 PM

có anh em nào giúp đỡ với đang bí quá

danghien719 02-07-2011 05:18 PM

Hic, code ASM thì mình ko code.
Nhưng mình góp ý nếu 50 mà chạy được, tức là code tạm ổn.
Nhưng tại sao giá trị khác ko đc, thì bạn nên xem lại ?
Ở đây cái gì ko chạy đc ? LEd bị nháy hay là phần mềm ko chạy ?
Thân.

thiengiang 03-07-2011 12:24 AM

cảm ơn bạn. code nếu thay bằng giá trị khác thì nó nhảy lung tung. hàng đơn vị thì nhảy đúng nhưng hàng chục thì nhảy 2,4,6,8,1,3,5,7,9..... đại loại là nhảy lung tung cái hàng chục. còn nếu đặt "d'50' thì nhảy đúng nhưng bị nháy do giá trị d lớn nên thời gian delay lớn led bị nháy. không liên tục.

tdm 03-07-2011 11:47 AM

Trích:

Nguyên văn bởi thiengiang (Post 46568)
cảm ơn bạn. code nếu thay bằng giá trị khác thì nó nhảy lung tung. hàng đơn vị thì nhảy đúng nhưng hàng chục thì nhảy 2,4,6,8,1,3,5,7,9..... đại loại là nhảy lung tung cái hàng chục. còn nếu đặt "d'50' thì nhảy đúng nhưng bị nháy do giá trị d lớn nên thời gian delay lớn led bị nháy. không liên tục.

Thời gian delay > thời gian time0 tràn.
khắc phục:MOVLW b'10000111' ;PS2:PS0: Prescaler Rate Select bits =1:256
MOVWF OPTION_REG

tdm 03-07-2011 12:05 PM

Trích:

Nguyên văn bởi thiengiang (Post 46568)
cảm ơn bạn. code nếu thay bằng giá trị khác thì nó nhảy lung tung. hàng đơn vị thì nhảy đúng nhưng hàng chục thì nhảy 2,4,6,8,1,3,5,7,9..... đại loại là nhảy lung tung cái hàng chục. còn nếu đặt "d'50' thì nhảy đúng nhưng bị nháy do giá trị d lớn nên thời gian delay lớn led bị nháy. không liên tục.

để tăng giảm tốc độ đếm thỉ sử lí trong ngắt (bạn làm theo cách sau led không bao giờ bị nhá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_int
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


thiengiang 04-07-2011 12:28 AM

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


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 đỡ.

tdm 04-07-2011 01:46 PM

Trích:

Nguyên văn bởi thiengiang (Post 46597)
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


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.

thiengiang 04-07-2011 04:18 PM

Vậy cảm ơn DTM nhiều. Bạn có thể cho mình mail của bạn được ko để có gì khó khăn trong quá trình mình tự học pic này nhờ bạn giúp được ko. Cảm ơn Bạn một lần nữa

phatcddt08a 04-07-2011 06:50 PM

1 Attachment(s)
Lâu rồi không viết bắng asm hồi mới đầu học toàn viết bang asm bây giờ mình toàn viết c .nhưng mà lục lại lúc trước viết bang asm về timer0 này .bạn THỬ XEM có giúp dc gj không nhé


Múi giờ GMT. Hiện tại là 10:49 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam