Problema con EUSART pic16F18877 en modo asíncrono

1

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  
    }
}
    
pregunta Decapod

1 respuesta

1

Después de una cuidadosa lectura del código y la recompilación, descubrí dónde se cometió el error. Me engañaron con la información en la tabla 33-4 donde SPBRG = 520 en combinación con SYNC = 0; BRGH = 1 y BRG16 = 1; Este valor decimal no se puede utilizar en este formato.

//Therefore not: 
 SPRG = 520;
//but:
 SPBRGH = 0x02;
 SPBRGL = 0x08;

Después de la recompilación y la prueba, descubrí que la información se había enviado correctamente; Así que es hora de seguir adelante con el resto del programa.

    
respondido por el Decapod

Lea otras preguntas en las etiquetas