Я пытаюсь установить связь с EUSART pic16F18877, но безуспешно. Получив некоторые комментарии, я внес некоторые изменения в функцию RxChar().
С компа отправляю 0xFE05 на контроллер через интерфейс usb to ttl (USB To RS232 TTL PL2303HX). Последовательный монитор между ними не показывает ошибок. Символ отправки выходит правильно. Со стороны микроконтроллера я время от времени получаю ошибки кадров.
Все еще пытаюсь заставить работать EUSART. Пока безуспешно. Чтобы выяснить, откуда возникла проблема, я вернулся к исходному шестнадцатеричному файлу (код в основном), чтобы уменьшить возможные источники ошибок. Оригинальная программа написана для pic16F887A, и после программирования PIC16F877A последовательная связь работает правильно. Последовательная связь для PIC16F877A должна быть в библиотеке, так как я не могу найти ее в базовом коде. Даны только определения порта и скорости передачи.
Это выше заставляет меня поверить, что проблема должна быть где-то в настройках или коде моего проекта с PIC16F18877. Но я понятия не имею. Любая помощь в дальнейших действиях приветствуется.
fosc = 20.000000
void UART_Init(void)
{
RC1STAbits.SPEN = 0; // begin of setup disable serial port.
// transmitter
TX1STAbits.TXEN = 1; // continues transmit enable bit
TX1STAbits.TX9 = 0; // 8 bit transmission
TX1STAbits.SYNC = 0; // asynchronous operation
ANSELCbits.ANSC6 = 0; // digital
TRISCbits.TRISC6 = 0; // output
// receiver
RC1STAbits.CREN = 1; // continues receive enable bit
RC1STAbits.RX9 = 0;
// there is only one sync
ANSELCbits.ANSC7 = 0; // digital
TRISCbits.TRISC7 = 1; // input
// baudrate.
TX1STAbits.BRGH = 1;
BAUD1CONbits.BRG16 = 1;
SPBRG = 520; // baudrate 9600
RC1STAbits.SPEN = 1; // end of setup enable serial port
}
void UART_TxChar(uchar ch)
{
while(TXIF==0);
TXREG=ch;
}
uchar UART_RxChar()
{
uchar Discard;
while(1){
while(RCIF==0); // Wait till the data is received
if (RCSTAbits.FERR)
{
Discard = RCREG; Read the register and wait for the next byte
break;
}
if (RCSTAbits.OERR)
{
RCSTAbits.CREN = 0;
break;
}
return RCREG; // Return the received data to calling function
}
}
После тщательного повторного чтения кода и перекомпиляции я обнаружил, где была допущена ошибка. Меня ввела в заблуждение информация в таблице 33-4, где SPBRG=520 в сочетании с SYNC=0; BRGH=1 и BRG16=1; Это десятичное значение не может использоваться в этом формате.
//Therefore not:
SPRG = 520;
//but:
SPBRGH = 0x02;
SPBRGL = 0x08;
После перекомпиляции и тестирования я обнаружил, что информация поступает правильно; Итак, пора переходить к остальной части программы.
браханы
Десятиногие
Евгений Ш.
0
? Вы не должны этого делать. И вы не показали, как все это используетсябраханы
Десятиногие
Десятиногие
Десятиногие
браханы
Десятиногие
браханы
Десятиногие
Десятиногие