Autor Tema: Duda con el proyecto de Simon Says  (Leído 3487 veces)

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

Desconectado andyros

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 70
Duda con el proyecto de Simon Says
« en: 18 de Enero de 2016, 12:53:51 »
Hola a todos ....os cuento lo que me pasa...hasta ahora me he apañado muy bien realizando mis mini proyectos con microcontroladores pic en lenguaje ensamblador ( asm) , pero he decidido dar el paso al lenguaje C con el compilador CCS ( version 5.0.15 ) , bien...habia decidido realizar el juego simon says que esta en este post del  foro http://www.todopic.com.ar/foros/index.php?topic=2456.0 y modificar un par de cosas del proyecto inicial .

Monte mi placa board y grabe el pic con el  archivo hex simunpic2.0 que dejo el amigo Modulay,  lo grabo con el pickit3 , y funciona perfectamente.

Ahora viene lo extraño,  si abro el archivo codigo C con el CCS y sin tocar nada lo compilo y grabo el hex me funciona como si dijeramos a camara lenta ,es decir los tiempos no son correctos ,  ya le he dado mil vueltas y algo se me escapa,,,, os dejo el archivo C por si quereis echarle un vistazo.
UN SALUDO.

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Duda con el proyecto de Simon Says
« Respuesta #1 en: 18 de Enero de 2016, 13:25:56 »
Realmente lo unico que puede estar fallando es el tema de los delays y que colocaste mal la frecuencia aca:

#use delay(clock=10000000)

Podrias decir que XTAL estas usando ?

PD: El codigo esta bueno, pero cambiaria completamente la lectura/escritura de la EEPROM por una lectura/escritura de RAM. Ya que no tiene sentido usar la EEPROM para esto y seria un desperdicio.

Desconectado andyros

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 70
Re:Duda con el proyecto de Simon Says
« Respuesta #2 en: 18 de Enero de 2016, 14:04:47 »
Estoy usando 10 Mhz , y funciona ok con el hex  que esta en el post , pero si lo compilo yo ( sin tocar nada )  , no funciona ,,  es muy raro.
Ademas he modificado para que funcione con el oscilador interno a 4 Mhz y me hace lo mismo..........

Estoy totalmente de acuerdo que utilizar la EEPROM no tiene sentido ,
« Última modificación: 18 de Enero de 2016, 14:23:22 por andyros »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Duda con el proyecto de Simon Says
« Respuesta #3 en: 18 de Enero de 2016, 14:55:18 »
Citar
stoy usando 10 Mhz , y funciona ok con el hex  que esta en el post

Si pero el .hex que esta en ese post habla de 4Mhz.. Con lo que si tenes 10Mhz es mucho mas rapido. algo asi de 2 veces mas rapido.
Si queres que te funcione de la misma forma tenes 2 opciones.

1- Hacer los delays mas pequeños y mantener el puesta la frecuencia como 10Mhz
2- Cambiarle el delay(clock=xxx) por 4Mhz.

Hay tantos delays en ese programa :/
Yo digo para no tener que modificar todo el programa.

es use delay(clock=x) lo que hace nomas es usar el valor que se da para calcular los ciclos para el tiempo pedido. Nada mas, si pones 10Mhz ahi, CCS calcula 200ms en ciclos para 10Mhz, eso nomas.

Desconectado andyros

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 70
Re:Duda con el proyecto de Simon Says
« Respuesta #4 en: 18 de Enero de 2016, 16:07:38 »
El que yo he utilizado esta en el ultimo post y es una mejora que hizo Modulay....simupic 2.0 ...este es con un pic 16f88 y clock a 10Mhz .
En el primer post es con un pic 16f84 y 4 Mhz.

UN SALUDO.

P.D. Estoy pensando que el programa ccs no se haya instalado correctamente y por eso no compile bien .......por probar algo ....alguien puede compilar el programa y pasarme el archivo .hex y lo pruebo asi voy descartando que no funcione bien el programa CCS.......
Aqui lo teneis si alguien me lo compile y me pasa el hex. , se lo agradeceria..

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

UN SALUDO.
« Última modificación: 18 de Enero de 2016, 19:26:42 por andyros »

Desconectado andyros

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 70
Re:Duda con el proyecto de Simon Says
« Respuesta #5 en: 26 de Marzo de 2016, 06:08:05 »
Hola de nuevo , pues todavia sigo dandole vueltas y no consigo dar con el problema, tengo el proyecto montado en una placa board y si le pongo el hex original funciona correctamente .


Como ya os comente quiero modificar unas rutinas  a mi gusto pero no consigo que funcione ni si quiera al compilar sin modificar nada.


aqui puse una sequencia para ver si se respetaban los tiempos , los tiempos estan ok, es decir trabaja con oscilador interno a 4 Mhz

Bueno a ver si podeis orientarme un poco .

UN SALUDO.

Código: [Seleccionar]
                 /******************* SIMON *********************
                  *                                             *
                  *                  By Biot                    *
                  *                 S.I.T.T.M                   *
                  *                                             *
                  ***********************************************/

/******************************** ESPECIFICACIONES *****************************

 El dispositivo físico consta de cuatro leds (rojo,verde,amarillo y azul)
 conectados a RA0,RA1,RA2 y RA3 (en ese orden),de un altavoz conectado a RB3
 y de cinco pulsadores.
 Un pulsador está conectado a RB0 (para generar el color aleatorio) y los otros
 cuatro,que corresponden a cada uno de los leds,están conectados a RB4,RB5,RB6
 y RB7.Los pulsadores son activos a nivel alto.Los leds son activos a nivel bajo.

*******************************************************************************/



/*******************
*   PREPROCESADO   *
********************/

#include <16F628a.h>
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
#fuses NOWDT,NOPUT,INTRC_IO, NOMCLR,NOLVP

/****************************************
*  DEFINICIÓN DE ETIQUETAS Y VARIABLES  *
*****************************************/

#byte   PORTA = 0x05      // Puerto A

#byte   PORTB = 0x06      // Puerto B y bits utilizados
#bit  RB3 = 0x06.3
#bit  RB4 = 0x06.4
#bit  RB5 = 0x06.5
#bit  RB6 = 0x06.6
#bit  RB7 = 0x06.7

#byte   INTCON = 0x0B
#byte   CMCON = 0x1F

int aleatorio,dir_lectura,dir_escritura,color_leido,leido,color_pulsado,nivel;
short fin_juego;


/***************
*  SUBRUTINAS  *
****************/


void retardo(int latencia)
   {
   switch(latencia)
      {
      case 1: delay_ms(200);       // Correspondiente al nivel 1
      break;
      case 2: delay_ms(100);       // Nivel 2
      break;
      case 3: delay_ms(50);        // Nivel 3
      break;
      case 4: delay_ms(15);        // Nivel 4
      break;
      default:    // :
      break;
      }
   }


void altavoz(int tono)  // Para generar un sonido diferente para cada color
   {
   int i,j;
   for(i=0; i<=40; i++)   //
     {
     for(j=0; j<=4; j++)
       {
       output_high(PIN_B3);      // La distancia entre pulso y pulso viene determinada
       delay_us(300*(6-tono));   //  por el parámetro tono
       output_low(PIN_B3);
       delay_us(300*(6-tono));
       }
     }
   }


void antirebote()
   {
   delay_ms(30);
   while(PORTB != 0) {}  // No progresamos hasta que ningún pulsador esté activo
   delay_ms(30);
   }


void comprueba()
   {
   leido = read_eeprom(dir_lectura);  // Leemos la dirección eeprom correspondiente.
   if(leido != color_pulsado)         // Si la pulsación no ha sido correcta,acaba el
    {                                 //  juego y volvemos al principio del programa
    fin_juego = true;
    }
   }


void enciende_led(int color)  // Enciende el led correspondiente
   {
   switch(color)
      {
      case 1: output_low(PIN_A0);     // Led rojo
      break;
      case 2: output_low(PIN_A1);     // Led verde
      break;
      case 3: output_low(PIN_A2);     // Led amarillo
      break;
      case 4: output_low(PIN_A3);     // Led azul
      break;
      default: PORTA = 0;             // Los 4 leds
      break;
      }
   }


void genera_aleatorio()
   {
   if(aleatorio == 4)         // 1 -> ROJO
    {                         // 2 -> VERDE
    aleatorio = 1;            // 3 -> AMARILLO
    }else {                   // 4 -> AZUL
    aleatorio++;
    }
   }


void guarda_color()
   {
   write_eeprom(dir_escritura,aleatorio);  // Guardamos el color generado y apuntamos a
   dir_escritura++;                        //  la siguiente dirección para una próxima
   }                                       //  escritura


void escoge_nivel()      // El led que se mantiene encendido corresponde al nivel elegido
   {
   boolean sale = FALSE;
   nivel = 1;
   PORTA = 15;
   delay_ms(100);
   output_low(PIN_A0);  // Por defecto,encendemos el led rojo (nivel 1).
   aleatorio = 1;
   while(!sale)
      {
      genera_aleatorio();
      if(RB4)
       {
       nivel = 1;
       PORTA = 15;
       output_low(PIN_A0);      // Nivel 1 - > led rojo encendido
       sale = true;
       antirebote();
       }else if(RB5) {
        nivel = 2;
        PORTA = 15;
        output_low(PIN_A1);     // Nivel 2 - > led verde encendido
        sale = true;
        antirebote();
       }else if(RB6) {
        nivel = 3;
        PORTA = 15;
        output_low(PIN_A2);     // Nivel 3 - > led amarillo encendido
        sale = true;
        antirebote();
       }else if(RB7) {
        nivel = 4;
        PORTA = 15;
        output_low(PIN_A3);     // Nivel 4 - > led azul encendido
        sale = true;
        antirebote();
       }else {
        sale = false;
       }
      }
   PORTA = 0;            // Una vez hemos escogido nivel,se encienden los 4 leds
   delay_ms(1000);        //  para indicar que podemos empezar a jugar
   PORTA = 15;
   delay_ms(1000);
   
   PORTA = 0;            // Una vez hemos escogido nivel,se encienden los 4 leds
   delay_ms(1000);        //  para indicar que podemos empezar a jugar
   PORTA = 15;
   delay_ms(1000);
   }


void has_fallado(int tono)     // Si entramos aquí es que hemos pulsado incorrectamente
   {
   int i,j;
   enciende_led(color_pulsado);
   for(i=0; i<=100; i++)          // Generamos tono de error (más grave)
     {
     for(j=0; j<=4; j++)
       {
       output_high(PIN_B3);
       delay_ms(1*(6-tono));
       output_low(PIN_B3);
       delay_ms(1*(6-tono));
       }
     }
   delay_ms(1000);
   }


void muestra_colores()
   {
// Desde el primero hasta el último que se ha guardado en memoria,los vamos mostrando
//  con una rapidez que vendrá determinada por el nivel de dificultad elegido al principio.
   for(dir_lectura = 0; dir_lectura < dir_escritura; dir_lectura++)
      {
      color_leido = read_eeprom(dir_lectura);   // Lectura eeprom
      enciende_led(color_leido);                // Enciende led correspondiente
      altavoz(color_leido);                     // Emite tono
      retardo(nivel);                           // Retardo según nivel de dificultad
      PORTA = 15;                                // Apaga led
      retardo(nivel);                           // Retardo según nivel de dificultad
      }
   }


void pulsa_secuencia()
   {
   short sal;
   dir_lectura = 0;
   aleatorio = 1;
// Recogemos las pulsaciones y se va comprobando si son correctas hasta que
//  alguna no lo sea o hasta que hayamos acertado todos los colores guardados
//  hasta el momento.
// dir_escritura contiene la dirección eeprom siguiente al último color guardado
//  y dir_lectura la usamos para ir consultando cada posición de memoria y comprobar
//  si la pulsación ha sido correcta.En el momento en que fallemos alguna,fin_juego toma
//  el valor TRUE.
// Durante la ejecución del bucle,aleatorio irá cambiando de valor,hasta que pulsemos el
//  último color,momento en el cual salimos del bucle y guardamos aleatorio en memoria.
   while((dir_lectura < dir_escritura) && (!fin_juego))
      {
      sal = false;
      while(!sal)  // Mientras no haya pulsación nos mantenemos dentro del bucle
         {
         genera_aleatorio();           // Para conseguir aleatoriedad en los colores guardados
         if(input(PIN_B4))             // Se ha pulsado el rojo,salimos del bucle
          {
          color_pulsado = 1;
          sal = true;
          }else if(input(PIN_B5)) {    // Se ha pulsado el verde,salimos del bucle
          color_pulsado = 2;
          sal = true;
          }else if(input(PIN_B6)) {    // Se ha pulsado el amarillo,salimos del bucle
          color_pulsado = 3;
          sal = true;
          }else if(input(PIN_B7)) {    // Se ha pulsado el azul,salimos del bucle
          color_pulsado = 4;
          sal = true;
          }else {                      // No se ha pulsado ninguno,continuamos
          sal = false;                 //  dentro del bucle
          }
         }
      comprueba();   // Algoritmo que comprueba si la pulsación ha sido correcta
      enciende_led(color_pulsado);  // Enciende el led del color que hemos pulsado
      altavoz(color_pulsado);       // Genera el tono del color que hemos pulsado
      antirebote();                 // No comment
      PORTA = 15;                    // Apagamos led
      dir_lectura++;                // Para comprobar la siguiente dirección eeprom
      }
   }


/*********************
* PROGRAMA PRINCIPAL *
**********************/


void main()
   {
// Inicialización periféricos
   set_tris_B(0b11110000);    // RB4,RB5,RB6 y RB7 entradas --- RB0,RB1,RB2 Y RB3 salidas
   set_tris_A(0b00000000);    // Todo salidas
   output_low(PIN_B0);               // RB0 no la usamos
   output_low(PIN_B1);               // RB1 no la usamos
   output_low(PIN_B2);               // RB2 no la usamos
   output_low(PIN_B3);               // RB3 conectado al altavoz
   CMCON = 7;
   INTCON=0;
   enable_interrupts(INT_EEPROM); // Unica interrupción habilitada durante toda la ejecución
   enable_interrupts(GLOBAL);     // Habilitador general de interrupciones

// Bucle principal (Se ejecuta de forma indefinida)
//   for(;;)
   for(;;)
     {
     dir_escritura = dir_lectura = color_leido = leido = color_pulsado = 0;  // Inicializamos variables
     fin_juego = false;
     aleatorio = 1;
     escoge_nivel();          // Para escoger entre 4 niveles de dificultad
     guarda_color();          // Guardamos en en memoria el valor que tenga aleatorio
     while(!fin_juego)
        {
        muestra_colores();       // Mostramos colores guardados hasta el momento
        pulsa_secuencia();       // Recogemos pulsaciones
        guarda_color();          // Guardamos color en memoria el valor de aleatorio
        if(!fin_juego)        // Cada vez que acertamos una secuencia completa,encendemos
         {                    //  los 4 leds y generamos tres tonos musicales
         enciende_led(5);     //
         altavoz(1);          //
         altavoz(2);          //
         altavoz(4);          //
         PORTA = 15;           //
         delay_ms(1000);      //
         }
        }
     has_fallado(4);     // Si hemos salido del bucle anterior es porque hemos fallado,de
     PORTA = 15;
     delay_ms(1000);
     muestra_colores();
     delay_ms(1000);
     }                   //  aquí volvemos al principio del bucle principal.
   }



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Duda con el proyecto de Simon Says
« Respuesta #6 en: 26 de Marzo de 2016, 06:26:07 »
No creo que los tiempos esten bien... el tono es distinto, la velocidad es distinta. Hay un error de velocidad.

Lo que haria es compilar el archivo con FUSE XT y probarlo con un cristal, si funciona entonces es problema del oscilador interno o  de configuracion del FUSE

Desconectado andyros

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 70
Re:Duda con el proyecto de Simon Says
« Respuesta #7 en: 28 de Marzo de 2016, 11:07:49 »
Ya lo he probado , con cristal de 4Mhz , mismo resultado , funciona a velocidad muy lenta, he vuelto a probar el programa original que viene con un pic 16f88 y un cristal de 10 Mhz y mismo resultado velocidad muy lenta ,todo esto si lo compilo yo .

Pero con el archivo hex que puso Modulay funciona correctamente con pic 16f88 y 10 Mhz .
Tambien lo he probado con el hex que se colgo en otro foro para un un pic 16f628a con cristal interno y funcionan bien los tiempos.

O yo lo compilo mal o en el programa que subio Modulay hay un error........ :(

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Duda con el proyecto de Simon Says
« Respuesta #8 en: 28 de Marzo de 2016, 13:42:04 »
Intenta dejar un cristal.. por ejemplo el de 4Mhz y modifica esto:

#use delay(clock=4000000)

ponelo en

#use delay(clock=1000000)


Tal ves cuando hizo el programa se equivoco, sino luego me provees el .hex asi veo la duracion en ciclos de un delay y podemos obtener la frecuencia que estuvo usando.

Desconectado andyros

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 70
Re:Duda con el proyecto de Simon Says
« Respuesta #9 en: 28 de Marzo de 2016, 15:44:18 »
Nada ,  los tiempos no son correctos , te dejo el hex que funciona para el pic 16f88 con cristal externo 10 Mhz , y para el pic 16f628a que tambien funciona con cristal interno .

16f88 hex

https://mega.nz/#!rsZWWKZQ!1GEjhtriYjRY0jZrJOjf3IQhmLSRgYOdA0Dks8wx7WQ

16f628a hex

https://mega.nz/#!yhxGGLYa!bixKZ5NPcG3qjHilQ4LR7G5qr3Ojry137DruP2xzgUA


 

anything