TODOPIC

FORO TÉCNICO => Foro Técnico => Mensaje iniciado por: MichaelKnight en 24 de Septiembre de 2011, 12:17:28

Título: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 24 de Septiembre de 2011, 12:17:28
Gracias a la ayuda de MerLiNz por fin he conseguido capturar correctamente la señal mediante el osciloscopio, ahora toca su correspondiente interpretacion.
Sirviendome de las capturas en BMP he ido "troceando" de forma evidente la trama usando de referencia cada  una de las subdivisiones. Teniendo en cuenta que en la imagen que muestro la captura se hizo con con 4ms/DIV, entonces cada subdivision es 1/5 de 4ms, lo que me sale 0.8ms por division. Ahora bien, raramente me coinciden los flancos con las subdivisiones, ¿como hago entonces para establecer su duracion?

(http://img200.imageshack.us/img200/3872/interpretacion.th.png) (http://img200.imageshack.us/i/interpretacion.png/)

Gracias de antemano por vuestras respuestas!
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MerLiNz en 24 de Septiembre de 2011, 13:04:38
lo puedes hacer de la siguiente manera, el programa tiene una opcion para medir frecuencia, tiempo de flancos, etc..

vete a Measure/source y pones el CH1

en measure/horizontal podras ver varias opciones que te pueden servir para calcular el tiempo de cada bit en este caso al ser una señal digital. Como tu señal es variable pues deberias intentar aislar la parte donde se repiten continuamente 0-5-0-5...

Otra forma es, el 4º boton empezando por la izk, pinchas en el inicio de la onda, abajo veras que te va marcando el tiempo segun vas moviendo el mouse en busca de el otro flanco. Para obtener una buena precision, vas bajando la escala de tiempo hasta que te quede unicamente 5-0-5, asi tendras mucha precision, alrededor de los ns
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 24 de Septiembre de 2011, 14:07:00
Muchas gracias MerLiNz, lo del 4º boton por la izquierda me parece que va a ser de gran ayuda dado que ahora puedo ir flanco a flanco midiendo en que tiempo se produce el cambio y de ese modo podria programar mi pic. Como valores raros decir que en la cima de cada pulso me marca el voltaje en negativo, en concreto me da -4,942 V. Digo que es raro porque se entiende que si estoy en la cima del flanco de subida deberia de tener 1 (5v) y cuando estoy abajo un 0 (0v) hablando siempre de logica binaria tal y como me la enseñaron en clase. ¿Debo ignorar este valor negativo y seguir tomando cada cima como 1 y cada base 0?

Por otra parte, muestree la señal con el trigger en - y me sale inicialmente  un pulso largo a 0, pero en realidad ese 0 lo entiendo como led IR apagado, por tanto lo que me deberia interesar es capturar la señal partiendo del primer 1 que es lo primero que va a excitar mi emisor, ¿cierto?

Por ultimo, para sacar la trama entera he de muestrear a 10ms/DIV, pero me resulta dificil poder sacar la informacion que necesito viendose tan pequeño. Si cambio la escala entonces no me muestra la señal completa y no doy con la tecla para poder ir moviendo la señal sobre la pantalla del osciloscopio como haciamos en la facultad. ¿existe esta funcion en el osciloscopio software?


Saludos y muchas gracias por la ayuda que me estas prestando.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MerLiNz en 24 de Septiembre de 2011, 14:47:44
no se puede ir moviendo de lado a lado creo.

No te compliques en medir la trama entera, con saber el tiempo de cada bit, unicamente averiguas el numero de bits y lo multiplicas por el tiempo.

Es decir, si tienes 16bits y cada bit = 10us, pues la trama completa son 160us.

Si lo que quieres es imitar la señal debes hacer eso, buscar lo mas exacto el tiempo de 1 bit y usar ese delay para reproducir una trama con los bits que quieras.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 25 de Septiembre de 2011, 07:22:39
Anoche hice la identificacion de la trama completa habiendo un total de 131 pulsos que los he codificado tal que asi:

Código: [Seleccionar]
si;
   delay_ms(1634);
   no;
   delay_us(474);
   si;
   delay_ms(1229);
   no;
   delay_us(440);
   si;
   delay_us(372);
   no;
   delay_us(468);
   si;
   delay_us(364);
   no;
   delay_us(474);
   si;
   delay_us(364);
   no;
   delay_us(474);
   si;
   delay_ms(1231);
   no;
   delay_us(474);
   si;
   delay_us(372);
   no;
   delay_us(460);
   .........

El problema es que no puedo meter la trama entera de este modo porque solo con eso y el main el pic se queda sin ROM suficiente, cosa que veo exajerado porque el programa no tiene complejidad ninguna. Visto esto, esta claro que tal y como dice MerLiNz debo de buscar otra formula basada en bits, pero el caso es que aqui me es complicado encontrar cuantos bits y que duracion por bit. De igual modo, cada bit tendra un delay y tendre que ir diciendo cuando esta a 1 y cuando 0, entonces tendria nuevamente este mismo problema de codigo excesivo. Me siento bastante torpe la verdad, no alcanzo a ver la forma.

Siento ser tan pesado, espero que una vez consiga entender este problema que elegi de muestra sea capaz de desenvolverme por mi mismo en el futuro y ser yo quien ayude a los demas.

Gracias de antemano.
Saludos.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MerLiNz en 25 de Septiembre de 2011, 10:33:45
haz lo siguiente, un array

unsigned char trama[]={'0','1','1','0'....};

ahora

unsigned char x;
for(x=0;x<tamañotrama;x++) {
pinqueuses=trama[ x];
delay_que_hayas_calculado();
}

he visto que los delays son todos distintos, esto no puede ser asi, como ya te dije tiene que ir basado en una velocidad, es decir, de bit a bit siempre debe haber un mismo tiempo, cuando se mantiene 2 o 3 veces en estado alto/bajo se interpreta como 111 o 000..
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 25 de Septiembre de 2011, 10:48:13
Coincido contigo en que este seria el modo mas logico de hacerlo, ahora bien, toca averiguar la duracion por bit.

Creo que la forma mas sencilla de sacarlo puede ser esta, midiendo desde el flanco de subida hasta el siguiente flanco de subida de los pulsos mas pequeños.

(http://img405.imageshack.us/img405/2980/1bit.png)

Segun mido ahi me salen 358us. El siguiente paso deberia ser divivir por este tiempo los diferentes pulsos y asi sabre cuantos bits los componen.

¿alguna idea mejor?

Saludos y gracias.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MerLiNz en 25 de Septiembre de 2011, 10:56:14
ahi en ese caso estas midiendo el periodo, para obtener cuanto tarda cada bit seria periodo/2. En tu caso debes averiguar durante cuanto tiempo esta un pulso a +5V o bien a 0V

Por eso te dije que bajases la escala al minimo donde solo veas 3 flancos por ejemplo, asi obtendras una medicion mas precisa.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 25 de Septiembre de 2011, 10:58:59
Pues pongo la protoboard sobre la mesa porque con lo tengo ahora muestreado me salen los 1 mas cortos que los 0. A ver en una escala diferente que precision logro. En un instante posteo mi medicion.

Gracias por la ayuda que me estas prestando tan buena.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MerLiNz en 25 de Septiembre de 2011, 11:08:06
te pongo un ejemplo para que veas, con las señales de ejemplo que trae (es señal senoidal, con la cuadrada (tuya) es mucho mas sencillo)

es una señal de 50khz, el periodo deberia ser 20us exactos. Como ves en la primera medicion por mucho que afine hay mas margen de error, y en la 2ª queda casi clavado.

Lo que te digo es que intentes congelar la parte donde se repite constantemente la trama de 0-1-0-1..... lo mas grande que puedas, y asi lo midas, incluso poniendo el measure/vertical/period te dira el numero sin tener que medir, como puedes ver en la imagen2.

http://img163.imageshack.us/img163/6761/cap1w.png
http://img269.imageshack.us/img269/8291/cap2cg.png
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 25 de Septiembre de 2011, 11:42:31
Siguiendo tus consejos he utilizado la herramienta de medicion horizontal y automaticamente me marca una frecuencia y periodo. En cambio, cuando mido manualmente, en la parte inferior me indica valores distintos para freq y time.

http://img705.imageshack.us/img705/2948/freqper.png

¿Debo asumir entonces que el periodo son 1.72ms y que cada pulso la mitad=0.86ms? ¿O me quedo con la medicion manual y los valores que aparecen abajo del todo en la barra de estado?

Saludos y gracias nuevamente.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MerLiNz en 25 de Septiembre de 2011, 12:02:46
Siguiendo tus consejos he utilizado la herramienta de medicion horizontal y automaticamente me marca una frecuencia y periodo. En cambio, cuando mido manualmente, en la parte inferior me indica valores distintos para freq y time.

http://img705.imageshack.us/img705/2948/freqper.png

¿Debo asumir entonces que el periodo son 1.72ms y que cada pulso la mitad=0.86ms? ¿O me quedo con la medicion manual y los valores que aparecen abajo del todo en la barra de estado?

Saludos y gracias nuevamente.

esto te ocurre porque la trama es irregular, es decir, ves que se mantiene mucho tiempo en 1, luego en 0, luego menos tiempo... Es decir el osciloscopio no es capaz de calcular una trama irregular ya que los tiempos serian erroneos, por eso te aconseje que mirases la parte de la trama donde se repite 0-1-0-1-0 constantemente, ahi obtendras lo que necesitas.

Para ello en vez de single utiliza "normal" e intenta congelar con el STOP cuando pase la trama que buscas.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 25 de Septiembre de 2011, 12:14:48
Ahora si ha coincidido medicion manual con medicion automatica.

http://img148.imageshack.us/img148/9990/freqyper.png

Creo que ya por fin  hemos llegado al valor que nos interesa.

En tal caso, si 880us es mi periodo, cada bit es de 440us, ¿cierto?
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MerLiNz en 25 de Septiembre de 2011, 12:25:23
exacto, asi es, 440us es tu delay
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 25 de Septiembre de 2011, 12:40:03
Fenomeno! entonces dentro de un rato me pongo a sacar todos los bits y programarlos.

Gracias por tu ayuda!
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 25 de Septiembre de 2011, 13:56:31
Pues parece que tome un pulso equivocado, cosa que he averiguado cuando he ido a hacer divisiones de 440us habiendo pulsos que eran de por si mas pequeños que eso. Asi que he vuelto a medir y ahora he sacado valores que son mas razonables.

(http://img690.imageshack.us/img690/8349/freqyper2.png)

Ahora cuento con un periodo de 410us, lo que me deja un tiempo por cada bit de 205us.  Dado que siempre estamos haciendo aproximaciones basadas en la observacion, ¿es posible redondear a 400us y 200us?

Cuando mido los pulsos para saber cuantos bits contienen me encuentro valores que jamas me dan divisiones enteras, cosa que esperaba por otra parte. En el caso de un pulso que dura 500us, ¿cuantos bits le asigno?¿y alos que miden 166us?
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MerLiNz en 25 de Septiembre de 2011, 14:36:36
el caso es que ahi parece que los 0's son mas pequeños que los 1's no?? Es la misma señal? U otra distinta?? En la otra que pusiste parecia que eran todos del mismo tamaño
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 25 de Septiembre de 2011, 14:42:28
El fenomeno de 0 y 1 de diferentes longitudes ya lo comente anteriormente me parece. La señal la he vuelto a capturar con el osciloscopio pulsando la misma tecla del mando, asi que bueno podriamos decir que es la misma señal capturada de nuevo. Ante esto, ¿como debo proceder?

PD: para ser la primera vez que me enfrento a un proyecto con IR parece que he escogido uno de dificultad.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MerLiNz en 25 de Septiembre de 2011, 14:51:33
mide la duracion del 1, y del 0, quizas la duracion del 0 sea la mitad del 1.

Puede que no sea tan dificil, muchos circuitos de IR unicamente funcionan segun la señal sin contar con el tiempo, es decir que le vas poniendo 0V y 5V indistintamente del tiempo y el circuito lo interpreta sin tener en cuenta la frecuencia de la señal, unicamente lo hace por deteccion de flanco ascendente y/o descendente.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 25 de Septiembre de 2011, 15:26:55
He vuelto a capturar la misma señal y tengo la impresion que los tiempos son bastante imprecisos.

http://img842.imageshack.us/img842/2162/21409225.png

Ahora volvemos a tener un periodo de 860us y midiendo los pulsos unos tienen una duracion de casi 400us los 1 y los 0 470us. En cambio en la captura anterior salian 410us y desafortunadamente medi el periodo completo, pero esta claro que los 1 en este caso son mas largos que los 0.

Imprecisiones al margen, esta claro que he de asignar un tiempo, ¿asigno el mismo a todos sean 1 o 0? Cuando tengo varios pulsos encadenados a 1 o a 0, ¿que tiempo utilizo para sacar cuantos bits son?
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MerLiNz en 25 de Septiembre de 2011, 15:59:45
quizas el reloj que use el mando no tenga la precision de us y tenga su margen de error, deberias ir probando combinaciones para ver si te funciona.

Yo probaria de tal forma, cogeria 400us como referencia, si por ejemplo tienes 800-900us en +5V pues lo puedes interpretar como 2 unos.

Si tienes 1200us +- lo interpretas como 3 unos. Es decir, si divides el tiempo en el que tienes entre 400 quizas te de 2,3. Pues interpretalo como 2 bits.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 25 de Septiembre de 2011, 16:26:56
quizas el reloj que use el mando no tenga la precision de us y tenga su margen de error, deberias ir probando combinaciones para ver si te funciona.

Yo probaria de tal forma, cogeria 400us como referencia, si por ejemplo tienes 800-900us en +5V pues lo puedes interpretar como 2 unos.

Si tienes 1200us +- lo interpretas como 3 unos. Es decir, si divides el tiempo en el que tienes entre 400 quizas te de 2,3. Pues interpretalo como 2 bits.

En definitiva, un redondeo a la baja. En caso de darme un resultado de 2,8 tendria logica de hacerlo como 3 pulsos, ¿no?

Voy a ello y en cuanto lo pruebe os lo comento.

Muchas gracias!
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 25 de Septiembre de 2011, 17:55:49
Pues parece que este proyecto se resiste a dar alguna facilidad. Cuando he ido a compilar lo que llevaba escrito para ver como "reaccionaba" resulta que me dice no tener suficiente ram para las variables. Claramente, la culpa es del array donde almaceno el orden en el que van saliendo los 1 y 0, pero lo peor es que aun no esta completa.

Código: [Seleccionar]
   unsigned char trama[]={1,1,1,1,0,1,1,1,0,1,0,1,0,1,0,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,0,1,0,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0};
Dada la imposibilidad de crear un array tan sumamente grande, ¿que otra opcion queda si no sigue un patron concreto esta señal?
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MerLiNz en 25 de Septiembre de 2011, 18:58:11
te queda el desplazamiento por bits, no te lo queria comentar porque es algo lioso

que usas ccs u otro??

el desplazamiento por bits seria cuestion de crear una variable larga, de 32bits por ejemplo (cuanto mide la trama?) e ir poniendo de 1 en 1.

seria algo asi

unsigned long trama=0b01010101010.........  (lo tienes que colocar en sentido inverso)(maximo 32, si necesitas mas grande te digo otra forma).

y ahora
for(x=0;x<tamañotrama;x++) {
puerto=(trama>>x)&1;
}

que pic usas por cierto?? te lo comento porque el array es pequeño para quedarte sin memoria
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 25 de Septiembre de 2011, 20:16:10
Si, estoy usando el CCS y el pic es el 12F683 que tiene 128 de ram y 256 de rom. Sobre lo de desplazamiento de registros no me termina de quedar claro que no de el mismo problema de tamaño excesivo, pues sea como sea tengo que crear una variable de un tamaño considerable. Es mas, se saldria de rango y quizas se debieran usar una sucesion de variables para poder hacerle el desplazamiento. La longitud total de la trama no la he sacado aun porque tengo follon en casa y no han parado de interrumpirme, asi que he perdido la cuenta varias veces y lo he dejado para mañana.

Gracias una vez mas por tus ideas. En cuanto saque la trama completa posteo mis resultados.

Saludos.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MerLiNz en 25 de Septiembre de 2011, 20:41:21
no creo que sea excesiva, si lo es, buscate otro pic.

con el metodo del array si tienes que poner 32 bits de la trama serian 32*8=256bits.

con el metodo de desplazamiento de bits unicamente serian 32bits para 32 0's y 1's.

Tu pic tiene 1024bits de ram, osea tendrias capacidad para cerca de 900 bits (el otro restante te lo quita el CCS).

en la variable usa entonces "int32" por ejemplo, cambiando lo de unsigned long
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 25 de Septiembre de 2011, 21:06:29
A ojimetro puede que no me falte ram nuevamente, pues al ocupar unicamente bits en lugar de bytes por cada bit de mi señal el aprovechamiento de recursos es infinitamente mayor. Queda aun por ver la longitud total de la trama una vez troceada, pero te anticipo que va a ser bastante larga.

Ahora me asalta otra duda. Estamos moviendonos en tiempos de microsegundos, ¿perjudicaran de forma evidente los tiempos de ejecucion de cada desplazamiento y comparaciones a la hora de reproducir la trama?

Esta claro que la señal salia cada vez con tiempos distintos, asi que puede ser que en este caso sea relativamente insignificante el efecto que puedan tener en el resultado final, pero en otros casos donde la señal sea mas precisa quiza sea algo a "descontar" del delay.

Por hoy no me enrollo mas y me voy a la cama que mañana me espera un dia duro.

Seguire informando de mis progresos.

Saludos.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MerLiNz en 25 de Septiembre de 2011, 21:11:07
depende de la velocidad de tu pic, a 4mhz tendrias unos 10us de error por el for, esto te lo digo como ejemplo ya que para saberlo habria que ver el codigo en asm generado por el ccs, de todas formas es algo que siempre puedes ir viendo sobre la marcha y con el osciloscopio.

Por muy larga que sea la trama, dudo que llege a 100bits xD
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: Suky en 25 de Septiembre de 2011, 22:44:23
Pues parece que este proyecto se resiste a dar alguna facilidad. Cuando he ido a compilar lo que llevaba escrito para ver como "reaccionaba" resulta que me dice no tener suficiente ram para las variables. Claramente, la culpa es del array donde almaceno el orden en el que van saliendo los 1 y 0, pero lo peor es que aun no esta completa.

Código: [Seleccionar]
  unsigned char trama[]={1,1,1,1,0,1,1,1,0,1,0,1,0,1,0,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,0,1,0,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0};
Dada la imposibilidad de crear un array tan sumamente grande, ¿que otra opcion queda si no sigue un patron concreto esta señal?

Si eso es constante, o sea no se va a modificar, podes agregar el modificar const que guardará el buffer en rom.

Luego si quieres precisión en los tiempos, al realizar el algoritmo podes ir debuggeando con MPLAB SIM (Se puede usar CCS en MPLAB, usar el buscador para saber como) y determinar los tiempos de ejecución como para ajustarlos si es necesario.


Saludos!
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 26 de Septiembre de 2011, 09:34:09
Interesante observacion. Efectivamente sera constante y jamas cambiara su valor, asi que ese es otro modificador a tener en cuenta.

Muchas gracias.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 26 de Septiembre de 2011, 19:42:01
Bueno, esta noche he sacado un tiempo para poder desmenuzar la señal. Esta se compone de una parte iregular de 167bits y luego termina con 95bits a 1. No tengo claro si 95 o 96 porque al dividir me daba un da un decimal alto, todo es probar.

Mañana tengo que ir a comprar un componente para poder programar el pic y pruebo si de verdad esta señal esta bien imitada.

Pruebas empiricas aparte, lo unico que no estoy muy orgulloso de la optimizacion del codigo. Esta claro que vuestras ideas han sido cruciales, fijaos que he pasado de no poder compilar por exceder la ram del pic a usar un maximo del 16% de la misma segun el compilador. Ahora en cambio lo que me parece "desperdiciada" es la rom, pues dice estar usando el 77% en algo que considero que es simplisimo y disponiendo una rom de 256. He creado programas mucho mas complejos y mas largos en cuanto lineas de codigo que han ocupado muchisimo menos tras su compilacion. Os pongo la parte del codigo que desperdicia recursos por si me sugeris soluciones mas optimas.

Código: [Seleccionar]
   const unsigned long parte1=1011101111;
   const unsigned long parte2=1011101010;
   const unsigned long parte3=1110101010;
   const unsigned long parte4=1110111010;
   const unsigned long parte5=1110111010;
   const unsigned long parte6=1011101110;
   const unsigned long parte7=1110101011;
   const unsigned long parte8=1010101010;
   const unsigned long parte9=1110111010;
   const unsigned long parte10=1011101110;
   const unsigned long parte11=1010101010;
   const unsigned long parte12=1010101010;
   const unsigned long parte13=1010101010;
   const unsigned long parte14=1010101010;
   const unsigned long parte15=1010101010;
   const unsigned long parte16=1010101110;
   const unsigned long parte17=0101010;
   unsigned int i;
   
   for(i=0; i<10;i++){
   
      if(((parte1>>i)&1)==0){
         
         no;
      }
      else{
     
         si;
      }
     
      delay_us(tiempo);
   }
   
   for(i=0; i<10;i++){
   
      if(((parte2>>i)&1)==0){
         
         no;
      }
      else{
     
         si;
      }
     
      delay_us(tiempo);
   }
   
.......

   for(i=0; i<7;i++){
   
      if(((parte17>>i)&1)==0){
         
         no;
      }
      else{
     
         si;
      }
     
      delay_us(tiempo);
   }
   
   for(i=0;i<96;i++){
   
      si;
      delay_us(tiempo);
   }


Dado que un long llega hasta 4,294,967,295 con lo que he tomado solo 10 digitos por cada trozo.

¿Hay alguna solucion mas elegante para por lo menos los 167 primeros bits?

Saludos y gracias a todos por vuestras aportaciones que han sido de gran ayuda hasta el momento.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MerLiNz en 26 de Septiembre de 2011, 20:23:48
estas usando una variable de 32bits para 10bits, eso es un derroche de memoria.

Como ya te dije, en CCS usa "int32" en vez del long, el long te lo puse porque yo uso C18 y es distinto el tamaño de las variables.


int32 trama1=0b11111111....hasta 32 (sin contar el 0b).

ES MUY IMPORTANTE PONERLE EL 0b, esto significa que estas diciendo que el numero es binario, el 0b no cuenta nada, el numero 0b110 es 1-1-0 en binario.
Tienes que tener muy claro que no es lo mismo trabajar con binario, que decimal, que hexadecimal, al fin y al cabo todos significan lo mismo, pero cuando te he propuesto la idea del desplazamiento de bits debes trabajar en binario con esa variable.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 26 de Septiembre de 2011, 21:49:01
Pues mano de santo! con esta ultima optimizacion he reducido el numero de trozos y el uso de la ROM ha caido hasta el 36%, lo que es una mejora importante.

Ahora he pensando hacer el codigo aun mas elegante y crear un doble bucle for de modo que lleve la cuenta del trozo de señal que esta procesando y tras terminar con uno pase al siguiente. Salvo errores en tiempo de ejecucion, en cuanto a tiempo de compilacion todo sale ok para este metodo.

Código: [Seleccionar]
   unsigned int i,j;
   char trozo[6];
   
   for(j=1;j<6;j++){
   
      strcpy(trozo,"parte");
      strcat(trozo,j);
     
      for(i=0; i<32;i++){
   
         if(((trozo>>i)&1)==0){
         
            no;
         }
     
         else{
     
            si;
         }
     
         delay_us(tiempo);
      }
   }

Y mejor aun, la rom queda mucho mejor aprovechada con un 18% de uso, practicamente nada, y la ram oscilando entre un 11% y un 30% que lo veo mas que razonable. Ahora que he optimizado recursos (no se si aun se pueden optimizar mas) me surge la duda de si con este nuevo algoritmo no interferire entre los retardos, pues nos movemos en 155us por bit. A falta de que mañana pueda programar el pic y hacer pruebas empiricas, ¿a vuestro juicio puede penalizarme mucho esta ultima solucion?
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 29 de Septiembre de 2011, 11:16:41
Entre esta noche y mañana espero poder poner en la protoboard el montaje. Por lo pronto el pic ya esta programado y solo falta ponerlo a prueba. Os pondre al tanto de los resultados.

Saludos.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 30 de Septiembre de 2011, 09:38:41
Vale... pues fiasco :(

Encima me despiste con un cable que usaba para dar la señal de activacion e hice cortocircuito y ya he quemado un agujero de la protoboard :(

Bueno, tratando de buscar soluciones se me ocurren varias aunque no tengo claro que sean la solucion.

Como referencia, ahi el codigo empleado:

Código: [Seleccionar]
#include <12f683.h> // Selecciona el PIC
#include <string.h>
#fuses INTRC_IO, NOMCLR, NOWDT, NOBROWNOUT
#use delay(clock=4000000) // Velocidad del reloj : 4 Mhz

#define ir PIN_A2
#define activacion PIN_A3
#define si output_high(ir)
#define no output_low(ir)

const unsigned int tiempo=155;//us

void prueba(){

   //señal=01010101010101110101010101010101010101010101010101010101010101010101011101110111011101010101010101110101011101110111011101110101110111010111010101010111010101011101111;
 
   
   const unsigned int32 parte1=0b10111010101010111010101011101111;
   const unsigned int32 parte2=0b10111011101110111011101011101110;
   const unsigned int32 parte3=0b10111011101110101010101010111010;
   const unsigned int32 parte4=0b10101010101010101010101010101011;
   const unsigned int32 parte5=0b10101011101010101010101010101010;
   const unsigned int   parte6=0b0101010;
   unsigned int i;
 
     
   for(i=0; i<32;i++){
   
      if(((parte1>>i)&1)==0){
         
         no;
      }
     
      else{
     
         si;
      }
     
      delay_us(tiempo);
   }

   
   for(i=0; i<32;i++){
   
      if(((parte2>>i)&1)==0){
         
         no;
      }
      else{
     
         si;
      }
     
      delay_us(tiempo);
   }
   
   for(i=0; i<32;i++){
   
      if(((parte3>>i)&1)==0){
         
         no;
      }
      else{
     
         si;
      }
     
      delay_us(tiempo);
   }
   
   for(i=0; i<32;i++){
   
      if(((parte4>>i)&1)==0){
         
         no;
      }
      else{
     
         si;
      }
     
      delay_us(tiempo);
   }
   
   for(i=0; i<32;i++){
   
      if(((parte5>>i)&1)==0){
         
         no;
      }
      else{
     
         si;
      }
     
      delay_us(tiempo);
   }
   
   for(i=0; i<7;i++){
   
      if(((parte6>>i)&1)==0){
         
         no;
      }
      else{
     
         si;
      }
     
      delay_us(tiempo);
   }

   
   for(i=0;i<96;i++){
   
      si;
      delay_us(tiempo);
   }
}
   
void main(){
   
 
   do{
   
      if(input(activacion)==TRUE){
   
         prueba();
      }
     
   }while(TRUE);

}

Ideas:

- La primera es que este comentiendo errores al "trocear" los bits y para evitar contaminaciones, por radical y ridiculo que suene, voy a buscar la forma de abrir el mando y conectar directamente el osciloscopio al propio emisor.
- La segunda es que, como ya comente anteriormente, quizas los retardos de las comprobaciones y bucles falseen la señal

En principio esto es lo que me viene en mente, si me podeis aportar alguna idea mejor estare encantado de probarla.

Saludos.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MerLiNz en 30 de Septiembre de 2011, 11:07:07
te puedes ahorrar mas codigo haciendolo de la siguiente manera:

const unsigned int32 partes[6]={0b.......,0b.....,....};


for(y=0;y<6;y++) {
for(i=0;i<32;i++) {
 
if(y==5 && i>6) break; //este para el ultimo que solo contiene 7bits 0->6
      if(((parte[y]>>i)&1)==0){
        
         no;
    ..................

}




}
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 30 de Septiembre de 2011, 11:53:11
Es un codigo muy astuto que tendre que probar. No obstante, creo que esta noche probare con otro mando de otro electrodomestico a ver si tiene una trama menos extraña.

Saludos e ire informando de mis resultados.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: solapower en 30 de Septiembre de 2011, 12:59:27
Por si puede servirte de ayuda navegando en busca de otras cosas me ha aparecido esta información que quizás pueda serte de ayuda.
http://sunbizhosting.co.uk/~spiral/blog/?p=85
Salud
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 30 de Septiembre de 2011, 14:08:11
Por si puede servirte de ayuda navegando en busca de otras cosas me ha aparecido esta información que quizás pueda serte de ayuda.
http://sunbizhosting.co.uk/~spiral/blog/?p=85
Salud

Mas que nada es una buena curiosidad, pues desconocia que el PIC KIT2 hiciera de osciloscopio para este tipo de casos. En cuanto a la captura de la trama, creo que ya la tenemos, su interpretacion creo que tambien y ahora falta su correspondiente implementacion que no se si falla en cuanto a una mala interpretacion o a retardos excesivos derivados de los bucles y comprobaciones. Esta noche espero poder dedicarle un tiempo.

Gracias por tu interes.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 02 de Octubre de 2011, 16:42:30
Poco a poco todo va empezando a aclararse, aunque aun no tengo nada operativo.

Segun he podido aprender en el foro de Nocturno, los mandos tienen diferentes standares y el efecto que a nosotros nos parecia anomalo de que los 0 y los 1 tuvieran diferentes duraciones resulta que no es tan anomalo si no normal. Ahora toca, descifrar el standard que usa el mando que me ocupa y a partir de ahi ir sacando conclusiones.

Con todo lo anterior podria parecer que es todo pan comido, pero a tenor de lo que veo la cosa no pinta facil:

http://users.telenet.be/davshomepage/

En ese enlace explican varios standares y segun he podido comprobar mi mando no casa con ninguno.

Añado imagen para ilustarlo

(http://img534.imageshack.us/img534/56/22ms.png)

Como se aprecia, la duracion del pulso inicial no coincide con ninguno de los standares. O al menos yo no logro ver correspondencia alguna.

Saludos y gracias de antemano.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: pablomanieri en 02 de Octubre de 2011, 16:53:42
Acá hay algunos rotocolos más http://zerocircuits.zobyhost.com/Protocolos/protocolos.php (http://zerocircuits.zobyhost.com/Protocolos/protocolos.php)
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: micro_pepe en 03 de Octubre de 2011, 12:48:57
Pues viendo este último oscilograma que has puesto, yo creo que se corresponde con un Sony ( http://www.sbprojects.com/knowledge/ir/index.php                            http://www.sbprojects.com/knowledge/ir/sirc.php ).

¿Como estás midiendo? ¿Con un sensor de infrarrojos? Si es así y es de este tipo:

(http://t1.gstatic.com/images?q=tbn:ANd9GcQ7FNO77k1mk4Mlu4NzyWQNzXHOs8pVTiLTgdMDlWywskmHK_pS)

te invierten la señal, entonces para verlo correctamente deberias invertir la señal en el osciloscopio.

Saludos.
Título: Re: Interpretando la señal capturada en el osciloscopio
Publicado por: MichaelKnight en 03 de Octubre de 2011, 17:23:18
Gracias por colaborar.

El mando que trato de imitar es el de un aire acondicionado para que se encienda cuando la habitacion supera los 30ºC y se apague al bajar de 22ºC. Es para una sala de servidores de una pequeña empresa que instalo un split convencional para el control de temperatura de la sala pero que logicamente es ineficiente porque no tiene termostato y alguien tiene que estar encendiendo y apagando. Logicamente, por la noche no es tan necesario y lo dejan apagado y lo encienden por el dia, pero para que no se olvide y no haya "error humano" se va automatizar.

Segun he ido leyendo, los mandos de aire acondicionado son muy puñeteros porque tienen diferentes protocolos y las señales son muchisimo mas largas de lo que con el osciloscopio estoy pillando. Es mas, la señal que implemente esta incompleta porque tengo que poner el muestreo a un tiempo por division mayor para pillarla entera, siendo imposilbe ver pulsos.

Lo mejor en este caso es utilizar la tarjeta de sonido y poner a grabar la onda con un programa de edicion de audio. Con este otro metodo puedes jugar mucho mas con la señal.

Ire comentando mis progresos.

Saludos.