Autor Tema: modulo rf y frame error  (Leído 1578 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 129
    • Desarrollos y Servicios Digitales
modulo rf y frame error
« en: 29 de Octubre de 2014, 18:25:01 »
hola, buenas tardes,

estoy usando un par de modulitos de rf (adjunto los data sheet) con dos 16f877a, cada uno conectado a su respectivo serial, configurados a 2.400 bps,

he leido en varios lados que si la comunicación directa funciona, solo es cuestión de reemplazar los cables por los módulos,

la comunicación es unidireccional, el tx de un pic al rx del otro, sin retorno,

cableada la comunicación va muy bién, pero cuando les conecto el transmisor y el receptor, lee los primeros bytes, aproximadamente unos20 y después tira error de frame y se planta, deja de recibir,

en la int reseteo el ferr pero sigue clavado, no recibe más nada, intente leer el buffer dos veces pero tampoco,

alguna ayuda?

está con xc8
Código: C#
  1. void interrupt interrupciones(void)
  2. {
  3.     if ( PIR1bits.RCIF )
  4.     {
  5.         if ( RCSTAbits.FERR )
  6.         {
  7.             t_byte caracter; // lcd
  8.             unsigned char datoRec = RCREG;
  9.  
  10.             datoRec = RCREG;
  11.            
  12.             caracter.byte = _LCD_L1_C_01_;
  13.             enviaComandoLCD( caracter );
  14.  
  15.             escribeLineaLCD( "FERR", 0 );
  16.  
  17.             RCSTAbits.CREN  = 0;
  18.             RCSTAbits.CREN  = 1;
  19.         }
  20.         else if ( RCSTAbits.OERR )
  21.         {
  22.             t_byte caracter; // lcd
  23.  
  24.             caracter.byte = _LCD_L1_C_01_;
  25.             enviaComandoLCD( caracter );
  26.  
  27.             escribeLineaLCD( "OERR", 0 );
  28.  
  29.             RCSTAbits.CREN  = 0;
  30.             RCSTAbits.CREN  = 1;
  31.         }
  32.         else
  33.         {
  34.             unsigned char datoRec = RCREG;
  35.  
  36.             // procesa cada byte y retorna true si el empaquetado es correcto
  37.             /*******************************************************************************
  38.              *
  39.              * sincronia       inicio      direccion   datos       checksum     fin de trama
  40.              * buffer[0..3]    buffer[4]   buffer[5]   buffer[6]   buffer[7]    buffer[8]
  41.              *      0xAA            0x7E        0x11        0xXX    0xXX+0x11        0xCC
  42.              *
  43.              *******************************************************************************/
  44.             if ( usartRecibirDatos(datoRec) )
  45.             {
  46.                 t_byte caracter; // lcd
  47.  
  48.                 caracter.byte = _LCD_L2_C_01_;
  49.                 enviaComandoLCD( caracter );
  50.  
  51.                 escribeLineaLCD( "Recibido ", 0 );
  52.                 enviaCaracterLCD( dt_usart.dato );
  53.             }
  54.         }
  55.  
  56.         PIR1bits.RCIF = 0;
  57.     }
  58. }

muchas gracias,

saludos,
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: modulo rf y frame error
« Respuesta #1 en: 29 de Octubre de 2014, 19:19:11 »
Definitivamente no es cierto que si la comunicación serial funciona solo es cuestion de reemplazar los cables por lo módulos.

Ya que estos módulos no son transparentes. Para obtener un buen funcionamiento es necesario codificar los datos en manchester o en algun otro formato.
Aqui en el foro hay informacion acerca de esto.

Aqui un tema donde expongo la solucion.
http://www.todopic.com.ar/foros/index.php?topic=40735.0

Saludos.

elreypic.
« Última modificación: 29 de Octubre de 2014, 19:22:08 por elreypic2 »

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 129
    • Desarrollos y Servicios Digitales
Re: modulo rf y frame error
« Respuesta #2 en: 30 de Octubre de 2014, 20:14:30 »
hola elreypic2, buenas tardes,

no te respondí antes ni te agradecí porque estuve implementando la solución del transistor, que mejoró la transmisión, pero como no me convencía el porcentaje de error que seguía existiendo, intenté mejorar el protocolo en base al post que me recomendaste,

básicamente el protocolo inicial era este array
Código: C#
  1. paquete[0] = 0xAA; // sincronia
  2.     paquete[1] = 0xAA; // sincronia
  3.     paquete[2] = 0xAA; // sincronia
  4.     paquete[3] = 0xAA; // sincronia
  5.     paquete[4] = 0x7E; // inicio
  6.     paquete[5] = 0x11; // direccion
  7.     paquete[6] = 0x00; // DATO
  8.     paquete[7] = 0x00; // checksum
  9.     paquete[8] = 0xCC; // fin de trama

y le agregué 4 bytes con 0xff al inicio y dos al final, los del final no creo que influyan,
Código: C#
  1. paquete[0]  = 0xFF; // estabilizacion
  2.     paquete[1]  = 0xFF; // estabilizacion
  3.     paquete[2]  = 0xFF; // estabilizacion
  4.     paquete[3]  = 0xFF; // estabilizacion
  5.     paquete[4]  = 0xAA; // sincronia
  6.     paquete[5]  = 0xAA; // sincronia
  7.     paquete[6]  = 0xAA; // sincronia
  8.     paquete[7]  = 0xAA; // sincronia
  9.     paquete[8]  = 0x7E; // inicio
  10.     paquete[9]  = 0x11; // direccion
  11.     paquete[10] = 0x00; // DATO
  12.     paquete[11] = 0x00; // checksum
  13.     paquete[12] = 0xCC; // fin de trama
  14.     paquete[13] = 0xFF; // estabilizacion
  15.     paquete[14] = 0xFF; // estabilizacion

este agregado me bajó el porcentaje de error a menos del 5%, calculando que estoy enviando 5 bytes efectivos, los del protocolo, y falla en uno de cada 10 ~ 15 datos,

el error de frame sigue apareciendo y ahora también aparece el de desbordamiento, pero de celoso que es,

lo que noté es que cuantos más bytes agregue de estabilización, mejor se comporta, todo esto con una distancia de 1 1/2 metro entre el emisor y el receptor, en estos días, después que pula un poco más el código, probaré con la distancia,

muchas gracias por la ayuda,

saludos,
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/


 

anything