PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   MPASM (http://www.picvietnam.com/forum/forumdisplay.php?f=34)
-   -   Xin hỏi về ngắt timer của pic16f877a (http://www.picvietnam.com/forum/showthread.php?t=4451)

cancel 10-07-2009 05:45 PM

Xin hỏi về ngắt timer của pic16f877a
 
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
Code:

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

        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

timer0
 
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

Trích:

Nguyên văn bởi vinhlec4 (Post 35618)
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õ.


Múi giờ GMT. Hiện tại là 04:21 PM.

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