Autor Tema: Simon game con 3 leds  (Leído 6380 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Simon game con 3 leds
« Respuesta #15 en: 29 de Octubre de 2008, 18:43:34 »
Haber si te entiendo modulay.

El C no es mi fuerte, por lo que te pido que me corrijas si me equivoco.

Empiezas el programa guardando en una pocición de la RAM con 1, luego, en una parte del programa, llamás a la rutina aleatorio y comprobas si es 4. Si es 4 sale, si no controla, si es 1, sale, y si no es 1, lo incrementa en 1 y luego se guarda con la opción 2 o 3 que depende de la incrementación.

Lo que no logro entender, en que parte lo chequeas con RB4.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Simon game con 3 leds
« Respuesta #16 en: 29 de Octubre de 2008, 18:57:30 »
Esa rutina que hace cambiar el valor de la variable de 1 a 4 en forma cíclica, se la invoca de forma repetida hasta que se pulsa cualquiera de los 4 botones...
Cuando el programa empieza a ejecutar (tras reset), lo primero que se debe hacer es pulsar uno de los 4 botones para seleccionar el nivel de dificultad de entre 4 posibles (velocidad). Esa pulsación que fija el nivel de dificultad del juego determinará el primer valor aleatorio, o sea, el primer color...cuando el pic muestre el color y te toque repetir la secuencia, la primera pulsación que efectúes fijará el siguiente valor aleatorio...y así en cada secuencia...siempre la primera pulsación de cada secuencia de colores es la que determina el momento en que se captura el valor de la variable aleatoria y por tanto el color que se añadirá a la siguiente vez
« Última modificación: 29 de Octubre de 2008, 19:00:36 por Modulay »

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Simon game con 3 leds
« Respuesta #17 en: 29 de Octubre de 2008, 19:10:02 »
Haber, como lo entendí no sería aleatorio, y pensando y releyendo se me ocurrió que podía ser así:

Reset, Primer valor aleatorio luego de pulsar el botón, digamos botón 2.

Muestra el color correspondiente y mientras espera que el usuario presione el botón correspondiente. La rutina aleatiorio, hace cambiar el valor dentro de los cuatro valores posibles. Como es la opción 2, el tiempo que tiene el usuario es de 100 ms, y dentro de ese tiempo, se ejecuta la función aleatorio que hace cambiar muchas veces la RAM en donde se guarda el valor aleatorio.

Depende del tiempo que tarde el usuario en presionar la tecla, influirá el siguiente valor.

¿Es así?
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Simon game con 3 leds
« Respuesta #18 en: 29 de Octubre de 2008, 19:38:44 »
Efectivamente.

Es el factor humano el que determina el valor aleatorio, en función del tiempo que deja transcurrir desde que se termina de mostrar la secuencia hasta que se pulsa el primer botón cuando al jugador le toca repetirla.


Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Simon game con 3 leds
« Respuesta #19 en: 29 de Octubre de 2008, 20:38:33 »
Gracias.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado manikuy

  • PIC10
  • *
  • Mensajes: 2
Re: Simon game con 3 leds
« Respuesta #20 en: 10 de Mayo de 2012, 02:39:16 »
Yo monté uno de estos hace ya tiempo,aunque lo programé en C.
Para obtener colores de forma aleatoria usaba la primera pulsación de entre los botones para capturar el valor de una variable que iba cambiando de valor

Los 4 botones van conectados a RB4-RB7.
El altavoz va conectado a RB3.
Los 4 leds van conectados a RA0-RA3.

Código: C++
  1. /******************************** ESPECIFICACIONES *****************************
  2.  
  3.  El dispositivo físico consta de cuatro leds (rojo,verde,amarillo y azul)
  4.  conectados a RA0,RA1,RA2 y RA3 (en ese orden),de un altavoz conectado a RB3
  5.  y de cinco pulsadores.
  6. Los 4 pulsadores,que corresponden a cada uno de los leds,están conectados a RB4,RB5,RB6
  7.  y RB7.Tanto los leds como los pulsadores son activos a nivel alto.
  8.  
  9. *******************************************************************************/
  10.  
  11.  
  12.  
  13. /*******************
  14. *   PREPROCESADO   *
  15. ********************/
  16.  
  17. #include <16F84.h>
  18. #use delay(clock=4000000)
  19. #use fast_io(A)
  20. #use fast_io(B)
  21. #fuses XT,NOWDT,NOPUT
  22.  
  23. /****************************************
  24. *  DEFINICIÓN DE ETIQUETAS Y VARIABLES  *
  25. *****************************************/
  26.  
  27. #byte   PORTA = 0x05      // Puerto A
  28.  
  29. #byte   PORTB = 0x06      // Puerto B y bits utilizados
  30. #bit  RB3 = 0x06.3
  31. #bit  RB4 = 0x06.4
  32. #bit  RB5 = 0x06.5
  33. #bit  RB6 = 0x06.6
  34. #bit  RB7 = 0x06.7
  35.  
  36. #byte   INTCON = 0x0B
  37.  
  38. int aleatorio,dir_lectura,dir_escritura,color_leido,leido,color_pulsado,nivel;
  39. short fin_juego;
  40.  
  41.  
  42. /***************
  43. *  SUBRUTINAS  *
  44. ****************/
  45.  
  46.  
  47. void retardo(int latencia)
  48.    {
  49.    switch(latencia)
  50.       {
  51.       case 1: delay_ms(200);       // Correspondiente al nivel 1
  52.       break;
  53.       case 2: delay_ms(100);       // Nivel 2
  54.       break;
  55.       case 3: delay_ms(50);        // Nivel 3
  56.       break;
  57.       case 4: delay_ms(15);        // Nivel 4
  58.       break;
  59.       default:
  60.       break;
  61.       }
  62.    }
  63.  
  64.  
  65. void altavoz(int tono)  // Para generar un sonido diferente para cada color
  66.    {
  67.    int i,j;
  68.    for(i=0; i<=40; i++)
  69.      {
  70.      for(j=0; j<=4; j++)
  71.        {
  72.        output_high(PIN_B3);      // La distancia entre pulso y pulso viene determinada
  73.        delay_us(300*(6-tono));   //  por el parámetro tono
  74.        output_low(PIN_B3);
  75.        delay_us(300*(6-tono));
  76.        }
  77.      }
  78.    }
  79.  
  80.  
  81. void antirebote()
  82.    {
  83.    delay_ms(30);
  84.    while(PORTB != 0) {}  // No progresamos hasta que ningún pulsador esté activo
  85.    delay_ms(30);
  86.    }
  87.  
  88.  
  89. void comprueba()
  90.    {
  91.    leido = read_eeprom(dir_lectura);  // Leemos la dirección eeprom correspondiente.
  92.    if(leido != color_pulsado)         // Si la pulsación no ha sido correcta,acaba el
  93.     {                                 //  juego y volvemos al principio del programa
  94.     fin_juego = true;
  95.     }
  96.    }
  97.  
  98.  
  99. void enciende_led(int color)  // Enciende el led correspondiente
  100.    {
  101.    switch(color)
  102.       {
  103.       case 1: output_high(PIN_A0);     // Led rojo
  104.       break;
  105.       case 2: output_high(PIN_A1);     // Led verde
  106.       break;
  107.       case 3: output_high(PIN_A2);     // Led amarillo
  108.       break;
  109.       case 4: output_high(PIN_A3);     // Led azul
  110.       break;
  111.       default: PORTA = 15;             // Los 4 leds
  112.       break;
  113.       }
  114.    }
  115.    
  116.    
  117. void genera_aleatorio()  
  118.    {                      
  119.    if(aleatorio == 4)         // 1 -> ROJO
  120.     {                         // 2 -> VERDE
  121.     aleatorio = 1;            // 3 -> AMARILLO
  122.     }else {                   // 4 -> AZUL
  123.     aleatorio++;
  124.     }
  125.    }
  126.    
  127.    
  128. void guarda_color()
  129.    {
  130.    write_eeprom(dir_escritura,aleatorio);  // Guardamos el color generado y apuntamos a
  131.    dir_escritura++;                        //  la siguiente dirección para una próxima
  132.    }                                       //  escritura
  133.  
  134.  
  135. void escoge_nivel()      // El led que se mantiene encendido corresponde al nivel elegido
  136.    {
  137.    boolean sale = FALSE;
  138.    nivel = 1;
  139.    PORTA = 0;
  140.    output_high(PIN_A0);  // Por defecto,encendemos el led rojo (nivel 1).
  141.    aleatorio = 1;
  142.    while(!sale)              
  143.       {
  144.       genera_aleatorio();            
  145.       if(RB4)
  146.        {
  147.        nivel = 1;
  148.        PORTA = 0;
  149.        output_high(PIN_A0);      // Nivel 1 - > led rojo encendido
  150.        sale = true;
  151.        antirebote();
  152.        }else if(RB5) {
  153.         nivel = 2;
  154.         PORTA = 0;
  155.         output_high(PIN_A1);     // Nivel 2 - > led verde encendido
  156.         sale = true;
  157.         antirebote();
  158.        }else if(RB6) {
  159.         nivel = 3;
  160.         PORTA = 0;
  161.         output_high(PIN_A2);     // Nivel 3 - > led amarillo encendido
  162.         sale = true;
  163.         antirebote();
  164.        }else if(RB7) {
  165.         nivel = 4;
  166.         PORTA = 0;
  167.         output_high(PIN_A3);     // Nivel 4 - > led azul encendido
  168.         sale = true;
  169.         antirebote();
  170.        }else {
  171.         sale = false;
  172.        }
  173.       }
  174.    PORTA = 15;            // Una vez hemos escogido nivel,se encienden los 4 leds
  175.    delay_ms(1000);        //  para indicar que podemos empezar a jugar
  176.    PORTA = 0;
  177.    delay_ms(500);
  178.    }
  179.  
  180.  
  181. void has_fallado(int tono)     // Si entramos aquí es que hemos pulsado incorrectamente
  182.    {
  183.    int i,j;
  184.    enciende_led(color_pulsado);
  185.    for(i=0; i<=100; i++)          // Generamos tono de error (más grave)
  186.      {
  187.      for(j=0; j<=4; j++)
  188.        {
  189.        output_high(PIN_B3);
  190.        delay_ms(1*(6-tono));
  191.        output_low(PIN_B3);
  192.        delay_ms(1*(6-tono));
  193.        }
  194.      }
  195.    delay_ms(1000);
  196.    }
  197.  
  198.  
  199. void muestra_colores()
  200.    {
  201. // Desde el primero hasta el último que se ha guardado en memoria,los vamos mostrando
  202. //  con una rapidez que vendrá determinada por el nivel de dificultad elegido al principio.
  203.    for(dir_lectura = 0; dir_lectura < dir_escritura; dir_lectura++)
  204.       {
  205.       color_leido = read_eeprom(dir_lectura);   // Lectura eeprom
  206.       enciende_led(color_leido);                // Enciende led correspondiente
  207.       altavoz(color_leido);                     // Emite tono
  208.       retardo(nivel);                           // Retardo según nivel de dificultad
  209.       PORTA = 0;                                // Apaga led
  210.       retardo(nivel);                           // Retardo según nivel de dificultad
  211.       }
  212.    }
  213.  
  214.  
  215. void pulsa_secuencia()
  216.    {
  217.    short sal;
  218.    dir_lectura = 0;
  219.    aleatorio = 1;
  220. // Recogemos las pulsaciones y se va comprobando si son correctas hasta que
  221. //  alguna no lo sea o hasta que hayamos acertado todos los colores guardados
  222. //  hasta el momento.
  223. // dir_escritura contiene la dirección eeprom siguiente al último color guardado
  224. //  y dir_lectura la usamos para ir consultando cada posición de memoria y comprobar
  225. //  si la pulsación ha sido correcta.En el momento en que fallemos alguna,fin_juego toma
  226. //  el valor TRUE.
  227. // Durante la ejecución del bucle,aleatorio irá cambiando de valor,hasta que pulsemos el
  228. //  último color,momento en el cual salimos del bucle y guardamos aleatorio en memoria.
  229.    while((dir_lectura < dir_escritura) && (!fin_juego))
  230.       {
  231.       sal = false;
  232.       while(!sal)  // Mientras no haya pulsación nos mantenemos dentro del bucle
  233.          {
  234.          genera_aleatorio();           // Para conseguir aleatoriedad en los colores guardados
  235.          if(input(PIN_B4))             // Se ha pulsado el rojo,salimos del bucle
  236.           {
  237.           color_pulsado = 1;
  238.           sal = true;
  239.           }else if(input(PIN_B5)) {    // Se ha pulsado el verde,salimos del bucle
  240.           color_pulsado = 2;
  241.           sal = true;
  242.           }else if(input(PIN_B6)) {    // Se ha pulsado el amarillo,salimos del bucle
  243.           color_pulsado = 3;
  244.           sal = true;
  245.           }else if(input(PIN_B7)) {    // Se ha pulsado el azul,salimos del bucle
  246.           color_pulsado = 4;
  247.           sal = true;
  248.           }else {                      // No se ha pulsado ninguno,continuamos
  249.           sal = false;                 //  dentro del bucle
  250.           }
  251.          }
  252.       comprueba();   // Algoritmo que comprueba si la pulsación ha sido correcta
  253.       enciende_led(color_pulsado);  // Enciende el led del color que hemos pulsado
  254.       altavoz(color_pulsado);       // Genera el tono del color que hemos pulsado
  255.       antirebote();                 // No comment
  256.       PORTA = 0;                    // Apagamos led
  257.       dir_lectura++;                // Para comprobar la siguiente dirección eeprom
  258.       }
  259.    }
  260.  
  261.  
  262. /*********************
  263. * PROGRAMA PRINCIPAL *
  264. **********************/
  265.  
  266.  
  267. void main()
  268.    {
  269. // Inicialización periféricos
  270.    set_tris_B(0b11110000);    // RB4,RB5,RB6 y RB7 entradas --- RB0,RB1,RB2 Y RB3 salidas
  271.    set_tris_A(0b00000000);    // Todo salidas
  272.    output_low(PIN_B0);               // RB0 no la usamos
  273.    output_low(PIN_B1);               // RB1 no la usamos
  274.    output_low(PIN_B2);               // RB2 no la usamos
  275.    output_low(PIN_B3);               // RB3 conectado al altavoz
  276.    INTCON=0;
  277.    enable_interrupts(INT_EEPROM); // Unica interrupción habilitada durante toda la ejecución
  278.    enable_interrupts(GLOBAL);     // Habilitador general de interrupciones
  279.  
  280. // Bucle principal (Se ejecuta de forma indefinida)
  281.    for(;;)
  282.      {
  283.      dir_escritura = dir_lectura = color_leido = leido = color_pulsado = 0;  // Inicializamos variables
  284.      fin_juego = false;
  285.      aleatorio = 1;
  286.      escoge_nivel();          // Para escoger entre 4 niveles de dificultad
  287.      guarda_color();          // Guardamos en en memoria el valor que tenga aleatorio
  288.      while(!fin_juego)
  289.         {
  290.         muestra_colores();       // Mostramos colores guardados hasta el momento
  291.         pulsa_secuencia();       // Recogemos pulsaciones
  292.         guarda_color();          // Guardamos color en memoria el valor de aleatorio
  293.         if(!fin_juego)        // Cada vez que acertamos una secuencia completa,encendemos
  294.          {                    //  los 4 leds y generamos tres tonos musicales
  295.          enciende_led(5);     //
  296.          altavoz(1);          //
  297.          altavoz(2);          //
  298.          altavoz(4);          //
  299.          PORTA = 0;           //
  300.          delay_ms(1000);      //
  301.          }                  
  302.         }
  303.      has_fallado(4);     // Si hemos salido del bucle anterior es porque hemos fallado,de
  304.      }                   //  aquí volvemos al principio del bucle principal.
  305.    }

Hola amigo no s si me podrias pasar el codigo pero para 8 leds porfavor te lo agradecieria mucho