PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   MPASM (http://www.picvietnam.com/forum/forumdisplay.php?f=34)
-   -   Xin giúp đỡ về TMR0 trong PIC16F877A (http://www.picvietnam.com/forum/showthread.php?t=5932)

kigisun 13-03-2010 09:37 PM

Xin giúp đỡ về TMR0 trong PIC16F877A
 
Mình mới vừa học PIC không lâu. Nhưng đụng đến TMR0 thì không hiểu sao chương trình chạy không như ý. Mình muốn làm mạch chớp tắt 8 LED qua giao tiếp với POTRB. Mình không hiểu sao đoạn code thứ nhất thì Proteus chạy đúng còn đoạn code thứ hai lại sai??? Xin các bạn giúp đỡ!!!

Code 1:

Code:

;=================================================
; Phan khoi tao PIC
#include <p16F877A.inc>
__CONFIG _WDT_OFF & _CP_OFF  & _PWRTE_ON  & _HS_OSC 
;=================================================

;=================================================
; Phan dinh nghia
#DEFINE LED1 PORTB,        7
#DEFINE LED2 PORTB,        6
#DEFINE LED3 PORTB,        5
#DEFINE LED4 PORTB,        4
#DEFINE LED5 PORTB,        3
#DEFINE LED6 PORTB,        2
#DEFINE LED7 PORTB,        1
#DEFINE LED8 PORTB,        0
;=================================================

;=================================================
; Phan khai bao cac bien
;-------------------------
; Bien nam o Bank 0
;-------------------------
        ORG        0x0A0
        W_SAVE RES        1
        STATUS_SAVE RES 1
        PCH_SAVE RES 1
        FSR_SAVE RES 1
        VARIABLE_A RES 1
;=================================================

;=================================================
;-------------------------------------------------
; Chuong trinh ngat
;-------------------------------------------------
        ORG 0x0004
;-------------------------------------------------
; Sao luu cac thanh ghi quan trong
;-------------------------------------------------
        MOVWF W_SAVE  ; W_SAVE = W
        SWAPF        STATUS,W
        CLRF STATUS
        MOVWF        STATUS_SAVE ; STATUS_SAVE = SWAP_NIBBLE(STATUS)

        MOVF PCLATH, W
        MOVWF        PCH_SAVE        ; PCH_SAVE = PCLATH
        CLRF        PCLATH        ; PCLATH = 0
        MOVF        FSR, W
        MOVWF        FSR_SAVE        ; FSR_SAVE= FSR

;-------------------------------------------------
;  Doan chuong trinh ngat bat dau tai day
;-------------------------------------------------
        BCF INTCON, TMR0IF  ; Xoa co ngat TMR0IF
        COMF LED1

;------------------------------------------------

;-------------------------------------------------
;  Ket thuc chuong trinh ngat
;-------------------------------------------------
END_INT
        MOVF FSR_SAVE, W
        MOVWF        FSR        ;FSR=FSR_SAVE
        MOVF        PCH_SAVE, W
        MOVWF        PCLATH        ;PCLATH = PCH_SAVE
        SWAPF        STATUS_SAVE, W
        MOVWF STATUS
        SWAPF W_SAVE, F
        SWAPF W_SAVE, W
        RETFIE
;=================================================


;=================================================
; Chuong trinh chinh
        ORG 0x0000
        GOTO MAIN

        ORG 0x0050
MAIN
        BSF STATUS, RP0
        BCF STATUS, RP1  ; BANK1
        CLRF TRISB
        BCF STATUS, RP0  ; BANK0
        CLRF PORTB
        ;----------------------------------------
        ; Khoi tao TIMER0
        ;----------------------------------------
        CLRF TMR0
        BSF STATUS, RP0  ; BANK1
        MOVLW b'00000001'  ; Tat chuc nang dien tro keo len coa PORTB
        MOVWF OPTION_REG  ; Chon xung dem la xung len
                                          ; Gan Prescaler cho TMR0
                                          ; Tan so chia 1:4
        BCF STATUS, RP0    ; BANK0
        CLRF INTCON
        BSF INTCON, TMR0IE  ; Cho phep ngat TMR0
        BSF INTCON, PEIE    ; Cho phep ngat ngoai vi
        BSF INTCON, GIE    ; Cho phep toan bo ngat

        BCF LED1
        GOTO $
END
;=================================================

Code 2:

Code:

;=================================================
; Phan khoi tao PIC
#include <p16F877A.inc>
__CONFIG _WDT_OFF & _CP_OFF  & _PWRTE_ON  & _HS_OSC 
;=================================================

;=================================================
; Phan dinh nghia
#DEFINE LED1 PORTB,        7
#DEFINE LED2 PORTB,        6
#DEFINE LED3 PORTB,        5
#DEFINE LED4 PORTB,        4
#DEFINE LED5 PORTB,        3
#DEFINE LED6 PORTB,        2
#DEFINE LED7 PORTB,        1
#DEFINE LED8 PORTB,        0
;=================================================

;=================================================
; Phan khai bao cac bien
;-------------------------
; Bien nam o Bank 0
;-------------------------
        ORG        0x0A0
        W_SAVE RES        1
        STATUS_SAVE RES 1
        PCH_SAVE RES 1
        FSR_SAVE RES 1
        VARIABLE_A RES 1
;=================================================

;=================================================
;-------------------------------------------------
; Chuong trinh ngat
;-------------------------------------------------
        ORG 0x0004
;-------------------------------------------------
; Sao luu cac thanh ghi quan trong
;-------------------------------------------------
        MOVWF W_SAVE  ; W_SAVE = W
        SWAPF        STATUS,W
        CLRF STATUS
        MOVWF        STATUS_SAVE ; STATUS_SAVE = SWAP_NIBBLE(STATUS)

        MOVF PCLATH, W
        MOVWF        PCH_SAVE        ; PCH_SAVE = PCLATH
        CLRF        PCLATH        ; PCLATH = 0
        MOVF        FSR, W
        MOVWF        FSR_SAVE        ; FSR_SAVE= FSR

;-------------------------------------------------
;  Doan chuong trinh ngat bat dau tai day
;-------------------------------------------------
        BCF INTCON, TMR0IF  ; Xoa co ngat TMR0IF

        MOVLW VARIABLE_A
        SUBLW 0xFF        ; Dao trang thai PORTB       
        BCF STATUS, RP0
        BCF STATUS, RP1  ; BANK0
        MOVWF PORTB  ; 0xFF - W -> W -> PORTB
;------------------------------------------------

;-------------------------------------------------
;  Ket thuc chuong trinh ngat
;-------------------------------------------------
END_INT
        MOVF FSR_SAVE, W
        MOVWF        FSR        ;FSR=FSR_SAVE
        MOVF        PCH_SAVE, W
        MOVWF        PCLATH        ;PCLATH = PCH_SAVE
        SWAPF        STATUS_SAVE, W
        MOVWF STATUS
        SWAPF W_SAVE, F
        SWAPF W_SAVE, W
        RETFIE
;=================================================


;=================================================
; Chuong trinh chinh
        ORG 0x0000
        GOTO MAIN

        ORG 0x0050
MAIN
        BSF STATUS, RP0
        BCF STATUS, RP1  ; BANK1
        CLRF TRISB
        BCF STATUS, RP0  ; BANK0
        CLRF PORTB
        ;----------------------------------------
        ; Khoi tao TIMER0
        ;----------------------------------------
        CLRF TMR0
        BSF STATUS, RP0  ; BANK1
        MOVLW b'00000001'  ; Tat chuc nang dien tro keo len coa PORTB
        MOVWF OPTION_REG  ; Chon xung dem la xung len
                                          ; Gan Prescaler cho TMR0
                                          ; Tan so chia 1:4
        BCF STATUS, RP0    ; BANK0
        CLRF INTCON
        BSF INTCON, TMR0IE  ; Cho phep ngat TMR0
        BSF INTCON, PEIE    ; Cho phep ngat ngoai vi
        BSF INTCON, GIE    ; Cho phep toan bo ngat


        MOVLW 0x00;
        MOVWF VARIABLE_A  ; Luu trang thai cac LED
        GOTO $
END
;=================================================


thundernhut 05-08-2010 03:54 PM

mình nghĩ ban nên để 1 lệnh goto ở địa chỉ ngắt để nó nhảy tới chương trình ngắt đặt dưới chương trình chinh thì đúng hơn
Bạn thử làm theo cách đó hay là chỗ bắt đầu chương trình chính bạn chọn số lớn hơn xem sao khoảng 100H nha coi chạy được không.

romantics892005 10-03-2011 04:15 PM

đoạn code 2 , ngắt TMR0 có cần bật ngắt ngoài PIE đâu nhỉ


Múi giờ GMT. Hiện tại là 10:48 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