RCIF 标志未设置
RCIF Flag Not Setting
我试图在两个 PIC16F690 之间发送数据,但遇到了问题。其中一个 PIC 的 TX 引脚连接到另一个的 RX 引脚,该 PIC 的 TX 引脚连接到 HC05 蓝牙发射器。发送到接收 PIC 的数据还必须显示在一组共阴极七段显示器上。
目前我的代码适用于传输 PIC,我已经使用该 PIC 上的 HC05 检查了这一点。问题是数据在接收 PIC 上只有 "received" 一次,而 PIC(根据输出)表示数据的值为 0。
这已经过测试,将十进制值 7 从一个 PIC 连续发送到另一个,因此使用了 CREN,但 RCIF 标志仅被设置 once.After 它保持清晰并且在任何时候都不是该值在 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的发送功能与这一张相同,同样是9600的波特率
您 posted 的代码片段没有显示在读取或写入 PIC16F690 中的特殊功能寄存器时正确使用存储区选择。
不正确的银行选择似乎是您的代码的问题,但如果不查看整个项目就无法确定。 (请不要 post 您的完整代码并要求审核)
要知道特殊功能寄存器在哪个组中,请参阅 PIC16F690 数据中的此页 sheet:
我试图在两个 PIC16F690 之间发送数据,但遇到了问题。其中一个 PIC 的 TX 引脚连接到另一个的 RX 引脚,该 PIC 的 TX 引脚连接到 HC05 蓝牙发射器。发送到接收 PIC 的数据还必须显示在一组共阴极七段显示器上。
目前我的代码适用于传输 PIC,我已经使用该 PIC 上的 HC05 检查了这一点。问题是数据在接收 PIC 上只有 "received" 一次,而 PIC(根据输出)表示数据的值为 0。
这已经过测试,将十进制值 7 从一个 PIC 连续发送到另一个,因此使用了 CREN,但 RCIF 标志仅被设置 once.After 它保持清晰并且在任何时候都不是该值在 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的发送功能与这一张相同,同样是9600的波特率
您 posted 的代码片段没有显示在读取或写入 PIC16F690 中的特殊功能寄存器时正确使用存储区选择。
不正确的银行选择似乎是您的代码的问题,但如果不查看整个项目就无法确定。 (请不要 post 您的完整代码并要求审核)
要知道特殊功能寄存器在哪个组中,请参阅 PIC16F690 数据中的此页 sheet: