Autor Tema: medir tren de pulsos  (Leído 4864 veces)

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

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
medir tren de pulsos
« en: 10 de Agosto de 2010, 14:09:48 »
Hola a todos, tengo un pequeño problema espero me puedan ayudar:
necesito leer un tren de pulsos de la siguiente manera:


el tren de pulsos es de 8 bits, lo que necesito es poder leer el tren completo y saber el tiempo que dura cada pulso. lo intente por interrupcion externa pero se pierden datos, al parecer es muy rapido el tren y no lee todos

"Nada es imposible, no si puedes imaginarlo"

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: medir tren de pulsos
« Respuesta #1 en: 10 de Agosto de 2010, 15:30:55 »
a ver si entendí bien, por ejemplo recibes el inicio de un pulso y a partir de ahi quieres saber la duración de los próximos 8 pulsos?

En ese caso, mediras solo la parte que está en alto o tambien la que está en bajo?

Si lo haces con la interrupcion externa tienes que configurarla segun los flancos que vas a recibir, es decir, si en reposo esta en nivel bajo deberas configurar la interrupcion para que sea por flanco ascendente, una ves que detectas el inicio del pulso cargas algun timer y empiezas la cuenta, y tambien cambias a que vuelvas a tener una interrupcion pero por cambio de alto a bajo para detectar el fin del pulso.
Y así con cada pulso, seguramente deberas usar algun contador para saber por que pulso vas y tambien para ir guardando los tiempos de cada pulso.

Otro punto importante es el tema del cristal que estas usando, debes asegurarte que el ciclo de instruccion sea suficiente para detectar los pulsos y poder realizar las instrucciones que necesites.

Que PIC y que compilador estas usando?
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: medir tren de pulsos
« Respuesta #2 en: 10 de Agosto de 2010, 16:59:00 »
Hola, gracias por la pronta respuesta, esta en logica negada, lo primero que recibo es un pulso en bajo, depues de ahi tengo que medir los siguientes 7 pulsos, solo la parte que esta en bajo, tienen diferente duracion para indicar si son un "1" o un "0", por eso necesito medirlos.

 estoy programando en ccs, y configure el cristal interno a 8MHz, quisiera saber como medirlo con el ccp, interrupcion externa o alguna otra manera si la hay
"Nada es imposible, no si puedes imaginarlo"

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: medir tren de pulsos
« Respuesta #3 en: 10 de Agosto de 2010, 21:36:54 »
Si los pulsos son mas rapidos que el pic que usas, te sera dificil sino es imposible leerlos, si puedes usa un PIC18 que corra a 48Mhz o 64Mhz si no te alcanza usa un dsPic a 40MIPS, sino te alcanza migra a otro dispositivo que corra mas rapido, jejeje, una alucinacion.

En la pagina de redpic hay metodos para medir pulsos, en el foro tambien dejo registro de los metodos que uso, usa el buscador.


Saludos
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: medir tren de pulsos
« Respuesta #4 en: 10 de Agosto de 2010, 22:39:11 »
Si los pulsos son mas rapidos que el pic que usas, te sera dificil sino es imposible leerlos, si puedes usa un PIC18 que corra a 48Mhz o 64Mhz si no te alcanza usa un dsPic a 40MIPS, sino te alcanza migra a otro dispositivo que corra mas rapido, jejeje, una alucinacion.

En la pagina de redpic hay metodos para medir pulsos, en el foro tambien dejo registro de los metodos que uso, usa el buscador.


Saludos
Será necesario? Según la imagen que muestra el pulso más rápido es de 500us, y con un cristal de 8MHz tenemos 1200 instrucciones para trabajar  :) Creo que la mejor forma es como indica willinovi, utilizar la interrupción externa para detectar los flancos de la señal y dependiendo de cual sea activar o desactivar un timer.

La interrupción externa puede configurarse para generar una interrupción al detectar un flanco ascendente o descendente. Entonces para los pulsos que necesitamos medir su tiempo, al ejecutarse la interrupción por flanco descendente encendemos el timer y lo iniciamos a 0. También cambiamos la configuración de la interrupción externa para que se ejecute en el flanco ascendete.
Al ejecutarse nuevamente la interrupción externa detenemos el timer, leemos su valor y a partir de ese valor podemos determinar los us  ;-) Y esto para cada pulso a medir.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: medir tren de pulsos
« Respuesta #5 en: 10 de Agosto de 2010, 23:55:51 »
Upss no vi la imagen

*Repito, usa el buscador, en el hilo: Indice de Hilos Destacados en el sub-Foro de C para Microcontroladores., encontraras la solucion en el punto 5.

Saludos
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: medir tren de pulsos
« Respuesta #6 en: 11 de Agosto de 2010, 00:34:03 »
Hola, gracias por la ayuda, ya lo intente por interrupcion externa, y en la simulacion se brinca algunos pulsos, tambien ya lo intente utilizando la configuracion de ccp en modo captura, lo intente simplemente viendo si entra a la interrupcion al recibir un cambio de flanco, pero en la simulacion en proteus no hace nada

----------------------------------------------------------------------------------
#include <16F887.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
long rise,fall,pulse_width;
#int_ccp2
void isr()
{
   rise = CCP_1;
   fall = CCP_2;

   pulse_width = fall - rise;     // CCP_1 is the time the pulse went high
}                                 // CCP_2 is the time the pulse went low
                                  // pulse_width/(clock/4) is the time

                                  // In order for this to work the ISR
                                  // overhead must be less than the
                                  // low time.  For this program the
                                  // overhead is 45 instructions.  The
                                  // low time must then be at least
                                  // 9 us.

void main()
{
   printf("\n\rHigh time (sampled every second):\n\r");
   setup_ccp1(CCP_CAPTURE_RE);    // Configure CCP1 to capture rise
   setup_ccp2(CCP_CAPTURE_FE);    // Configure CCP2 to capture fall
   setup_timer_1(T1_INTERNAL);    // Start timer 1

   enable_interrupts(INT_CCP2);   // Setup interrupt on falling edge
   enable_interrupts(GLOBAL);

   while(TRUE) {
      delay_ms(100);
      printf("\r%lu us ", ccp_2/5 );
   }
}
-----------------------------------------------------
utilice ese codigo simplemente para probar el modo captura del ccp, pero no hace nada, no entra a la interrupcion, quisiera que me dijeran si hay añgun error en el programa, ya que segun yo esta bien, pero no me funciona, lo que creo es que talvez el proteus no puede simular esto,.
"Nada es imposible, no si puedes imaginarlo"

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: medir tren de pulsos
« Respuesta #7 en: 11 de Agosto de 2010, 14:08:34 »
Mira, lo simulé en proteus y si entra a la interrupción, lo que si es que tendrías que imprimir el valor del pulse_width/5 en el virtual terminal y no el valor de ccp_2/5.

Tal vez no entra en la interrupción porque no le estás generando los pulsos de entrada a CCP correctamente. Si se lo estás ingresando con un Generators/PULSE, verifica que la tensión de Pulsed (High) Voltaje sea de 5V y no te haya quedado en el valor por defecto que es 1. Cualquier cosa sube el esquemático del isis así te podemos ayudar mejor.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: medir tren de pulsos
« Respuesta #8 en: 11 de Agosto de 2010, 21:43:20 »
Mira, lo simulé en proteus y si entra a la interrupción, lo que si es que tendrías que imprimir el valor del pulse_width/5 en el virtual terminal y no el valor de ccp_2/5.

Tal vez no entra en la interrupción porque no le estás generando los pulsos de entrada a CCP correctamente. Si se lo estás ingresando con un Generators/PULSE, verifica que la tensión de Pulsed (High) Voltaje sea de 5V y no te haya quedado en el valor por defecto que es 1. Cualquier cosa sube el esquemático del isis así te podemos ayudar mejor.
Hola, te adjunto mi archivo, ya le cambie para que inprima la variable del ancho de pulso y le puse que imprimiera algo al entrar a la interrupcion para ver si si entra, pero sigue sin entrar y siempre me imprime 0, no se donde este mi error, si en el codigo o la coneccion o no se que. espero me puedas ayudar, o si pudieras subir la simulacion que tu hiciste te lo agradeceria mucho.

saludos
"Nada es imposible, no si puedes imaginarlo"

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: medir tren de pulsos
« Respuesta #9 en: 12 de Agosto de 2010, 14:24:42 »
El tema es la versión del Isis con la que simulas el diseño, lo simulé casi tal cual está (solo le quité el printf dentro de la interrupción) en la versión 7.4 sp3 y corrió correctamente. No se cual es la versión con la que lo has simulado, fijate que te tira un warning cuando intenta configurar el
 setup_ccp2(CCP_CAPTURE_FE); Tal vez es ese el problema, quizá hay que configurar algo más en el código C, lo cual no se, y en la versión que yo uso eso no lo tiene en cuenta.
« Última modificación: 12 de Agosto de 2010, 14:59:40 por pablomanieri »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: medir tren de pulsos
« Respuesta #10 en: 12 de Agosto de 2010, 18:02:57 »
El tema es la versión del Isis con la que simulas el diseño, lo simulé casi tal cual está (solo le quité el printf dentro de la interrupción) en la versión 7.4 sp3 y corrió correctamente. No se cual es la versión con la que lo has simulado, fijate que te tira un warning cuando intenta configurar el
 setup_ccp2(CCP_CAPTURE_FE); Tal vez es ese el problema, quizá hay que configurar algo más en el código C, lo cual no se, y en la versión que yo uso eso no lo tiene en cuenta.
hola, a mi no me aparece ningun warning a la hora de compilar, la version de proteus que tengo es la 7.5 sp3, si me pudieras pasar el archivo que simulaste te lo agradeceria mucho
"Nada es imposible, no si puedes imaginarlo"

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: medir tren de pulsos
« Respuesta #11 en: 12 de Agosto de 2010, 18:08:13 »
Simulé el archivo que adjuntaste, pero en la versión 7.4 sp3. Ahora lo adjunto

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: medir tren de pulsos
« Respuesta #12 en: 12 de Agosto de 2010, 18:29:51 »
Te adjunto los archivos de la simulación y del codigo c. Le hice unas modificaciones al codigo y a la simulación. En la versión del isis 7.4 sp3 funciona. El pulso de entrada está 500us en alto y 1500us en bajo y lo muestra correctamente en el virtual terminal. Ten en cuenta que si le colocas al generador de pulso un período de 1segundo, el timer 1 se desborda varias veces y el valor medido no va a ser correcto. Pero ese no es el problema ya que tu quieres medir pulsos en el orden de los cienos de micros.

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: medir tren de pulsos
« Respuesta #13 en: 23 de Agosto de 2010, 05:00:26 »
Hola no me ha quedado claro si ya has podido solucionar el problema, pero yo lo he hecho de una forma muy cutre... pero funciona bien,
aqui te dejo la subrutina para medir el tiempo luego tu haz con esto lo que necesites, pasarlo por LCD guardarlo en otra variable o lo que quieras.

espero que te sirva, como ya he dicho habra mejores formas de hacerlo pero este funciona.

CODIGO:

#define rebre           PIN_C2   //Pin por donde entran los pulsos.
      for (;!input(rebre);)//Esperamos el inicio del pulso (flanco subida).
      {
      set_timer1(0);//Cuando llegue se pone a cero el Timer1.
      }                                   
      for (;input(rebre);)//Esperamos al final del pulso (flanco de bajada).
      {
      i=get_timer1();//Cuando llegue guardamos el tiempo en la variable i.
      }


 

anything