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