TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: freshdesing en 13 de Diciembre de 2011, 15:04:18

Título: Problema de Logica
Publicado por: freshdesing en 13 de Diciembre de 2011, 15:04:18
Buenas es una tonteria pero estoy atascado. Tengo dos barreras de infrarojos conectadas a las patas RB4 y RB5, que se ponen a 1 cuando se cortan los haces.
Pues quiero hacer un programa muy simple, que  me indique si el sentido es RB4->RB5  o bien RB5->RB4, y que mande un pulso o dos en función de si es en un sentido y otro pero al final de la ultima barrera. Por ejemplo su pasa por RB4 y despues por RB5 que saque un pulso.

El inconveniente que estoy teniendo es que las barreras estan a dos centimetros, y si va en el sentido RB4->RB5, cuando llega a RB5 SIGUE cortando RB4 y en el sentido contrario lo mismo .(Es para un tren electrico). No puedo poner los leds separados porque despues quiero ponerle mas vagones. Asi que el problema principalmente es que siempre se quedan cortado los dos haces y como en la interrupcion al preguntar por RB4 o RB5 uno va primero, me da problemas.
Código: [Seleccionar]
if(input(pin_b5)==1)
      {
       
         flag_RB4=0; //Flag de la barrera 1
                     
         if (flag_RB5==0) //
            {
            flag_RB5=1;
            pulso_ID(2);
             }
       }

   if(input(pin_b4)==1)
      {
         flag_RB5=0; //Flag de la barrera 2
         if (flag_RB4==0)
            {
            flag_RB4=1;
            pulso_ID(1);
             }
       }


Con esto funciona bien si las barreras estan separadas y no se cortan nunca las dos a la vez.

¿Alguna ayudita? Gracias!!!
Título: Re: Problema de Logica
Publicado por: PalitroqueZ en 13 de Diciembre de 2011, 15:41:03
¿y colocando un retardo? ¿serviría?
Título: Re: Problema de Logica
Publicado por: rivale en 13 de Diciembre de 2011, 16:07:02
porque no usas interrupciones, en cuando recibas  el cambio de flanco de uno checas si el otro esta presionado, y asi sabes cual  paso primero, es parecido a leer el  sentido en un encoder
Título: Re: Problema de Logica
Publicado por: Nocturno en 14 de Diciembre de 2011, 02:46:59
Creo que es muy sencillo, si detectas RB4 cerrado y RB5 abierto va en un sentido; si detectas RB4 abierto y RB5 cerrado va en el otro. Después de hacer cualquiera de las dos detecciones, tienes que quedar en un bucle esperando que se abran ambos.
Título: Re: Problema de Logica
Publicado por: freshdesing en 14 de Diciembre de 2011, 08:25:58
Creo que es muy sencillo, si detectas RB4 cerrado y RB5 abierto va en un sentido; si detectas RB4 abierto y RB5 cerrado va en el otro. Después de hacer cualquiera de las dos detecciones, tienes que quedar en un bucle esperando que se abran ambos.

Gracias antes de nada. Por ejemplo si es RB4 cerrado, puede que este saliendo o bien entrando. Se pueden dar los dos casos. Y cuando estan los dos cerrados no se enque sentido va.

porque no usas interrupciones, en cuando recibas  el cambio de flanco de uno checas si el otro esta presionado, y asi sabes cual  paso primero, es parecido a leer el  sentido en un encoder

Uso las interrupciones de RB4:7


¿y colocando un retardo? ¿serviría?

No siempre es la misma velocidad a la que va.

Gracias pensare ne lo que me habbeis dicho a ver si averiguo algo.
Título: Re: Problema de Logica
Publicado por: freshdesing en 14 de Diciembre de 2011, 09:27:09
Con el siguiente código funciona bien, pero si pasa muy rapido no es capaz de dar los pulsos de la funcion Pulso_ID().

Código: C
  1. #INT_RB
  2.  
  3. void interrup_RB(void)
  4.  
  5.  
  6.     if((input(pin_b4)==1)&&(input(pin_b5)==0))
  7.       {
  8.       flag_RB4=1;
  9.       flag_RB5=0;
  10.       }
  11.    
  12.      
  13.    if((input(pin_b4)==0)&&(input(pin_b5)==1))
  14.       {
  15.       flag_RB4=0;
  16.       flag_RB5=1;
  17.       }
  18.      
  19.      
  20.    if((input(pin_b4)==1)&&(input(pin_b5)==1))
  21.          {
  22.          if(flag_RB4==1)
  23.             {
  24.             pulso_ID(2);
  25.             flag_RB4=0;
  26.             flag_RB5=0;
  27.             }
  28.          if(flag_RB5==1)
  29.             {
  30.             pulso_ID(1);
  31.             flag_RB4=0;
  32.             flag_RB5=0;
  33.             }
  34.          }
  35. }


Código: C
  1. void pulso_ID (int numero)
  2. {  
  3.      
  4.          int i;
  5.          for (i=1;i<=numero;i++)
  6.             {
  7.             output_bit(pin_b1,1);
  8.             delay_ms(20);
  9.             output_bit(pin_b1,0);
  10.             delay_ms(5); // Dejamos 5 ms para que no se solapen los pulsos
  11.             }
  12.        
  13.      
  14. }

¿Alguna ayuda?
Título: Re: Problema de Logica
Publicado por: freshdesing en 14 de Diciembre de 2011, 09:36:10
Porque tenia un delay de 100ms al entrar en la intrrupción. Gracias por todo. Supongo qu ayer estaria un poco embotado.

Un saludo y gracias.