Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
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 =========
}
(Fcy/BAUDRATE/16)-1 En c el orden es * / y después + -
Lo tengo acotadísimo: he intentado con TX1 y RX1 empleando pines alternativos y nada, está claro que tengo que emplear 1.5 bits de stop y los pics no tienen esto.
sin embargo los ARM valen 1.7 euros, los hay de pocas patas (RS-810-7506) y te puedes hacer un programador o una tarjeta base usando una placa discovery de 8 euros (RS- 758-7554) o usar esta misma placa para hacer los inventos. Tienes 32 bits reales, coma flotante, 48 megainstrucciones por segundo (y hasta 150 si gastas más): ES UN RISK y control directo de LCDs, hay chips con ethernet, una pasada, menudo bicho 😯
(Fcy/BAUDRATE/16)-1 En c el orden es * / y después + -
Hombre, yo también sé como lo computa el compilador. Lo que te preguntaba era que como lo querías computar tú, para ver que no hubieras cometido un error al implementar el cálculo. Queda claro que lo hiciste bien.
Cambiar de micro es una solución... pero deberías encontrar el origen del error de sincronización para evitarlo en el futuro. Mete el osciloscopio y mide el ancho de los bits y de las tramas... o asegurate de que la frecuencia del cristal es la que marca...
Cuidado con poner puertos serie en paralelo, hay que poner elementos de protección en medio.
S2
Ranganok Schahzaman
Mete el osciloscopio y mide el ancho de los bits
Así es heli, metí el osciloscopio en la salida de los pics pero no en el trasmisor, acabo de ver que trasmite a 39040 kbps!! en vez de a 38400, esto me escribieron desde la empresa:
Dear j.
HM-TRP-868D is a stable module,we have sold it for many years and no known issues. Pls click below link, then click “tools” to download HM-TRP setting software to try again.
http://www.hoperf.com/rf/data_link_module/HM-TRP.htm " onclick="window.open(this.href);return false;
HM-TRP-868D is transparent tranmission module, while RFM69HW-868-S2 is COB module. I’ll ask our authorised distributor to contact with you to help you.
Best regards,
Elsa
Territory sales manager
Hope Microelectronics Co.,LTD
Cogí su programador y lo conecté, se entendía bien con el hope a 38400 baudios, pero sin embargo a la salida salía a 38.9 en vez de a 38.4kbps:
<img class="go2wpf-bbcode" src="
" onclick="window.open(this.href);return false;
">
O sea el pic es un santo, el trasmisor está en cuestión (a ver que me dicen). La solución no me gusta mucho: programar el hope a 38kbps
No he podido, los baudios del pic son tal que U2BRG =(Fcy/BAUDRATE/16)-1 si pongo Fcy=7.372Mhz entonces para 38400 U2BRG=12, si pongo U2BRG=11 la frcuencia me salta a 41.9kbps.
También he intentado cambiar la frecuencia del hope y tampoco me ha resultado, se vé que le pasa algo similar, debe ser un error del reloj principal que según he visto n el binocular es de 30Mhz.