Xin hỏi về ngắt timer của pic16f877a

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • cancel
    Nhập môn đệ tử
    • Jul 2008
    • 3

    #1

    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
    Last edited by namqn; 10-07-2009, 05:07 PM. Lý do: định dạng code
  • phandinh
    Đệ tử 6 túi
    • Nov 2008
    • 131

    #2
    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
    Last edited by phandinh; 12-07-2009, 10:38 AM. Lý do: dinh dang lai code

    Comment

    • cancel
      Nhập môn đệ tử
      • Jul 2008
      • 3

      #3
      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!

      Comment

      • vinhlec4
        Banned
        • Dec 2009
        • 65

        #4
        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?

        Comment

        • thangkho89
          Nhập môn đệ tử
          • Feb 2010
          • 7

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

          Comment

          • DSP
            Đệ tử 1 túi
            • Dec 2008
            • 17

            #6
            Nguyên văn bởi vinhlec4 View Post
            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õ.

            Comment

            Working...