我研究這個程式2-3天了,我是利用PC透過HIN232跟PIC通訊的
<<當PIC接收到45(45是由PC傳給PIC)時,PIC傳資料(1,2,3,4,5,6,7,8)給PC>>
這個沒問題,,可是問題來了
PC傳出資料---45(傳了6次,正確率較低)
PC接收資料---1 2 3 4 5 6 7 8 ---第一筆
1 2 3 4 5 6 FF ---第二筆(怎麼會傳出FF,而且還傳一個BYTE問題一)
1 2 3 4 5 6 7 8 ---第三筆
1 2 ---第四筆(這個跟問題一很類似,少了更多BYTE)
--第五筆, 這裡是空的,(這是問題2)
1 2 3 FC ---第六筆
PC傳出資料---45,45,45,45,45,45,45,45(傳了6次,正確率較高)
PC接收資料---1 2 3 4 5 6 7 F8 ---1
1 2 3 4 5 6 7 8 ---2
1 2 3 4 E5 ---3
1 2 3 4 5 6 7 8 ---4
1 2 3 4 5 6 7 8 ---5
1 2 3 4 5 6 7 8 ---6
我猜想是 TXEN的控制有問題...可是找不出哪裡有問題
再則是程式的架構需要調整...
********麻煩熱心先進,幫我度過難關*******
********麻煩熱心先進,幫我度過難關*******
********麻煩熱心先進,幫我度過難關*******
list p=16F873A, f=INHX8M, r=DEC, b=8, C=80
#include <p16F873A.inc> ; Include file locate at defult directory
START_CODE EQU 0X30
DATA1 EQU 0X31
DATA2 EQU 0X32
DATA3 EQU 0X33
DATA4 EQU 0X34
CHECKSUM EQU 0X35
END_CODE EQU 0X36
FREE EQU 0X37
W_TEMP EQU 0X40
STATUS_TEMP EQU 0X41
CON EQU 0X42
CON1 EQU 0X43
RC_REG EQU 0X44
STEP1_FLAG EQU 0X00
STEP2_FLAG EQU 0X01
STEP3_FLAG EQU 0X02
STEP4_FLAG EQU 0X03
STEP5_FLAG EQU 0X04
STEP6_FLAG EQU 0X05
STEP7_FLAG EQU 0X06
STEP8_FLAG EQU 0X07
STEP9_FLAG EQU 0X00
STEP0_FLAG EQU 0X01
ORG 0X00
GOTO MAIN_C
ORG 0X04
GOTO INT_MAIN
ORG 0X10
MAIN_C BSF STATUS,RP0
MOVLW 0X80
MOVWF TRISC
MOVLW 0X00
MOVWF TRISB
MOVLW 0X20
MOVWF TXSTA
MOVLW 0X19
MOVWF SPBRG
MOVLW 0X20
MOVWF PIE1
BCF STATUS,RP0
MOVLW 0X90
MOVWF RCSTA
MOVLW 0XC0
MOVWF INTCON
MAIN MOVLW 0XFF
MOVWF PORTB
BCF STATUS,RP0
BSF RCSTA,CREN
MOVLW 0X45
XORWF RC_REG
BTFSC STATUS,Z
GOTO MAIN_RUN
BSF STATUS,RP0
BCF TXSTA,TXEN
BCF STATUS,RP0
CLRF RC_REG
GOTO MAIN
MAIN_RUN
BCF STATUS,RP0
BCF RCSTA,CREN
CLRF RC_REG
MOVLW 0X01
MOVWF START_CODE
MOVLW 0X02
MOVWF DATA1
MOVLW 0X03
MOVWF DATA2
MOVLW 0X04
MOVWF DATA3
MOVLW 0X05
MOVWF DATA4
MOVLW 0X06
MOVWF CHECKSUM
MOVLW 0X07
MOVWF END_CODE
MOVLW 0X08
MOVWF FREE
MOVLW 0X2F
MOVWF FSR
PUSH_DATA
INCF FSR
BTFSC FSR,3
GOTO CLEAR
GOTO ADD_FSR
CLEAR BSF STATUS,RP0
BCF TXSTA,TXEN
BCF STATUS,RP0
GOTO MAIN
ADD_FSR
BSF STATUS,RP0
BSF TXSTA,TXEN
BCF STATUS,RP0
MOVFW INDF
MOVWF TXREG
WAIT_DATA
BCF STATUS,RP0
BTFSS PIR1,TXIF
GOTO WAIT_DATA
BSF STATUS,RP0
BTFSS TXSTA,TRMT
GOTO WAIT_DATA
BSF STATUS,RP0
BCF TXSTA,TXEN
BCF STATUS,RP0
GOTO PUSH_DATA
INT_MAIN
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP
BTFSC PIR1,RCIF
GOTO GET_DATA
INT_RET
BCF STATUS,RP0
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
GET_DATA
BCF STATUS,RP0
BTFSC RCSTA,OERR
GOTO OVERRUN_ERR
BTFSC RCSTA,FERR
GOTO DATA_ERROR
MOVFW RCREG
MOVWF RC_REG
BCF STATUS,RP0
BTFSC PIR1,RCIF
GOTO GET_DATA
GOTO INT_RET
OVERRUN_ERR
BCF STATUS,RP0
BCF RCSTA,CREN
MOVFW RCREG
MOVWF RC_REG
BSF STATUS,RP0
BCF TXSTA,TXEN
BCF STATUS,RP0
GOTO INT_RET
DATA_ERROR
BCF STATUS,RP0
BCF RCSTA,CREN
MOVWF RCREG
MOVWF RC_REG
BSF STATUS,RP0
BCF TXSTA,TXEN
BCF STATUS,RP0
GOTO INT_RET
END