Autor Tema: CODIGO Manchester en CCS  (Leído 9932 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Arsenic

  • PIC10
  • *
  • Mensajes: 47
Re:CODIGO Manchester en CCS
« Respuesta #15 en: 26 de Septiembre de 2016, 17:30:30 »
Funcionando. Chequeame la función de decodificación, esa condición "IF" que le puse al principio. Tendría que probar mandarle otra cosa con el TX para ver si funciona bien en caso de no mandarle 4 veces el 0xF0. Observa:

Código: CSS
  1. #include <16f628a.h>
  2. #fuses XT,NOPROTECT,NOCPD,NOBROWNOUT,NOPUT,NOWDT,NOLVP
  3. #use delay(clock=4000000, internal)
  4.  
  5. #use rs232(baud=600, xmit=pin_B2, rcv=pin_B1,ERRORS)
  6.  
  7. char c,a,i,dec,dec1,dec2,enc,pattern,son;
  8. char nib[7]; //
  9. char x;
  10.  
  11.  
  12. #define data   PIN_A0
  13. #define clock  PIN_A1
  14. #define Strobe PIN_A2
  15.  
  16. #include <lcd4094.c>
  17.  
  18. void gotit()
  19. {
  20.    output_high(pin_b5);
  21.    delay_ms(100);
  22.    output_low(pin_b5);
  23.    delay_ms(100);
  24.    output_high(pin_b5);
  25.    delay_ms(100);
  26.    output_low(pin_b5);
  27.    delay_ms(100);
  28.    output_high(pin_b5);
  29.    delay_ms(100);
  30.    output_low(pin_b5);
  31. }
  32.  
  33.  
  34.  
  35. BYTE DECODE_DATA()  //decode function for machester encoded data. This code is working fine. I checked it.
  36. {
  37.  
  38. for (i=0; i<7; i++)
  39. {
  40.    nib[i] = getc();
  41.    
  42. }
  43.  
  44.  
  45. if (nib[0] == nib[1] == nib[2] == nib[3] == nib[6] == 0xF0)
  46. {
  47. return ;
  48. }
  49.  
  50.  
  51. enc = nib[4];
  52.  
  53.  
  54.  
  55.  
  56.     dec = 0;
  57.     for (i=0; i<4; i++) {
  58.    
  59.         dec >>=1;
  60.         pattern = enc & 0b11;        
  61.         if (pattern == 0b01)        // 1
  62.            bit_set(dec,3);
  63.         else if (pattern == 0b10)
  64.            bit_clear(dec,3);       // 0
  65.         else
  66.             return 0xff;            // illegal code
  67.            
  68.         enc >>=2;
  69.         dec1=dec;
  70.     }
  71. enc = nib[5];
  72.        
  73.          
  74.     dec = 0;    
  75.     for (i=0; i<4; i++)
  76.     {
  77.    
  78.         dec >>=1;
  79.         pattern = enc & 0b11;        
  80.         if (pattern == 0b01)        // 1
  81.            bit_set(dec,3);
  82.         else if (pattern == 0b10)
  83.             bit_clear(dec,3);       // 0
  84.         else
  85.             return 0xff;            // illegal code
  86.            
  87.         enc >>=2;
  88.         dec2=dec;
  89.        
  90.    }
  91.  
  92.  
  93. dec2<<=4;
  94. son=dec1|dec2;
  95. x=0;
  96. dec=0;
  97. dec1=0;
  98. dec2=0;
  99. gotit();
  100. return (son);
  101. }
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109. #int_rda
  110. void komut_al() //interrupt for receiving manchester coded data
  111. {
  112.  
  113. x=1;
  114.  
  115. disable_interrupts(int_rda);
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122. }
  123.  
  124. void main()
  125. {
  126. x=0;
  127. nib[0]=0;
  128. nib[1]=0;
  129.  
  130. enable_interrupts(int_rda);
  131. enable_interrupts(GLOBAL);
  132.  
  133. lcd_init();
  134.  
  135.  
  136.  
  137. while(true)
  138. {
  139.  
  140.    if  (x==1)
  141.    
  142.    {
  143.       x=0;
  144.      
  145.       a=DECODE_DATA();
  146.       printf(lcd_putc,"%X",a);
  147.       //delay_ms(500);
  148.       //lcd_putc('\f');
  149.      
  150.             if  (a==0x41)
  151.                {
  152.                output_high(pin_b4);
  153.                }
  154.             if  (a==0x53)
  155.                {
  156.                output_low(pin_b4);
  157.                }
  158.                
  159.       enable_interrupts(int_rda);
  160.    
  161.    }
  162.    //delay_ms(1000);
  163.    //lcd_putc('\f');
  164.    }
  165.  
  166. }
  167.  
  168.  
  169. /*
  170.  
  171.  
  172.  
  173. */

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:CODIGO Manchester en CCS
« Respuesta #16 en: 26 de Septiembre de 2016, 17:46:15 »
Por lo que veo lo estas simulando en proteus, verdad?

Bueno, pues en la realidad temo decirte que el primer 0xF0 que transmitas se perderá, es decir el receptor no podra recibirlo correctamente debido a que esta ajustando su ganancia para recibir los datos, esa es la razon por la cual necesitas envia varias veces el dato. La idea es que si el receptor recibe ese dato lo descarte ya que no puede exitir un dato de ese tipo cunado codificas en manchester, lo unicos pares validos son "10" y "01" los pares "11" y "00" son invalidos y sirven para detectar un error en la transmision-recepcion de los datos.

Yo no compararias todos los datos entre sí como lo haces en tu if. Lo correcto es que si el dato recibido es un 0xF0 descartes el dato, y si no es ese dato entonces considerarlo como dato valido a m,enos que este contenga un par invalido. De hecho la funcion detecta esos pares invalidos y por lo tanto te regresa un dato FF, indicando que el dato recibido es invalido.

Saludos,

Elreypic.

Desconectado Arsenic

  • PIC10
  • *
  • Mensajes: 47
Re:CODIGO Manchester en CCS
« Respuesta #17 en: 26 de Septiembre de 2016, 18:34:00 »
Ok, guardaré las que no sean 0xF0 en otro array de 2 datos.

Desconectado Arsenic

  • PIC10
  • *
  • Mensajes: 47
Re:CODIGO Manchester en CCS
« Respuesta #18 en: 26 de Septiembre de 2016, 19:29:22 »
.
« Última modificación: 26 de Septiembre de 2016, 19:43:35 por Arsenic »

Desconectado Arsenic

  • PIC10
  • *
  • Mensajes: 47
Re:CODIGO Manchester en CCS
« Respuesta #19 en: 26 de Septiembre de 2016, 19:42:53 »
¿Así te convence más? Hice un "scanf" generada por un while, guardando los datos diferentes a 0xF0 en el array dat de longitud 2.

Código: CSS
  1. #include <16f628a.h>
  2. #fuses XT,NOPROTECT,NOCPD,NOBROWNOUT,NOPUT,NOWDT,NOLVP
  3. #use delay(clock=4000000, internal)
  4.  
  5. #use rs232(baud=600, xmit=pin_B2, rcv=pin_B1,ERRORS)
  6.  
  7. char c,a,i,j,n,dec,dec1,dec2,enc,pattern,son;
  8. char nib[7]; //
  9. char dat[2];
  10.  
  11. char x;
  12.  
  13.  
  14. #define data   PIN_A0
  15. #define clock  PIN_A1
  16. #define Strobe PIN_A2
  17.  
  18. #include <lcd4094.c>
  19.  
  20. void gotit()
  21. {
  22.    output_high(pin_b5);
  23.    delay_ms(100);
  24.    output_low(pin_b5);
  25.    delay_ms(100);
  26.    output_high(pin_b5);
  27.    delay_ms(100);
  28.    output_low(pin_b5);
  29.    delay_ms(100);
  30.    output_high(pin_b5);
  31.    delay_ms(100);
  32.    output_low(pin_b5);
  33. }
  34.  
  35.  
  36.  
  37. BYTE DECODE_DATA()  //decode function for machester encoded data. This code is working fine. I checked it.
  38. {
  39.  
  40. for (i=0; i<7; i++)
  41. {
  42.    nib[i] = getc();
  43.    
  44. }
  45.  j=0;
  46.  n=0;
  47. while (j<2)
  48. {
  49.  
  50.    if (nib[n]!=0xF0)
  51.       {
  52.          dat[j]=nib[n];
  53.          j++;
  54.       }
  55.    n++;
  56.    
  57. }
  58.  
  59.  
  60.  
  61. enc = dat[0];
  62. //printf(lcd_putc,"%X",enc);
  63.  
  64.     dec = 0;
  65.     for (i=0; i<4; i++) {
  66.    
  67.         dec >>=1;
  68.         pattern = enc & 0b11;        
  69.         if (pattern == 0b01)        // 1
  70.            bit_set(dec,3);
  71.         else if (pattern == 0b10)
  72.            bit_clear(dec,3);       // 0
  73.         else
  74.             return 0xff;            // illegal code
  75.            
  76.         enc >>=2;
  77.         dec1=dec;
  78.     }
  79. enc = dat[1];
  80.        
  81.          
  82.     dec = 0;    
  83.     for (i=0; i<4; i++)
  84.     {
  85.    
  86.         dec >>=1;
  87.         pattern = enc & 0b11;        
  88.         if (pattern == 0b01)        // 1
  89.            bit_set(dec,3);
  90.         else if (pattern == 0b10)
  91.             bit_clear(dec,3);       // 0
  92.         else
  93.             return 0xff;            // illegal code
  94.            
  95.         enc >>=2;
  96.         dec2=dec;
  97.        
  98.    }
  99.  
  100.  
  101. dec2<<=4;
  102. son=dec1|dec2;
  103. x=0;
  104. dec=0;
  105. dec1=0;
  106. dec2=0;
  107. gotit();
  108. return (son);
  109. }
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118. #int_rda
  119. void komut_al() //interrupt for receiving manchester coded data
  120. {
  121.  
  122. x=1;
  123.  
  124. disable_interrupts(int_rda);
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131. }
  132.  
  133. void main()
  134. {
  135. x=0;
  136. dat[0]=0;
  137. dat[1]=0;
  138.  
  139. enable_interrupts(int_rda);
  140. enable_interrupts(GLOBAL);
  141.  
  142. lcd_init();
  143.  
  144.  
  145.  
  146. while(true)
  147. {
  148.  
  149.    if  (x==1)
  150.    
  151.    {
  152.       x=0;
  153.      
  154.       a=DECODE_DATA();
  155.       printf(lcd_putc,"%X",a);
  156.       //delay_ms(500);
  157.       //lcd_putc('\f');
  158.      
  159.             if  (a==0x41)
  160.                {
  161.                output_high(pin_b4);
  162.                }
  163.             if  (a==0x53)
  164.                {
  165.                output_low(pin_b4);
  166.                }
  167.                
  168.       enable_interrupts(int_rda);
  169.    
  170.    }
  171.    //delay_ms(1000);
  172.    //lcd_putc('\f');
  173.    }
  174.  
  175. }

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:CODIGO Manchester en CCS
« Respuesta #20 en: 27 de Septiembre de 2016, 01:21:18 »
Que tal Arsenic,

Me parece que no estas entendiendo mi punto. No se trata de si me gusta o no, se trata de que el funcionamiento sea el esperado.
Yo no he usado de esta manera la transmision RF, si bien he usado la codificación manchester, pero yo uso el puerto serial en forma invertida, de esta manera garantizo que mientras no se transmite ningun dato el transmisor esta apagado.
Usando el puerto serial en modo normal, el transmisor seria algo así:

Código: C
  1. void SEND_DATA(BYTE txbyte)
  2. {
  3.     int i,j,b,me;  
  4.     b = txbyte;  
  5.     for (i=0; i<2; i++)
  6.     {
  7.         me = 0;         // manchester encoded txbyte
  8.         for (j=0 ; j<4; j++)
  9.         {
  10.             me >>=2;
  11.             if (bit_test(b,0))
  12.                 me |= 0b01000000; // 1->0
  13.             else
  14.                 me |= 0b10000000; // 0->1
  15.             b >>=1;
  16.         }
  17.         putc(me);        
  18.     }
  19. }
  20.  
  21.  
  22. void main()
  23. {
  24.    int8  txdata;
  25.    //output_low (PIN_A1);
  26.    //delay_ms(1);
  27.    setup_comparator(NC_NC);
  28.    setup_vref(FALSE);
  29.    while (1)
  30.    {
  31.       for (txdata=0x30; txdata<=0x39; txdata++)
  32.          {
  33.             putc(0xF0);
  34.             putc(0xF0);
  35.             putc(0xF0);
  36.             putc(0xF0);
  37.             SEND_DATA(txdata);
  38.             putc(0xF0);
  39.             //output_low(PIN_A1);
  40.             delay_ms(1000);
  41.          }
  42.    }
  43. }

Y el receptor seria algo como esto:

Código: C
  1. int8  nib[2], x, a;
  2.  
  3. BYTE DECODE_DATA()  //decode function for machester encoded data. This code is working fine. I checked it.
  4. {
  5.    int8 enc, dec, pattern, dec1, dec2, son, i;
  6.    enc = nib[0];
  7.        
  8.     //if (enc == 0xf0)    //  start/end condition encountered
  9.         //return 0xf0;
  10.        
  11.     dec = 0;    
  12.     for (i=0; i<4; i++) {
  13.    
  14.         dec >>=1;
  15.         pattern = enc & 0b11;        
  16.         if (pattern == 0b01)        // 1
  17.            bit_set(dec,3);
  18.         else if (pattern == 0b10)
  19.            bit_clear(dec,3);       // 0
  20.         else
  21.             return 0xff;            // illegal code
  22.            
  23.         enc >>=2;
  24.         dec1=dec;
  25.     }
  26.    enc = nib[1];
  27.        
  28.     //if (enc == 0xf0)    //  start/end condition encountered
  29.         //return 0xf0;
  30.        
  31.          
  32.     dec = 0;    
  33.     for (i=0; i<4; i++) {
  34.    
  35.         dec >>=1;
  36.         pattern = enc & 0b11;        
  37.         if (pattern == 0b01)        // 1
  38.            bit_set(dec,3);
  39.         else if (pattern == 0b10)
  40.             bit_clear(dec,3);       // 0
  41.         else
  42.             return 0xff;            // illegal code
  43.            
  44.         enc >>=2;
  45.         dec2=dec;
  46.     }
  47.    dec2<<=4;
  48.    son=dec1|dec2;
  49.    x=0;
  50.    dec=0;
  51.    dec1=0;
  52.    dec2=0;
  53.    return (son);
  54. }
  55.  
  56.  
  57. void main()
  58. {
  59.    setup_comparator(NC_NC);
  60.    setup_vref(FALSE);
  61.    while (1)
  62.    {
  63.       do
  64.       {
  65.          nib[0] = getc();
  66.       } while ((nib[0]==0xF0)||(nib[0]==0xFF));
  67.       nib[1] = getc();
  68.       a = DECODE_DATA();
  69.       putc(a);
  70.       putc(13);
  71.       putc(10);
  72.    }
  73.    
  74. }

He simulado los codigos en proteus usando los PIC12F629 y trabaja bien. Pero esto no quiere decir que vaya a funcionar en la realidad.

Espero esto te sirva.

Saludos.

elreypic.

Desconectado Arsenic

  • PIC10
  • *
  • Mensajes: 47
Re:CODIGO Manchester en CCS
« Respuesta #21 en: 27 de Septiembre de 2016, 22:27:55 »
El "Así te convence?" es como un "Así sería?" en este País. entiendo tu punto pero el tema es que el llavero que me tocó, no aprende el código y por ende tengo que pensar que está mal.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:CODIGO Manchester en CCS
« Respuesta #22 en: 28 de Septiembre de 2016, 11:55:08 »
Que tal Arsenic,

Gracias por la explicación en cuanto a la interpretación del "Así te convence?".
Por lo que ahora describes lo que quieres es realizar un emisor y que ese se grabe en el llavero de siccba?
Si es así yo creo que estas en el camino equivocado. Lo primero que yo haría es saber que tipo de "code learn" usa el llavero de siccba, si este es fijo (fixed code) como el del ev1527 o usa un rolling code (Keeloq).
Si usa un fixed code como el del ev1527, ese no usa codificación manchester, este usa codificacion por PWM. Te recomiendo leer el datasheet del ev1527. Para realizar un llavero "clon" emisor de ev1527 es muy sencillo y te puedo ayudar.

Ahora bien si usa un rollin code ahi se complica la situación. En ese campo no tengo experiencia pero hay muchísima información en la página de microchip.

Saludos,

elreypic.

Desconectado doppel

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1534
Re:CODIGO Manchester en CCS
« Respuesta #23 en: 29 de Septiembre de 2016, 09:22:49 »
Hola Arsenic, conozco un poco esos controles que mencionas.... dime de que color es el led del que tu tienes??
" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "

Desconectado Arsenic

  • PIC10
  • *
  • Mensajes: 47
Re:CODIGO Manchester en CCS
« Respuesta #24 en: 06 de Octubre de 2016, 09:03:44 »
Ya logré decodificarlos! No se preocupen. Puse la data en otro thread. Un saludo!

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:CODIGO Manchester en CCS
« Respuesta #25 en: 06 de Octubre de 2016, 11:56:03 »
Que tal Arsenic,

Seria bueno que compartieras la información y la forma en que los decodificaste, por si alguien mas en el futuro tiene esta necesidad.

Saludos,

elreypic.

Desconectado Arsenic

  • PIC10
  • *
  • Mensajes: 47
Re:CODIGO Manchester en CCS
« Respuesta #26 en: 09 de Octubre de 2016, 03:43:48 »
Me temo que este thread es para tratar la codificación Manchester. Yo me puse a publicar sobre la TPO, la cual es muy diferente y por cierto un tanto más compleja. Le debo una disculpa al autor del hilo y a los administradores.

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 257
Re:CODIGO Manchester en CCS
« Respuesta #27 en: 18 de Octubre de 2016, 10:52:44 »
Que tal, tal vez les interese el hecho de que algunos de los nuevos microcontroladores de Microchip vienen Celdas Lógicas Configurables

http://ww1.microchip.com/downloads/en/DeviceDoc/40001825A.pdf

Y uno de los ejemplos incluidos en el siguiente archivo realiza la codificación Manchester usando esas celdas.
http://ww1.microchip.com/downloads/en/DeviceDoc/41631B.pdf

El 16f628a que manejan aquí tiene un costo de 2.14 en mouser, y el 16f18875 es de 2.22 o el 16f18855 a 1.97

Desconectado Arsenic

  • PIC10
  • *
  • Mensajes: 47
Re:CODIGO Manchester en CCS
« Respuesta #28 en: 02 de Mayo de 2017, 22:43:54 »
Arsenic,

No entiendo lo que estas tratando de hacer. Las modificaciones que realizaste provocan cada vez peores problemas y no tienen sentido para mi.

Primero en la funcion de decodificacion tienes esto:

for (i=0; i<7; i++)
{
   nib = c;
   
}

Eso lo que hace es que tu array va a contener el mismo dato, es decir nib[0] al nib[6] son iguales.

Otra cosa, en la interrupcion ahora solo estas recibiendo un solo dato, al cual lo asignas a la variable c. No tiene logica lo que intentas hacer.

Mira, recibes un dato por la interrupcion del puerto serial y la asignas a la variable c;

c = getc();
supongamos que recibiste un 0xA5 (entonces c=0xA5) y haces que la variable x sea uno con:
x=1;

al regresar al propagra principal, es decir a la funcion main preguntas si x=1, como esa condicion se cumple entonces llama a la rutina de decodificacion, es decir la funcion DECODE_DATA. Al entrar a la función, inmediatamente llenas todo tu array con 0XA5 mediante el for que ya te indique anteriormente, lo que quiere decir que todo tu array desde nib[0] hasta nib[6] tiene el valo 0xA5. Entonces pasas a decodicar el dato, pero nib[0] y nib[1] tienen el mismo valor, por lo tanto no obtendras el valor correto decodificado. Puedes ver que la logica que usas no es correcta?

Cuando un dato (un byte) es codificado en manchester este produce 2 bytes y esos dos bytes tiene que ser transmitidos y el receptor espera esos dos bytes y luego los decodifica, tu recibas un dato, y quieres decodificar, eso no es posile, porque falta un dato.

Saludos,

Elreypic.

Gracias a las pistas que me has dado he podido resolver los errores que tenía mi código. ¡Infinitas gracias por la ayuda!

Desconectado Arsenic

  • PIC10
  • *
  • Mensajes: 47
Re:CODIGO Manchester en CCS
« Respuesta #29 en: 23 de Octubre de 2017, 06:27:49 »
Que tal Arsenic,

Seria bueno que compartieras la información y la forma en que los decodificaste, por si alguien mas en el futuro tiene esta necesidad.

Saludos,

elreypic.

Aquí está. Es el último mensaje en este thread.
http://www.todopic.com.ar/foros/index.php?action=post;quote=390966;topic=26071.15;last_msg=390966


 

anything