我正在尝试在两个PIC16F690之间发送数据,并且遇到了麻烦。其中一个PIC的TX引脚连接到另一个PIC的RX引脚,该PIC的TX引脚连接到HC05蓝牙发送器。然后,还必须在一组共阴极七段显示器上显示发送到接收PIC的数据。
当前,我的代码适用于发送PIC,并且已经使用该PIC上的HC05进行了检查。问题在于,仅在接收PIC上一次“接收”了数据,而PIC(根据输出)说数据的值为0。
经过测试,它将十进制值7从一个PIC连续发送到另一个PIC,因此使用了CREN,但是RCIF标志只被设置了一次,此后它仍然很清晰,在RCREG中找不到任何值7
我已经在这个问题上待了3天了,这让我发疯,任何帮助将不胜感激。
关于接收PIC的设置代码:
MOVLW B'00100000'
MOVWF TRISB ;Setup PORTB with inputs for the RCIF
BSF OPTION_REG,PS0 ;Allow for Timer0 and Pull up resistors
BCF OPTION_REG,PSA
BCF OPTION_REG,7 ;Enable Pullups
;For data sending
CLRF PIE1
BCF TXSTA,TX9 ;Sends 8 bits when transmitting
BSF TXSTA,TXEN ;Enable the transmit function
BCF TXSTA,SYNC ;Working in Asynchronous Mode
BSF TXSTA,BRGH ;Enable the high baud rate generator
MOVLW B'11001' ;Calculated using (FOSC/BAUD*16)-1 (Assumed FOSC was 4M)
MOVWF SPBRG
BCF STATUS,RP0
BSF RCSTA,SPEN ;Enable serial pins at RB7 and RB5
BCF RCSTA,RX9
BCF RCSTA,SREN ;In UART mode, doesnt care
BSF RCSTA,CREN ;Constant Reception
BCF RCSTA,FERR ;Framing error bit
BCF RCSTA,RX9D ;Disable checking for 9th bit
MOVFW RCREG ;Clears receiving register to clear RCIF
CLRF TXREG
BCF PIE1,TMR2IE ;Disable Timer2
BSF PIE1,RCIE ;Permanently enabled
BSF INTCON, T0IE ;Enable Timer Interrupt
BSF INTCON, PEIE ;Enable the peripheral interrupt variable
BSF INTCON, GIE ;Enable the Global Interrupt variable
然后根据发送数据:
BANKSEL PORTB
MOVLW B'00110000' ;30 in HEX equals 0 in ASCII
ADDWF UNITS,W
CALL SEND_DATA
RETURN
SEND_DATA:
TX_WAIT:
BTFSS PIR1,TXIF
GOTO TX_WAIT
MOVWF TXREG ;load data to be sent...
RETURN
在接收数据方面:
GET_DATA:
MOVFW RCREG
MOVWF UNITS
CALL TRANSMIT
RETURN
关于中断: INTER_PORTS :;中断例程
BTFSC INTCON,T0IF ;If timer overflow bit set, go to timer interrupt
CALL INTER_TOVF
BTFSC PIR1,RCIF
CALL GET_DATA
RETFIE
计时器用于更新七个分段显示。
我试图添加用于清除OERR和FERR错误的代码,但这并没有帮助,我最初将它们放在GET_DATA标题下,代码如下:
OVF_ERROR:
BCF RCSTA,CREN
MOVFW RCREG
MOVFW RCREG
BSF RCSTA,CREN
RETURN
FERR_ERROR:
MOVFW RCREG
BTFSC RCSTA,FERR
GOTO FERR_ERROR
RETURN
谢谢您的指导,这令人头疼,如果我能对所使用的代码提供任何清晰度,我会的。另一张PIC上的发送功能与此相同,其BAUD速率为9600。