Autor Tema: Dado electronico  (Leído 5047 veces)

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

Desconectado kmc

  • PIC10
  • *
  • Mensajes: 13
Dado electronico
« en: 07 de Agosto de 2017, 08:33:20 »
buen día Amigos soy nuevo por aquí y necesito su ayuda sobre este tema, encontre este codigo que al presionar un push button escoge un numero al asar de 0 a 6 lo que necesito es que cuando caiga el numero 6 suene en forma intermitente el buzzer por 3 segundo indicando como numero ganador y aparesca en la pantalla lcd agradeceria su ayuda el codigo es:

codigo

 #include <16f648a.h>            //pic a utilizar
#define RAND_MAX  7               //dado solamente 6 numeros
#include <STDLIB.H>               //libreria donde esta la funcion rand();         
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP      //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz
#use standard_io(B)
#use fast_io(A)
#define use_portb_lcd TRUE         //definir portb lcd
#include<lcd.c>                  //libreria manejo lcd
     
///PROGRAMA
void main(void)
{
   char num=0;                  //variable almacena numero aleatorio

   set_tris_a(0xFF);            //porta como entrada   
   disable_interrupts(GLOBAL);      //todas las interrupciones desactivadas
   
   lcd_init();                  //inicializa lcd
   
   srand(7);                  //maximo hasta 6
   lcd_putc("Dado Electronico\nPulse boton...");
   
   while(input(PIN_A0)){}         //Se mantiene cabecera hasta que se pulse el boton
     
   lcd_putc("\fDado:\nIntenta otra vez"); // mensaje de texto
   lcd_gotoxy(7,1);            //Coordenadas dond se muestra el numero
   
   for(;;){                  //bucle...
      if(!input(PIN_A0))         //¿se ha pulsado el boton?
         {
            do{                     //SI -> elimina...
               num=rand();            //genera numero pseudo-aleatorio         
               }while(!input(PIN_A0));   //...rebotes
               
            printf(lcd_putc,"%d",num);   //muestra por lcd numero
            lcd_putc("\b");            //retrocede un espacio
            output_high(PIN_B3);      //activa buzzer(beep)
            delay_ms(50);            //tiempo de escucha del beep
            output_low(PIN_B3);         //desactiva buzzer(beep)
         }                           
      }                     //...infinito
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dado electronico
« Respuesta #1 en: 07 de Agosto de 2017, 11:13:45 »
   for(;;){                  //bucle...
      if(!input(PIN_A0))         //¿se ha pulsado el boton?
         {
            do{                     //SI -> elimina...
               num=rand();            //genera numero pseudo-aleatorio         
               }while(!input(PIN_A0));   //...rebotes
               
            printf(lcd_putc,"%d",num);   //muestra por lcd numero
            lcd_putc("\b");            //retrocede un espacio
            output_high(PIN_B3);      //activa buzzer(beep)
            delay_ms(50);            //tiempo de escucha del beep
            output_low(PIN_B3);         //desactiva buzzer(beep)
         }                           
      }                     //...infinito
}

Lo haces asi:
Código: C
  1. for(;;){                  //bucle...
  2.       if(!input(PIN_A0))         //¿se ha pulsado el boton?
  3.          {
  4.             do{                     //SI -> elimina...
  5.                num=rand();            //genera numero pseudo-aleatorio        
  6.                }while(!input(PIN_A0));   //...rebotes
  7.             if(num==6)
  8.             {
  9.                 int j;
  10.                 printf(lcd_putc,"Felicidades! un 6");
  11.                 for(j=0;j<30;j++) // Repito 30 veces, cada vuelta es de 100ms, por lo que 30*100ms = 3s
  12.                 {
  13.                      output_high(PIN_B3);      //activa buzzer(beep)
  14.                      delay_ms(50);            //tiempo de escucha del beep
  15.                      output_low(PIN_B3);         //desactiva buzzer(beep)
  16.                      delay_ms(50);            //tiempo de escucha del beep
  17.                 }
  18.             }
  19.             else
  20.             {              
  21.                 printf(lcd_putc,"%d",num);   //muestra por lcd numero
  22.                 lcd_putc("\b");            //retrocede un espacio
  23.                 output_high(PIN_B3);      //activa buzzer(beep)
  24.                 delay_ms(50);            //tiempo de escucha del beep
  25.                 output_low(PIN_B3);         //desactiva buzzer(beep)
  26.             }
  27.          }                            
  28.       }                     //...infinito
  29. }

Desconectado kmc

  • PIC10
  • *
  • Mensajes: 13
Re:Dado electronico
« Respuesta #2 en: 07 de Agosto de 2017, 16:51:53 »
te agradesco muchisimooo KILLERJC  es lo que deseaba, una inquietud mas como puedo hacer que el numero al azar no salga el cero (0) sino el 1 al 6  gracias de antemano

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dado electronico
« Respuesta #3 en: 07 de Agosto de 2017, 17:20:56 »
Setea RAND_MAX a 6 ( en ves de 7) y sumale 1 es decir:

Código: C
  1. #define RAND_MAX  6               // De 0 a 5
Aunque creo que podria llegar a salir 6 justo tambien, pero eso podrias solucioanrlo. Luego cuando usas rand() haces esto:

Código: C
  1. num=rand() + 1;            //genera numero pseudo-aleatorio


Desconectado kmc

  • PIC10
  • *
  • Mensajes: 13
Re:Dado electronico
« Respuesta #4 en: 07 de Agosto de 2017, 20:54:19 »
hola aquí otra vez, quiero agradecer muchísimo  a KILLERJC  por ayudarme, que responde mis inquietudes,  en mi localidad no se vende el pic 16F648A  así que me veo obligado a pasar este mismo código al Pic 16F84A La pregunta es ¿se podrá hacer? o hay otro Pic que lo reemplace o puede ser 16F628A, si es posible con el Pic 16F84A que modificaciones se debe hacer en el Código.......Gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dado electronico
« Respuesta #5 en: 07 de Agosto de 2017, 22:43:23 »
No demasiado, solo cambiar los FUSES y el INCLUDE.
Pero no te aconsejo el PIC16F84A es demasiado viejo y caro respecto a otros, busca cualquier otro micro que tenga los suficientes pines

Desconectado kmc

  • PIC10
  • *
  • Mensajes: 13
Re:Dado electronico
« Respuesta #6 en: 07 de Agosto de 2017, 23:03:33 »
muchísimas gracias mi amigo, KILLERJC por haberme ayudado, solo una inquietud, en el mensaje que muestra felicidades lo puse el a segunda fila,por que estaba en la primera, sale el mensaje pero no se borra para empezar de nuevo, se queda alli y no aparece el numero 6 en la pimera fila te adjunto el archivo  y eso es todo y te agradezco por tu valiosa ayuda atte kmc

codigo:

#include <16f648a.h>            //pic a utilizar
#define RAND_MAX  6               //De 0 a 5
#include <STDLIB.H>               //libreria donde esta la funcion rand();         
#use delay (clock=4000000)         //Fosc=4Mhz
#use standard_io(B)
#use fast_io(A)
#define use_portb_lcd TRUE         //definir portb lcd
#include<lcd.c>                  //libreria manejo lcd
     
///PROGRAMA
void main(void)
{
   char num=0;                  //variable almacena numero aleatorio

   set_tris_a(0xFF);            //porta como entrada   
   disable_interrupts(GLOBAL);      //todas las interrupciones desactivadas
   
   lcd_init();                  //inicializa lcd
   
   srand(7);                  //maximo hasta 6
   lcd_putc("Dado Electronico\nPulse boton...");
   
   while(input(PIN_A0)){}         //Se mantiene cabecera hasta que se pulse el boton
     
   lcd_putc("\fDado:\nIntenta otra vez"); // mensaje de texto
   lcd_gotoxy(7,1);            //Coordenadas dond se muestra el numero
   
   
   for(;;){                  //bucle...
      if(!input(PIN_A0))         //¿se ha pulsado el boton?
         {
            do{                     //SI -> elimina...
               num=rand() + 1;            //genera numero pseudo-aleatorio         
               }while(!input(PIN_A0));   //...rebotes
            if(num==6)
            {
                int j;
                printf(lcd_putc,"Felicidades! un 6");
                lcd_putc("\fDado:\n   Felicidades!"); // mensaje de texto
                lcd_gotoxy(7,1);   
               
                for(j=0;j<30;j++) // Repito 30 veces, cada vuelta es de 100ms, por lo que 30*100ms = 3s
                {
                     output_high(PIN_B3);      //activa buzzer(beep)
                     delay_ms(50);            //tiempo de escucha del beep
                     output_low(PIN_B3);         //desactiva buzzer(beep)
                     delay_ms(50);            //tiempo de escucha del beep

}
            }
            else
            {             
                printf(lcd_putc,"%d",num);   //muestra por lcd numero
                lcd_putc("\b");            //retrocede un espacio
                output_high(PIN_B3);      //activa buzzer(beep)
                delay_ms(50);            //tiempo de escucha del beep
                output_low(PIN_B3);         //desactiva buzzer(beep)
            }
         }                           
      }                     //...infinito
}


Desconectado kmc

  • PIC10
  • *
  • Mensajes: 13
Re:Dado electronico
« Respuesta #7 en: 08 de Agosto de 2017, 09:10:43 »
hola amigo  ya solucione el de la pantalla, solo me queda que el mensaje: Dado 6    "felicidades" este unos segundos y vuelva al juego   eso es todo.... gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dado electronico
« Respuesta #8 en: 08 de Agosto de 2017, 13:53:04 »
Pone el nuevo programa e intenta explicar mejor que queres que haga. Ya que el mensaje va desaparecer cuando presiones otro boton.

Desconectado kmc

  • PIC10
  • *
  • Mensajes: 13
Re:Dado electronico
« Respuesta #9 en: 08 de Agosto de 2017, 17:00:26 »
te explico,  el programa corre bien cuando se pulsa el botón y sale números al azar, cuando sale el 6
sale la palabra felicidades en la pantalla LCD, con su respectivo sonido del buzzer, hasta allí todo correcto. solo que la palabra felicidades y el pitido continua y no se borra para continuar con el juego
la palabra de felicidades y el pitido debe Durar solo 3 segundo, y luego desaparecer para continuar con el juego este es el codigo, algo esta mal, por favor ayúdame en esto....gracias
codigo:

#include <16f648a.h>            //pic a utilizar
#define RAND_MAX  6               //De 0 a 5
#include <STDLIB.H>               //libreria donde esta la funcion rand();         
#use delay (clock=4000000)         //Fosc=4Mhz
#use standard_io(B)
#use fast_io(A)
#define use_portb_lcd TRUE         //definir portb lcd
#include<lcd.c>                  //libreria manejo lcd
     
///PROGRAMA
void main(void)
{
   char num=0;                  //variable almacena numero aleatorio

   set_tris_a(0xFF);            //porta como entrada   
   disable_interrupts(GLOBAL);      //todas las interrupciones desactivadas
   
   lcd_init();                  //inicializa lcd
   
   srand(7);                  //maximo hasta 6
   lcd_putc("Dado Electronico\nPulse boton...");
   
   while(input(PIN_A0)){}         //Se mantiene cabecera hasta que se pulse el boton
     
   lcd_putc("\fDado:\nIntenta otra vez"); // mensaje de texto
   lcd_gotoxy(7,1);            //Coordenadas dond se muestra el numero
   
   
   for(;;){                  //bucle...
      if(!input(PIN_A0))         //¿se ha pulsado el boton?
         {
            do{                     //SI -> elimina...
               num=rand() + 1;            //genera numero pseudo-aleatorio         
               }while(!input(PIN_A0));   //...rebotes
            if(num==6)
            {
                int j;
                printf(lcd_putc,"");
                lcd_putc("\fDado: un 6\n   Felicidades!"); // mensaje de texto
                lcd_gotoxy(7,1);   
               
                for(j=0;j<8;j++) // Repito 8 veces, cada vuelta es de 100ms, por lo que 30*100ms = 3s
                {
                     output_high(PIN_B3);      //activa buzzer(beep)
                     delay_ms(50);            //tiempo de escucha del beep
                     output_low(PIN_B3);         //desactiva buzzer(beep)
                     delay_ms(50);            //tiempo de escucha del beep
                 
   
}
            }
            else
            {             
                printf(lcd_putc,"%d",num);   //muestra por lcd numero
                lcd_putc("\b");            //retrocede un espacio
                output_high(PIN_B3);      //activa buzzer(beep)
                delay_ms(50);            //tiempo de escucha del beep
                output_low(PIN_B3);         //desactiva buzzer(beep)
            }
         }                           
      }                     //...infinito
}


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dado electronico
« Respuesta #10 en: 08 de Agosto de 2017, 17:33:37 »
Código: C
  1. #include <16f648a.h>            //pic a utilizar
  2. #define RAND_MAX  6               //De 0 a 5
  3. #include <STDLIB.H>               //libreria donde esta la funcion rand();          
  4. #use delay (clock=4000000)         //Fosc=4Mhz
  5. #use standard_io(B)
  6. #use fast_io(A)
  7. #define use_portb_lcd TRUE         //definir portb lcd
  8. #include<lcd.c>                  //libreria manejo lcd
  9.      
  10. ///PROGRAMA
  11. void main(void)
  12. {
  13.    char num=0;                  //variable almacena numero aleatorio
  14.  
  15.    set_tris_a(0xFF);            //porta como entrada  
  16.    disable_interrupts(GLOBAL);      //todas las interrupciones desactivadas
  17.    
  18.    lcd_init();                  //inicializa lcd
  19.    
  20.    srand(7);                  //maximo hasta 6
  21.    lcd_putc("Dado Electronico\nPulse boton...");
  22.    
  23.    while(input(PIN_A0)){}         //Se mantiene cabecera hasta que se pulse el boton
  24.      
  25.    lcd_putc("\fDado:\nIntenta otra vez"); // mensaje de texto
  26.    lcd_gotoxy(7,1);            //Coordenadas dond se muestra el numero
  27.    
  28.    
  29.    for(;;){                  //bucle...
  30.       if(!input(PIN_A0))         //¿se ha pulsado el boton?
  31.          {
  32.             num = 0;
  33.             do{                     //SI -> elimina...
  34.                num=rand() + 1;            //genera numero pseudo-aleatorio        
  35.                }while(!input(PIN_A0));   //...rebotes
  36.             if(num==6)
  37.             {
  38.                 int j;
  39.                 printf(lcd_putc,"");
  40.                 lcd_putc("\fDado: un 6\n   Felicidades!"); // mensaje de texto
  41.                 lcd_gotoxy(7,1);  
  42.                
  43.                 for(j=0;j<8;j++) // Repito 8 veces, cada vuelta es de 100ms, por lo que 30*100ms = 3s
  44.                 {
  45.                      output_high(PIN_B3);      //activa buzzer(beep)
  46.                      delay_ms(50);            //tiempo de escucha del beep
  47.                      output_low(PIN_B3);         //desactiva buzzer(beep)
  48.                      delay_ms(50);            //tiempo de escucha del beep
  49.                  
  50.    
  51. }
  52.             }
  53.             else if(num>0)
  54.             {              
  55.                 printf(lcd_putc,"%d",num);   //muestra por lcd numero
  56.                 lcd_putc("\b");            //retrocede un espacio
  57.                 output_high(PIN_B3);      //activa buzzer(beep)
  58.                 delay_ms(50);            //tiempo de escucha del beep
  59.                 output_low(PIN_B3);         //desactiva buzzer(beep)
  60.             }
  61.          }                            
  62.       }                     //...infinito
  63. }

Desconectado kmc

  • PIC10
  • *
  • Mensajes: 13
Re:Dado electronico
« Respuesta #11 en: 08 de Agosto de 2017, 21:05:01 »
Hola KILLERJ alguna  modificación hiciste, por que sigue  con el mismo problema y el código es el mismo amigo, bueno ... algo falta allí en el codigo 

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dado electronico
« Respuesta #12 en: 08 de Agosto de 2017, 22:57:10 »
No hay forma de que pueda sonar mas veces. Sigamos el programa sino..

Para que entre al primer if, el boton debe estar presionado, y luego entra al do--while, de ese do--while no sale hasta que se suelta el boton.
Una ves suelto el boton, muestra en el LCD, activa la salida. Y sale del if principal, al cual NO va a entrar de nuevo hasta que se presione de nuevo el boton.

Por lo cual llegamos a un punto en que solo entra 1 sola ves ya por eso. Uno pensaria que es porque cualquiera sea el camino que tome (si es 6 o no) ambos dejan la salida en 0, que supongo que estaria apagado el sonido con ese valor de salida. Por lo cual al salir SIEMPRE estaria apagado.

En todo caso si hay un error, seguramente este en las condiciones de los botones, es decir en ves de poner :  !input(PIN_A0) que sea input(PIN_A0) sin el !
O que la salida se encuentre apagada con un 1.

Esas 2 condiciones van a hacer de tu problema, yo considere lo siguiente:

Salida B3 a 1 - Activa el Buzzer
Entrada A0 en 0 - Boton presionado
Entrada A0 en 1 - Boton SIN presionar

Si alguno de esos es al reves entonces vas a tener problemas

Desconectado kmc

  • PIC10
  • *
  • Mensajes: 13
Re:Dado electronico
« Respuesta #13 en: 09 de Agosto de 2017, 00:40:27 »
tienes razón, si se inicia  el programa lo que me di cuenta es la palabra felicidades y el numero 6 no desaparecen te dejo la imagen como sale:

* error.png
(5.33 kB, 327x181 - visto 717 veces)


Desconectado kmc

  • PIC10
  • *
  • Mensajes: 13
Re:Dado electronico
« Respuesta #14 en: 09 de Agosto de 2017, 00:51:26 »
y el lugar de felicidades debería salir "intente otra vez" pero sin el numero 6 ¿que es lo que se podría mejorar? muy buen punto lo que mencionaste arriba gracias... atte kmc






 

anything