Я пытаюсь отправить данные между двумя PIC16F690 и у меня возникли проблемы. Вывод TX одного из PIC подключен к выводу RX другого, а вывод TX этого PIC подключен к передатчику Bluetooth HC05. Затем данные, отправляемые на принимающий PIC, также должны отображаться на наборе из семи сегментов с общим катодом.
В настоящее время мой код работает для передающего PIC, и я проверил это с помощью HC05 на этом PIC. ,Проблема в том, что данные только «принимаются» один раз на принимающем PIC, и PIC (согласно выходным данным) говорит, что значение данных было 0.
Это было проверено, посылая десятичное значение 7 изодин PIC к другому непрерывно, следовательно, CREN использовался, но флаг RCIF устанавливается только один раз. После этого он остается чистым и ни разу не было значения 7, найденного в RCREG.
Я был наЭта проблема сейчас в течение 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.