PDA

View Full Version : Xin giúp đỡ về TMR0 trong PIC16F877A


kigisun
13-03-2010, 09:37 PM
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:

;=================================================
; 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:

;=================================================
; 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ỉ