PDA

View Full Version : Lỗi do lập trình hay do trình biên dịch ?


lythanhthuan
02-10-2006, 03:06 PM
Tại sao khi viết chương trình ngắt trong MPLAB (7.31) mặc dù đã theo đúng khung chương trình ngắt do bác falleaf giới thiệu nhưng chưong trình vẫn bị Faile(Lỗi).
Cụ thể là viết chương trình như sau :



PROCESSOR PIC16F877
INCLUDE <P16F877.INC>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _LVP_OFF & _CPD_OFF

DATAOUT EQU 0x20
W_save EQU 0x21
PCLATH_SAVE EQU 0X22
STATUS_SAVE EQU 0X23
FSR_SAVE EQU 0X24

ORG 0x0000
GOTO batdau

ORG 0x004 ;<<=======================(thay bởi 0x005 thì thành công)
GOTO ISR_NGAT
ISR_NGAT
MOVWF W_save
MOVWF STATUS_SAVE
MOVF PCLATH,W
CLRF PCLATH
MOVF FSR,W
MOVWF FSR_SAVE


BTFSS PIR1,PSPIF

GOTO thoat


BCF PIR1,PSPIF

BSF STATUS,RP0
BTFSC TRISE,OBF

GOTO thoat


BCF STATUS,RP0
MOVF DATAOUT,0
MOVWF PORTD
thoat
BCF STATUS,RP0
MOVF FSR_SAVE
MOVWF FSR
MOVF PCLATH_SAVE
MOVWF PCLATH
SWAPF STATUS_SAVE,W

MOVWF STATUS
SWAPF W_save,1
SWAPF W_save,0
RETFIE


ORG 0x000
CLRF STATUS
CLRF PCLATH

GOTO batdau


ORG 0x050
batdau
BCF STATUS,RP1
BCF STATUS,RP0
CLRF PORTD
BSF STATUS,RP0

MOVLW B'00010111'

MOVWF TRISE
MOVLW 0x006
MOVWF ADCON1

BSF PIE1,PSPIE

BCF STATUS,RP0
BSF INTCON,GIE
BSF INTCON,PEIE

MOVLW b'01010101'
MOVWF DATAOUT
MOVF PORTD

GOTO $

END


Nếu dòng ORG 0x004 (ở đầu chương trình ngắt) ta thay 0x004 bởi 0x005 thì trình dịch báo sucess.
Phiền các bạn giải thích hộ ?
Thanks !

Jerry
02-10-2006, 05:17 PM
Lỗi báo như thế nào? Bạn phải post dòng thông báo lỗi lên thì mới trả lời cụ thể được

bien_van_khat
02-10-2006, 05:33 PM
Chỉ thấy bạn có 1 cái sai là lặp 2 lần "org 0x00", bỏ cái bên dưới là ok.
Bạn cũng không cần đặt thêm cái org 0x50 làm chi, bây giờ thì chưa sai, nhưng rất dễ sai.

Không hiểu = cách nào mà bạn dịch được cho dù đổi thành org 0x05.

Bạn nên coi lại tut xem chỉ thị org nghĩa là gì.

Jerry
02-10-2006, 05:33 PM
Nếu bạn viết đúng như đoạn chương trình trên đây thì mình tìm thêm được vài lỗi nữa của bạn. Bạn viết là :
ISR_NGAT
MOVWF W_save
MOVWF STATUS_SAVE
MOVF PCLATH,W
CLRF PCLATH
MOVF FSR,W
MOVWF FSR_SAVE
.....
Phải sửa lại là :
ISR_NGAT:
MOVWF W_save ; Save WREG
MOVF STATUS,W ; Save STATUS
CLRF STATUS
MOVWF STATUS_SAVE
MOVF PCLATH, W
MOVWF PCLATH_SAVE
MOVF FSR, W
MOVWF FSR_SAVE


........
Thoat:
CLRF STATUS
MOVF FSR_SAVE, W
MOVWF FSR
MOVF PCLATH_SAVE, W
MOVWF PCLATH
MOVF STATUS_SAVE, W
MOVWF STATUS
SWAPF W_save, F
SWAPF W_save, W
RETFIE