TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: 16f84 en 25 de Septiembre de 2008, 23:33:17

Título: Leer dos pulsos en un intervalo de tiempo...
Publicado por: 16f84 en 25 de Septiembre de 2008, 23:33:17
Hola, Estoy intentando hacer lo siguiente...

Tengo un codigo que chequea si se producen dos pulsos o un pulso en un determinado tiempo 1000ms.  Con el primer pulso se dispara la interrupcion, asigna el valor de i=1 y espera al segundo pulso si se produce el segundo pulso incrementa uno a i, sino, espera 1000ms y si no pasa nada deja todo como está.
Consegui llegar a la interrupcion, funciona bien y todo pero lo que no puedo hacer es que lea el segundo pulso.

Les dejo una parte del codigo de la interrupcion, que supongo que es lo mas importante. Probé con un while con unos if pero no pasa nada.

Código: [Seleccionar]
#int_EXT
void EXT_isr()
{
   delay_ms(4);
  
   i=1;
   set_timer1(0);
   while(get_timer1() <= 65500){
            if(input(pin_a2)==1){
                 if(input(pin_a2)==0){
                      printf("\r\while");
                      ++i;
                 }
             }
    }
}

Si me pueden ayudar con esto seria genial, porque ya no se que vuelta darle.

Desde ya, muchas gracias.
Título: Re: Leer dos pulsos en un intervalo de tiempo...
Publicado por: gera en 26 de Septiembre de 2008, 00:08:29
lo q se me ocurre q podrias hacer, es con un timer resetear constantemente una variable, y con cada pulso, se incremente. Entonces si los pulsos son lo suficientemente seguidos, la variable va a alcanzar el valor 2. De ahi en mas, podrias levantar un flag o algo asi para despues procesarlo.
saludos!
Título: Re: Leer dos pulsos en un intervalo de tiempo...
Publicado por: Nocturno en 26 de Septiembre de 2008, 01:11:50
Estas condiciones que has puesto son prácticamente imposibles:
Código: [Seleccionar]
            if(input(pin_a2)==1){
                 if(input(pin_a2)==0){
                     printf("\r\while");

Para que el programa entre en ese printf se tiene que dar la rara casualidad de que al ejecutar el primer IF esté a 1, y justo en el ciclo siguiente haya cambiado a 0.

Prueba así:
Código: [Seleccionar]
            if(input(pin_a2)==1){
                 while (input(pin_a2));
                 printf("\r\while");
Título: Re: Leer dos pulsos en un intervalo de tiempo...
Publicado por: 16f84 en 29 de Septiembre de 2008, 14:38:03
Hola!

probe con #INT_RB pero no andaba asi que e puse a leer cada post del foro a ver si encontraba algo y vi que en uno habia un codigo con la interrupcion  #INT_RA y me quedo asi...

#INT_RA
void RA_isr()
{
   set_timer1(0);
   delay_ms(2000);
   i = get_timer1() + 1;
   printf("\r\Ca=%d ", i);
}

lo pongo por si a alguen le sirve...
gracias a los que respondieron


saludos.
Título: Re: Leer dos pulsos en un intervalo de tiempo...
Publicado por: MLO__ en 29 de Septiembre de 2008, 15:08:34
Hola.

Eso depende de la version del compilador, ya que si es en una version mayor a la 3, las interrupciones se deshabilitaran. Yo creo que la manera mas sencilla es asignar flags de deteccion y procesarlos en el main.

Saludos