Autor Tema: Problema de Logica  (Leído 2001 veces)

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

Desconectado freshdesing

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 88
Problema de Logica
« 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!!!

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Problema de Logica
« Respuesta #1 en: 13 de Diciembre de 2011, 15:41:03 »
¿y colocando un retardo? ¿serviría?
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problema de Logica
« Respuesta #2 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
"Nada es imposible, no si puedes imaginarlo"

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Problema de Logica
« Respuesta #3 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.

Desconectado freshdesing

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 88
Re: Problema de Logica
« Respuesta #4 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.

Desconectado freshdesing

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 88
Re: Problema de Logica
« Respuesta #5 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?

Desconectado freshdesing

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 88
Re: Problema de Logica
« Respuesta #6 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.