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

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

Desconectado LinuzPro

  • PIC10
  • *
  • Mensajes: 12
Simon game con 3 leds
« en: 25 de Octubre de 2008, 21:36:08 »
Hola amigos de la lista,estoy tratando de hacer un juego conocido como "Simon Say" pero con 3 leds en vez de 4 como tiene el juego,pero la verdad que mis conocimientos de assembler son muy basicos y no se donde tengo que modificar el programa para que sea solo para 3 leds,adjunto el esquematico y el codigo en assembler,si alguien me pudiera dar una mano con esto me seria de gran ayuda.Desde ya muchas gracias.
« Última modificación: 25 de Octubre de 2008, 21:41:48 por LinuzPro »
"Saber olvidar lo malo, tambien es tener memoria"

Desconectado clements3rd

  • PIC10
  • *
  • Mensajes: 24
Re: Simon game con 3 leds
« Respuesta #1 en: 27 de Octubre de 2008, 13:19:21 »
Hola! Que tal?

La verdad desconozco en que consiste este juego. Quizá si dieras una explicacion de como funciona o como es, se te podria ayudar mejor.

Saludos!

Desconectado LinuzPro

  • PIC10
  • *
  • Mensajes: 12
Re: Simon game con 3 leds
« Respuesta #2 en: 27 de Octubre de 2008, 13:31:52 »
hola,gracias por responder,el juego es muy simple,tenes que seguir una secuencia que se crea en forma aleatoria, lo tome de una pagina http://www.talkingelectronics.com/projects/Simon/SimonP1.html pero lo estoy tratando de modificar para 3 leds nada mas,estoy tratando de hacer algunas modificaciones pero no logro hacerlo solo para 3 leds.Saludos.
"Saber olvidar lo malo, tambien es tener memoria"

Desconectado clements3rd

  • PIC10
  • *
  • Mensajes: 24
Re: Simon game con 3 leds
« Respuesta #3 en: 27 de Octubre de 2008, 13:40:58 »
Bueno, si es eso lo que deseas hacer, aparentemente solo tienes que quitar toda referencia a uno de los led's. Suponiendo que vas a quitar el D4, tendrias que quitar las referencias de bsf, bcf, btfsc o btfss referentes al PORTB,5.

Supongo que con eso bastaria. Intentalo a ver si funciona!

Saludos!

Desconectado LinuzPro

  • PIC10
  • *
  • Mensajes: 12
Re: Simon game con 3 leds
« Respuesta #4 en: 27 de Octubre de 2008, 16:30:32 »
me estoy rompiendo la cabeza pero me da siempre error 113  ,como que el micro no esta bien definido,cargue el archivo p16f628.inc,simon628.inc y el archivo simon628.asm en el proyecto de MPLAB.No se si soy yo o hay que modificar algo en el MPLAB una vez instalado.Segui estos pasos:

1º - crear un proyecto nuevo
2º - adjunte el archivo  simon628.asm en la carpeta Source Files
3º - adjunte los archivos p16f628.inc y simon628.inc en la carpeta Header Files
4º - build all...
"Saber olvidar lo malo, tambien es tener memoria"

Desconectado clements3rd

  • PIC10
  • *
  • Mensajes: 24
Re: Simon game con 3 leds
« Respuesta #5 en: 27 de Octubre de 2008, 17:41:32 »
Hola! Bueno,en realidad yo compilo con el MPASWIN, no se si es necesario hacer lo de los header con MPLAB, ya qu tengo entendido que es suficiente con el include <archivo.inc> que se hace iniciando el codigo asm.

En cuanto a todos los errores 113 que tienes, pues creo que es porque en el codigo no tienes definidos esos registros, o porque alguna etiqueta tiene uno de esos nombres y dicha etiqueta no existe.

Chequea eso porque dice:
Symbol not previously defined = Simbolo no definido previamente.

Saludos!

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Simon game con 3 leds
« Respuesta #6 en: 27 de Octubre de 2008, 19:11:01 »
Si le haces doble click en la línea del error, te llevará al error en el programa.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado LinuzPro

  • PIC10
  • *
  • Mensajes: 12
Re: Simon game con 3 leds
« Respuesta #7 en: 27 de Octubre de 2008, 19:23:33 »
Si en efecto cuando hago doble click me lleva a la linea con problema,pero en definitiva como mis conocimientos son muy basicos no se cual es la solucion.Gracias por la respuesta.
"Saber olvidar lo malo, tambien es tener memoria"

Desconectado LinuzPro

  • PIC10
  • *
  • Mensajes: 12
Re: Simon game con 3 leds
« Respuesta #8 en: 27 de Octubre de 2008, 23:00:45 »
Bueno,despues de tanto renegar con el MPLAB puede hacer las modificaciones y funciono correctamente,gracias a todos los que aportaron con su ayuda,el error era que tenia el key sensitive desactivado,y me reconocia las diferencias entre las mayusculas y las minusculas.Si a alguien el interesa el codigo final y la simulacion con el proteus estoy a sus ordenes.Saludos a todos y gracias.
"Saber olvidar lo malo, tambien es tener memoria"

Desconectado clements3rd

  • PIC10
  • *
  • Mensajes: 24
Re: Simon game con 3 leds
« Respuesta #9 en: 28 de Octubre de 2008, 14:42:21 »
Bueno,despues de tanto renegar con el MPLAB puede hacer las modificaciones y funciono correctamente,gracias a todos los que aportaron con su ayuda,el error era que tenia el key sensitive desactivado,y me reconocia las diferencias entre las mayusculas y las minusculas.Si a alguien el interesa el codigo final y la simulacion con el proteus estoy a sus ordenes.Saludos a todos y gracias.

Me alegra que hayas soluciondo tu problema. Pequeño detalle, pero te diste cuenta  :-)

Claro que nos interesa! Si puedes compartirlo, seria genial!

Saludos!

Desconectado LinuzPro

  • PIC10
  • *
  • Mensajes: 12
Re: Simon game con 3 leds
« Respuesta #10 en: 28 de Octubre de 2008, 19:32:18 »
Bueno gente,aca subo los archivos que simule y arme funcionando como corresponde,si alguien tiene alguna sugerencia para hacer estaria bueno,las modificaciones que hice son muy basicas...es lo que pude hacer ya que de assembler se muyyyyyy poco,uso mas C y PBP...saludos a todos.
"Saber olvidar lo malo, tambien es tener memoria"

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Simon game con 3 leds
« Respuesta #11 en: 28 de Octubre de 2008, 22:26:23 »
Consulta Linuz. ¿Has montado el circuito? Cada vez que empezas el juego, ¿se repite el orden de pulsar la tecla, o es aleatorio?
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado LinuzPro

  • PIC10
  • *
  • Mensajes: 12
Re: Simon game con 3 leds
« Respuesta #12 en: 29 de Octubre de 2008, 11:06:52 »
Consulta Linuz. ¿Has montado el circuito? Cada vez que empezas el juego, ¿se repite el orden de pulsar la tecla, o es aleatorio?

Hola,tengo el circuito montado en una placa experimental,funciona en forma aleatoria,yo le hice un par de cambios el unico defecto que tiene a veces la instruccion(no siempre)
     
        ShowRed:
   bsf   portb,LED_RED            ;turn on red led
   retlw   KEY_RED_SOUND      ;tone frequency

Como que aveces  no me toma como valido el pulsador , no si es porque hay algun problema porque elimine un puerto.Estoy analizando un poco el programa y desconfio que el tono producido en el programa es el problema.Saludos.
"Saber olvidar lo malo, tambien es tener memoria"

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Simon game con 3 leds
« Respuesta #13 en: 29 de Octubre de 2008, 11:28:36 »
Entónces lo voy a montar y analizar al programa, ya que quiero ver como hace la función aleatoria.

He estado mirando el programa con detalle, pero no logro entenderlo porqué hace algunas cosas.
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 #14 en: 29 de Octubre de 2008, 17:05:05 »
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.    }
« Última modificación: 29 de Octubre de 2008, 17:10:12 por Modulay »


 

anything