RS485 no funciona en pic24fj128ga202

4

Me gustaría enviar y recibir datos entre dos microcontroladores PIC24F a través de RS485. Aquí estoy usando SP3485 IC. He puesto un microcontrolador como Transmisor y otro tiene receptor. Mi microcontrolador tiene 4 uart. Uno de los uart (aquí uso UART4) está conectado con RS485 IC (SP3485) para ambos. Como de costumbre, los pines de datos 'A' a 'A' y 'B' a 'B' están conectados. A continuación se muestra la imagen que muestra las clavijas PIC24F que están conectadas con RS485 IC. Estoy transmitiendo datos de una imagen a otra foto a través de RS485. En el lado del receptor, he conectado UART1 con el hiperterminal para ver los datos recibidos. El problema es que Mientras imprimo los datos recibidos en el hiperterminio, muestra datos no deseados. He comprobado que el UART1 está funcionando bien.

Aquí solo publico el código de inicialización de UART4.

init_processor ()    {    TRISB = 0x46E0;

/******** pps for uart4 **************/
RPINR27bits.U4RXR = 4;
RPOR3bits.RP6R=21; //RP(6)R---> 6th pin of pic(RP6R has RPOR3)

// Init UART4
U4MODE = 0x8000;
U4STA = 0x0000;     //Enable Transmission, Clear all flags
U4BRG = 25;
//IFS0bits.U1RXIF = 0;            // Clear the Receive Interrupt Flag
//IEC0bits.U1RXIE = 1;            // Enable Receive Interrupts
U4MODEbits.UARTEN = 1;            // And turn the peripheral on
U4STAbits.UTXEN = 1;

//UART4
void uartsend4( char in_c)
    {
        while(U4STAbits.UTXBF == 1);
        U4TXREG = in_c;
    }
void uart4str( char *s)
    {
        while(*s!='
/******** pps for uart4 **************/
RPINR27bits.U4RXR = 4;
RPOR3bits.RP6R=21; //RP(6)R---> 6th pin of pic(RP6R has RPOR3)

// Init UART4
U4MODE = 0x8000;
U4STA = 0x0000;     //Enable Transmission, Clear all flags
U4BRG = 25;
//IFS0bits.U1RXIF = 0;            // Clear the Receive Interrupt Flag
//IEC0bits.U1RXIE = 1;            // Enable Receive Interrupts
U4MODEbits.UARTEN = 1;            // And turn the peripheral on
U4STAbits.UTXEN = 1;

//UART4
void uartsend4( char in_c)
    {
        while(U4STAbits.UTXBF == 1);
        U4TXREG = in_c;
    }
void uart4str( char *s)
    {
        while(*s!='%pre%')
            {
                uartsend4(*s);
                s++;
            }
    }

char uartrec4()
    {
        while(U4STAbits.URXDA == 0); 
        if (U4STAbits.OERR)
            U4STAbits.OERR = 0; 
        return U4RXREG; 
    }
}

main.c transmitter:

int main()
{ 
    init_processor();
    PORTBbits.RB5=1; //RB5 is RE/DE
        while(1)
            {
                uart4str("Hello\r\n");
                Delayms(1000);
            }
    return 0;
}




main.c receiver:

int main()
[![{ 
    init_processor();
    PORTBbits.RB5=0; //RB5 is RE/DE][1]][1]
        while(1)
            {
                uart1str(uartrec4());  //printing received uart4 data in hyperterminal
                Delayms(1000);
            }
    return 0;
}
') { uartsend4(*s); s++; } } char uartrec4() { while(U4STAbits.URXDA == 0); if (U4STAbits.OERR) U4STAbits.OERR = 0; return U4RXREG; } } main.c transmitter: int main() { init_processor(); PORTBbits.RB5=1; //RB5 is RE/DE while(1) { uart4str("Hello\r\n"); Delayms(1000); } return 0; } main.c receiver: int main() [![{ init_processor(); PORTBbits.RB5=0; //RB5 is RE/DE][1]][1] while(1) { uart1str(uartrec4()); //printing received uart4 data in hyperterminal Delayms(1000); } return 0; }

    
pregunta arun

1 respuesta

1

Supongo que ha comprobado por triplicado las velocidades en baudios entre los microcontroladores, así como entre recibir uart1 y el hiperterminal.

El código de recepción no es correcto:

    while(1)
        {
            uart1str(uartrec4());  //printing received uart4 data in hyperterminal
            Delayms(1000);
        }

El problema aquí es que uartRec4 recibe un carácter. Lo que pasa es:

  • el remitente envía 7 bytes, espera un segundo
  • el receptor recibe el primer byte, lo envía y luego lo ignora todo durante 1 segundo.

Retire sus retrasos (1000) del lado del receptor. Asegúrese de utilizar el mismo ancho de banda entre las fotografías y también en el hiperterminal.

Si aún no funciona, intente dividirlo en partes:

  • haga un lado del "receptor" que no reciba nada, solo imprima Hello to uart1: esto verifica si todo está correcto para la PC
  • envía solo un carácter, por ejemplo, una A en el remitente, espere 1000 ms y repita, esto no requiere ningún almacenamiento en búfer ni una consideración de temporización especial.

Tenga en cuenta que uart1str (uartrec4 ()) también puede ser problemático si hw uart no tiene un búfer (los PIC tienen un búfer de receptor de 2 bytes, afaik). (El problema es que está esperando un byte, luego, mientras lo envía a uart1, puede que llegue otro byte que debe verificar).

    
respondido por el Gee Bee

Lea otras preguntas en las etiquetas