Estoy tratando de establecer una comunicación con el EUSART del pic16F18877 pero no tengo éxito. Después de recibir algunos comentarios, hice algunos cambios en la función RxChar ().
Desde la computadora, estoy enviando 0xFE05 al controlador por medio de una interfaz usb a ttl (USB a RS232 TTL PL2303HX). Un monitor en serie en el medio no muestra errores. El char char esta saliendo correctamente. En el lado del microcontrolador, sigo recibiendo errores de trama una y otra vez.
Todavía estoy tratando de hacer que el EUSART funcione. Sofar sin éxito. Para averiguar de dónde proviene el problema, volví al archivo hex original (código en básico) para reducir las posibles fuentes de error. El programa original está escrito para el pic16F887A y después de programar el PIC16F877A, la comunicación en serie funciona correctamente. La comunicación serie para el PIC16F877A debe estar en una biblioteca ya que no puedo encontrarla en el código básico. Solo se dan las definiciones de puertos y baudios.
Esto arriba me hace creer que el problema debe estar en algún lugar en la configuración o el código de mi proyecto con el PIC16F18877. Pero sofar no tengo ni idea. Cualquier ayuda en cómo proceder es bienvenida.
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
}
}