UART en dsPIC33EP512MU810

0

Quiero transmitir continuamente los datos en el UART2 de mi dsPIC33EP512MU810

. UART2 Tx pin lo estoy configurando al Pin 51 del controlador que es RP99.

Ahora la salida UART se está convirtiendo a RS485 usando ST4485EB en el circuito integrado. El pin de 3 números de ST4485EB IC está conectado con el pin número 55 del controlador, que es RA2. Estoy haciendo un pin RA2 alto para activar el IC.

Mi tablero también tiene un crstal TXC 4.00 MFC a bordo que es un cristal de 4 MHZ.

Intentando configurar el UART con una tasa de baudios de 38400 8 bits de datos, 1 bit de parada, sin paridad y sin control de flujo. Utilizando el siguiente código pero no obteniendo el resultado deseado. Por favor, ayúdame con esto.

/******************************************************************************/
/* Files to Include                                                           */
/******************************************************************************/

/* Device header file */
#if defined(__XC16__)
    #include <xc.h>
#elif defined(__C30__)
    #if defined(__dsPIC33E__)
        #include <p33Exxxx.h>
    #elif defined(__dsPIC33F__)
        #include <p33Fxxxx.h>
    #endif
#endif
#define FP 40000000
#define BAUDRATE 9600
#define BRGVAL ((FP/BAUDRATE)/16)-1
unsigned int i;
#define DELAY_105uS asm volatile ("REPEAT, #4201"); Nop(); // 105uS delay

#include <stdint.h>        /* Includes uint16_t definition                    */
#include <stdbool.h>       /* Includes true/false definition                  */

unsigned int i;
#define DELAY_105uS asm volatile ("REPEAT, #4201"); Nop(); // 105uS delay

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <xc.h>
#include <float.h>
#include <libpic30.h>
#include <p33Exxxx.h>
#include "system.h"        /* System funct/params, like osc/peripheral config */
#include "user.h"          /* User funct/params, such as InitApp              */

/******************************************************************************/
/* Global Variable Declaration                                                */
/******************************************************************************/

/* i.e. uint16_t <variable_name>; */

/******************************************************************************/
/* Main Program                                                               */
/******************************************************************************/
int16_t main(void)
{

    TRISAbits.TRISA2=0;
    PORTAbits.RA2 = 1;

    RPOR8bits.RP99R = 3; // Assign U2TX peripheral to pin RP84
    RPINR19bits.U2RXR = 19; // Assign pin RPI16 to U2RX peripheral  

    U2MODEbits.STSEL = 0; // 1-Stop bit
    U2MODEbits.PDSEL = 0; // No Parity, 8-Data bits
    U2MODEbits.ABAUD = 0; // Auto-Baud disabled
    U2MODEbits.BRGH = 0; // Standard-Speed mode
    U2BRG = BRGVAL; // Baud Rate setting for 9600
    U2STAbits.UTXISEL0 = 0; // Interrupt after one TX character is transmitted
    U2STAbits.UTXISEL1 = 0;
    IEC1bits.U2TXIE = 1; // Enable UART TX interrupt
    U2MODEbits.UARTEN = 1; // Enable UART
    U2STAbits.UTXEN = 1; // Enable UART TX
    /* Wait at least 105 microseconds (1/9600) before sending first char */
    DELAY_105uS
    U2TXREG = 'a'; // Transmit one character
    while(1)
    {
    }
}

void __attribute__((__interrupt__)) _U2TXInterrupt(void)
{
IFS1bits.U2TXIF = 0; // Clear TX Interrupt flag
U2TXREG = 'a'; // Transmit one character//comment this once testing is done and UART is working.
}

Puedo ver los datos en el terminal de la PC pero no es 'a'. Probé una velocidad de transmisión diferente, pero ninguno de ellos me está dando el resultado 'a' que estoy enviando.

    
pregunta spp

3 respuestas

2

Lo más probable es que se trate de un error en la velocidad en baudios / reloj. Intente capturar la línea TX en un alcance y mida la velocidad en baudios que realmente ve, en comparación con lo que ha programado. A partir de eso, deberías poder decir que estás fuera por una proporción específica, y con un poco de suerte que hará que sea más fácil localizar el error.

Ya que has probado varias velocidades de transmisión y ninguna se ve bien, puedes crear involuntariamente una velocidad de transmisión "no estándar". Estás utilizando FP = 40000000 (40MHz). ¿Puedes confirmar que el chip está funcionando a 40MHz? No veo la configuración de tu PLL, así que no puedo asegurarlo.

    
respondido por el Selvek
0

Veo que copió la mayor parte del código del Manual del usuario .

DefineFPcomo4MhzyapareceenloscálculosdeBRGVALcomo" 4,000,000 " mientras que el suyo es de 40MHz, " 40,000,000 ".

[La razón del uso de comas fue para facilitar la lectura, no las c / p.]

    
respondido por el Ali I. Demirel
-1

Está enviando datos UART sin ningún tiempo de inactividad. Esto puede hacer que el receptor se "bloquee" en un bit incorrecto como bit de inicio (cualquier bit de datos "cero" podría malinterpretarse como bit de inicio).

Intente enviar 0x00 o 0xFF de vez en cuando: estos valores permiten que el receptor se vuelva a sincronizar con el remitente.

Alternativamente, puedes introducir un tiempo de inactividad (más de 8 bits), lo que también permitiría una sincronización correcta.

    
respondido por el Turbo J

Lea otras preguntas en las etiquetas