PIC16F628A + 8 Push Button

que tal amigos, tengo una duda sobre un codigo que intento usar para armar una maquinita de juegos que consta de derribar unos muñecos los cuales al caer presionan cada uno de los microswitch del puerto B y los mantienen apretados, dichos micros tambien mandan un 1 por el pin A0 que talvez active un buzzer o una maquina expendedora de tickets o cupones mediante un relay.

mi problema es que trato de presionar cualquier micro en forma aleatoria y no hace nada, solo funciona cuando va siguiendo el orden que tiene: b0,b1,b2,b3,etc...

adjunto un archivo winrar con el codigo que fui haciendo y la simulacion en proteus para quien pueda darme una mano con esto, pido disculpas de antemano si algo esta mal o falta algo que consideren importante o falten detalles en mi post, soy nuevo en esto de programacion y deseo seguir aprendiendo, saludos a todos.
 

Adjuntos

  • 16f628a.rar
    14.8 KB · Visitas: 26
Aquí lo dejo. Creo que me faltaron algunas cosas como los set_tris.

PHP:
#include <16f628a.h>
#fuses XT
#fuses put
#fuses MCLR
#use delay (clock=4M)

void main(){

for(;;){

    if (!input(pin_b0)){
            while((!input(pin_b0)));
            output_high(pin_a0);
            delay_ms(500);
            output_low(pin_a0);
            }
            

    if (!input(pin_b1)){
            while((!input(pin_b1)));
            output_high(pin_a0);
            delay_ms(500);
            output_low(pin_a0);
            }
            
           
    if (!input(pin_b2)){
            while((!input(pin_b2)));
            output_high(pin_a0);
            delay_ms(500);
            output_low(pin_a0);
            }
            

    if (!input(pin_b3)){
            while((!input(pin_b3)));
            output_high(pin_a0);
            delay_ms(500);
            output_low(pin_a0);
            }
            
            
    if (!input(pin_b4)){
            while((!input(pin_b4)));
            output_high(pin_a0);
            delay_ms(500);
            output_low(pin_a0);
            }
            
            
    if (!input(pin_b5)){
            while((!input(pin_b5)));
            output_high(pin_a0);
            delay_ms(500);
            output_low(pin_a0);
            }
            

    if (!input(pin_b6)){
            while((!input(pin_b6)));
            output_high(pin_a0);
            delay_ms(500);
            output_low(pin_a0);
            }
            

    if (!input(pin_b7)){
            while((!input(pin_b7)));
            output_high(pin_a0);
            delay_ms(500);
            output_low(pin_a0);
            }
           


}

}
 
Hola, el problema es que está mal encarado el programa.
Pues al utilizar la condición while, sólo saldrá de ese bucle cuando la condición NO sea válida.
Tienes que hacer un programa cíclico, que recorra desde el inicio hasta el final pasando, por todo tipo de condiciones sin generar atascos con while y con delays.
 
Con lo que haz programado, da igual si por ejemplo, el pin RB0 estuviera conectado a todos los micro switchs.
Ya que no existe ninguna comparación que defina cuál micro switch fue accionado y provoque una acción diferente.
O sea, todos los pines tienen la misma rutina; cambiar de estado el pin RA0 durante 500 mS.
Por lo tanto, cualquier micro switch que sea presionado, generará la misma rutina.
Objetivo que no tiene sentido.
 
Buenas
Podrías explicar mejor en que consiste el juego, ¿por que hay 8 botones en diferentes puertos?, ¿cada muñeco tiene un premio diferente?, ¿o al derribar un numero determinado de muñecos paga el premio?.
 
D@rkbytes, eso que dices es lo que quiere que haga, pero según lo que explica es que eso no sucede
mi problema es que trato de presionar cualquier micro en forma aleatoria y no hace nada, solo funciona cuando va siguiendo el orden que tiene: b0,b1,b2,b3,etc...
 
Precisamente porque con ese código no puede haber un orden.
Da igual cual pulsador se presione, siempre se obtendrá el mismo resultado porque la rutina es la misma para cualquier pin.

Edit:
Viendo el esquema, no corresponde con lo programado.
Snap1.jpg

Debería ser así y activando las resistencias pull-up internas del puerto B:
Snap2.jpg

Y así es donde entra el asunto de lo que comento. (Totalmente innecesaria la misma rutina para todos los pines)
 
Última edición:
Es que eso quiere, cuando el muñeco cae accione cualquiera de ellos y active A0
No quiere que se active en orde necesita que se aleatorio, pero en la práctica no sucede
 
ya probe con activar el pull-up pero sigue haciendo lo mismo, explico un poco mejor de que trata: consta de derribar unos muñecos lanzando pelotas con la mano, al caer presionan cada micro que corresponde a un pin del puerto B, mi idea era activar el pin A0 con el mismo delay, es decir que el premio seria lo mismo para todas las figuras sin importar cual se tire primero, y el motivo por el cual queria usar todo el puerto B es para que al estar todos los micros apretados funcione un motor de 5,12 ó 24v que mediante una biela vuelva a levantar las figuras y por lo tanto suelte todos los micros.
espero se entienda un poco mejor y disculpen las molestias
 
if (!input(pin_b0))
{
while((!input(pin_b0)));
output_high(pin_a0);
delay_ms(500);
output_low(pin_a0);
}
Ese un trozo de código lapidario para tu propósito.
Este un ejemplo más apropiado.
Código:
#include <16f628a.h>
#fuses XT
#fuses put
#fuses MCLR
#use delay (clock=4M)

void main()
{
   unsigned int8 puerto_estado_actual;
   unsigned int8 puerto_estado_anterior=255;
   port_b_pullups(255);
   while(true)
   {
      puerto_estado_actual=input_b();
      if((~puerto_estado_actual)&(puerto_estado_anterior))
      {
         output_high(pin_a0);
         delay_ms(500);
         output_low(pin_a0);
      }
      if(puerto_estado_actual==0)
      {
         delay_ms(1000);
         output_high(pin_a1);
         delay_ms(1000);
         output_low(pin_a1);
      }
      puerto_estado_anterior=puerto_estado_actual;
   }
   delay_ms(100);
}
Sin título.png
 
Última edición:
Atrás
Arriba