fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

Problema en UART de dspic30f leyendo 0x7F

16 Respuestas
4 Usuarios
0 Reactions
19.3 K Visitas
fusion
Respuestas: 391
Topic starter
(@fusion)
Ardero
Registrado: hace 17 años

Veo que la UART me vá bien para retrasmitir variadas cadenas de caracteres sin error, pero le sienta FATAL que le mande siempre 0x7F. He probado ha hacer de todo: cambiar bits de stop, cambiar un poco el baudrate, quitar/poner bit de paridad y nada.
Debe ser algún bug oculto en el micro. He probado incluso a cambiar de compilador del C30 al X16 y nada.
He sacado en paralelo dos cables conectando a RX y terra un módulo USB-RS232 del cual leo usando labview y lee perfectamente 0x7F 0x7F ....

Pregunta: ¿qué micro me recomendáis con un RS232 que sea ROBUSTO?

Pongo aquí el software:

Programación del reloj:
_FOSC(CSW_FSCM_OFF & XT_PLL8 ); // Fosc=8x7.3728MHz, Fcy=7.3728MHz CRISTAL EXTERNO!!!
unsigned long int Fcy=8*7372800/4;//Si pones PLL4 multiplicar por 4, si PLL8 multiplicar por 8
_FWDT(WDT_OFF); // Watchdog timer off
_FBORPOR(PBOR_ON & BORV27 & PWRT_64 & MCLR_DIS);//Brown out voltage=2.7V delay power on=64ms

De la UART y timers:

//Configurar Uart-2
U2MODEbits.UARTEN = 0; // Disable UART-2
U2BRG = Fcy/BAUDRATE/16-1; // 38400 baud
U2MODEbits.PDSEL = 0;//0b10; //odd parity!!. Sin paridad=00, 01=even, 0b10=odd, 11=trasmite 9 bits (?)
U2STAbits.UTXISEL = 0; // enable/disable interrupt when TX buffer is empty ??
// U2MODEbits.BRGH=0; //16 clock/bit (0=low speed)
U2MODEbits.LPBACK = 0; //Disable loopback
U2MODEbits.STSEL = 1; //0=1 stop bit, 1=2 stops bits
U2MODEbits.ABAUD = 0; // Autobaud desactivado
U2MODEbits.UARTEN = 1; // Enable UART-2
U2STAbits.UTXEN = 1; // Enable TX-2

// Configure Timer 1
PR1 = 65535; // Set the Timer 1 period (max 65535)
TMR1 = 0; // Reset Timer 1 counter
IEC0bits.T1IE = 0; // Disable Timer 1 interrupt
T1CONbits.TCKPS = 3; // Prescaler (0=1:1, 1=1:8, 2=1:64, 3=1:256) Frecuencia=Fcy/256
T1CONbits.TON = 1; // Turn on Timer 1
// Configure Timer 2
PR2 = 65535; // Set the Timer 2 period (max 65535)
TMR2 = 0; // Reset Timer 2 counter
IEC0bits.T2IE = 0; // Disable Timer 2 interrupt
T2CONbits.TCKPS = 3; // Prescaler (0=1:1, 1=1:8, 2=1:64, 3=1:256) Frecuencia=Fcy/256
T2CONbits.TON = 1; // Turn on Timer 2

El software es muy sencillo:

while(1)
{
if (U2STAbits.URXDA) //hay byte en RX1 **
{
r=(byte) U2RXREG;
U2TXREG=r;
//envia(r);
if (r==0x7F) LED_W=0; else LED_W=1;
}
//========== FIN loopback de pruebas =========
}

Responder
15 respuestas
fusion
Respuestas: 391
Topic starter
(@fusion)
Ardero
Registrado: hace 17 años

Poniendo 2 bits de stop en el pic y uno en los módulos de comunicaciones vá perfecto, ya he quitado la pausa cada 10 bytes. El módulo hace CRC si se quiere y también hace direccionamiento.

Responder
Página 4 / 4
Compartir: