Флаг RCIF не установлен - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь отправить данные между двумя 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.

1 Ответ

2 голосов
/ 08 октября 2019

Фрагменты кода, которые вы опубликовали, не показывают правильное использование выбора банка при чтении или записи регистров специальных функций в PIC16F690.

Неправильный выбор банка кажется проблемой с вашим кодом, но это невозможночтобы быть уверенным, не глядя на весь проект. (Пожалуйста, не публикуйте свой полный код и не просите о проверке)

Чтобы узнать, в каком банке находится регистр специальных функций, см. Эту страницу в листе данных PIC16F690:

PIC16F690 SFR banks

...