Max485 siempre envía 0x00

Hola a todos, quería saber si pueden ayudarme con esta situación. Resulta que tengo estoy tratando de establecer un comunicación rs485 entre la pc y un microcontrolador pic. Así como está en el diagrama. A y B va conectados a la computadora. De momento solo busco lo siguiente:
1. Enviar un carácter de la pc al microcontrolador.
2. El microcontrolador lee el carácter.
3. El microcontrolador retorna ese carácter a la PC.
4. El microcontrolador se mantiene a la espera de otro carácter.

Sucede que haciendo pruebas ocurre lo siguiente:
1. Envío 0x97 de la PC al microcontrolador.
2. El microcontrolador lee 0x97.
3. El microcontrolador retorna 0x97 a la pc.
4. El microcontrolador retorna 0x00 a la pc.

y repite el paso 4 indefinidamente.

acá les dejo el código que estoy implementando.


C:
// CONFIG1H
#pragma config OSC = HS         // Oscillator Selection bits (HS oscillator)
#pragma config OSCS = OFF       // Oscillator System Clock Switch Enable bit (Oscillator system clock switch option is disabled (main oscillator is source))

// CONFIG2L
#pragma config PWRT = OFF       // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOR = ON         // Brown-out Reset Enable bit (Brown-out Reset enabled)
#pragma config BORV = 25        // Brown-out Reset Voltage bits (VBOR set to 2.5V)

// CONFIG2H
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 128      // Watchdog Timer Postscale Select bits (1:128)

// CONFIG4L
#pragma config STVR = ON        // Stack Full/Underflow Reset Enable bit (Stack Full/Underflow will cause Reset)
#pragma config LVP = OFF         // Low-Voltage ICSP Enable bit (Low-Voltage ICSP enabled)

// CONFIG5L
#pragma config CP0 = OFF        // Code Protection bit (Block 0 (000200-001FFFh) not code protected)
#pragma config CP1 = OFF        // Code Protection bit (Block 1 (002000-003FFFh) not code protected)
#pragma config CP2 = OFF        // Code Protection bit (Block 2 (004000-005FFFh) not code protected)
#pragma config CP3 = OFF        // Code Protection bit (Block 3 (006000-007FFFh) not code protected)

// CONFIG5H
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot Block (000000-0001FFh) not code protected)
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code protected)

// CONFIG6L
#pragma config WRT0 = OFF       // Write Protection bit (Block 0 (000200-001FFFh) not write protected)
#pragma config WRT1 = OFF       // Write Protection bit (Block 1 (002000-003FFFh) not write protected)
#pragma config WRT2 = OFF       // Write Protection bit (Block 2 (004000-005FFFh) not write protected)
#pragma config WRT3 = OFF       // Write Protection bit (Block 3 (006000-007FFFh) not write protected)

// CONFIG6H
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot Block (000000-0001FFh) not write protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write protected)

// CONFIG7L
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (000200-001FFFh) not protected from Table Reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (002000-003FFFh) not protected from Table Reads executed in other blocks)
#pragma config EBTR2 = OFF      // Table Read Protection bit (Block 2 (004000-005FFFh) not protected from Table Reads executed in other blocks)
#pragma config EBTR3 = OFF      // Table Read Protection bit (Block 3 (006000-007FFFh) not protected from Table Reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot Block (000000-0001FFh) not protected from Table Reads executed in other blocks)

#define _XTAL_FREQ 20000000

#include <xc.h>

void main(void) {
    char dato;
    TRISC=0;
    TRISCbits.RC7 = 1;
    PORTC=0;
    /*
    INTCONbits.PEIE=1;
    INTCONbits.GIE=0;
    */
   
    //UART INIT
    TXSTAbits.BRGH = 1;
    SPBRG = 129;
   
    TXSTAbits.SYNC = 0;
    RCSTAbits.SPEN = 1;
   
    TXSTAbits.TX9 = 0;
    RCSTAbits.RX9 = 0;
   
    TXSTAbits.TXEN = 1;
    RCSTAbits.CREN = 1;
   
    PIE1bits.RCIE=1;
   
    while(1){
       
        if (PIR1bits.RCIF==1){
            // leer el dato de entrada
            dato = RCREG;
            if (RCSTAbits.OERR){
                RCSTA1bits.CREN=0;
                RCSTAbits.CREN=1;
            }
           
            //Habilitar MAX485 para transmision
            PORTCbits.RC5 = 1;
            __delay_ms(100);
           
            //Enviar dato recibido
            TXREG = dato;
            while(TXSTAbits.TRMT == 0);
           
            //Habilitar max485 para recepcion
            PORTCbits.RC5 = 0;
           
        }
    }
    return;
}


DIAGRAMA DEL CIRCUITO

cto.png


De que manera puedo corregirlo? Agradecería cualquier sugerencia.
 
Logre solucionarlo agregando una resistencia entre Rx y GND. Sabe alguien a que se debe esto?
 
Que yo sepa el bus rs485 lleva resistencias terminadoras en ambos extremos.
No sé el valor ni la conexión, creo que entre los extremos del bus y 75Ω
 
Si correcto se me olvidó colocarlas en el diagrama pero en la placa de pruebas la tengo. Se cuelan bytes 0x00 cuando leo el registro RCREG.
el datasheet recomienda de 120Ω entre terminales A y B.
por ejemplo envio 0x97 de la pc al microcontrolador y el parece recibir 0x97, 0x00, 0x00 y asi.
 
Arriba