Autor Tema: Problema al comprobar un numero que ya ha salido antes !!!  (Leído 1765 veces)

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

Desconectado samshiel_pic

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 777
    • Electrónica·Ingenia
Problema al comprobar un numero que ya ha salido antes !!!
« en: 12 de Octubre de 2006, 12:02:30 »
Hola compañeros que tal? :P

Estoy haciendo un programa que me genere 6 numeros aleatorios para rellenar la primitiva  :mrgreen:. Su funcionamiento es el siguiente: primero realiza una animacion en los dos displays 7 segmentos y cuando este finaliza espera a que pulses un pulsador situado en el RA2. Cuando accionas éste genera un numero aleatorio ( mas bien semi-aleatorio) utilizando un divisor de 256 para el RTCC. Y así hasta siempre hasta que te muestre los seis numeros. Pero antes de mostrar el numero en el display tengo que realizar un par de pasos, desfragmentar el numero en decenas y unidades ; y comprobar que el numero obtenido al hazar no sea cero ni que el numero obtenido haya salido antes. Y hay esta mi problema que no me realiza bien la comprobacion del numero obtenido con los que ya tengo guardados en un matriz. :x

Me tiene loco ya!!! puesto que lo he realizado ya de varias maneras y no tengo ni idea porque no lo hace. Es muy sencillo el numero que obtengo lo guardo en una matriz cuenta [ x ] y "x" la incremento cuando genero otro numero.  Este paso ya lo he realizado en varios proyectos anteriores mas complejos que este y me han funcionado bien sin  problemas. Es mas los numeros grabados se guardan bien en la matriz, lo que pasa es que no me realiza la comprobacion del numero generado con el numero guardado.

Aqui pego el codigo y mas abajo la simulacion en PROTEUS ISIS.

Código: C
  1. /*____________________________________________________________________________*\
  2. ||                                                                            ||
  3. ||  SAMSHIEL_PIC"06                                                           ||
  4. ||  11/Septiembre/06                                                          ||
  5. ||                                                                            ||
  6. ||  Programa:  Facil_Primitiva                                                ||
  7. ||  Version:   1.0                                                            ||
  8. ||                                                                            ||
  9. ||  Dispositivo: PIC 16F648A         Compilador:    CCS vs3.249               ||
  10. ||  Entorno IDE: MPLAB IDE v7.20      Simulador:    Proteus 6.7sp3            ||
  11. ||                                                                            ||
  12. ||  Notas:  Proyecto para realizar mas facilmente la loteria primitiva        ||
  13. ||          y que mi padre no se calienta mas la cabeza con los numeritos.    ||
  14. ||                                                                            ||
  15. ||                                                                            ||
  16. ||                                                                            ||
  17. ||                                                                            ||
  18. ||                                                                            ||
  19. ||____________________________________________________________________________||
  20. \*----------------------------------------------------------------------------*/
  21.  
  22. //--------------- DIRECTRICES DE DISPOSITIVOS Y LIBRERIAS --------------------\\
  23.  
  24. #include <16f648a.h>                            //pic a utilizar
  25. #fuses XT,NOWDT,NOPROTECT,PUT,NOLVP             //ordenes para el programador
  26. #use delay (clock=4000000)                      //Fosc=4Mhz
  27. #byte port_a = 5
  28. #byte port_b = 6
  29. //----------------------------- SUBPROGRAMAS ---------------------------------\\
  30.  
  31. int numero,unidades,decenas,cuenta[7],veces,rotar,a,i,y,x;// Variables globales.
  32. unsigned int const disp[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F};
  33.  
  34. void Muestreo_7seg(int veces)  // bucle en que muestro en los 7seg el numero.
  35.    {
  36.    for(x=0;x<veces;x++)
  37.       {
  38.       output_high(PIN_A1);
  39.       output_low(PIN_A0);
  40.       delay_ms(15);
  41.       output_b(disp[unidades]);
  42.       output_high(PIN_A0);
  43.       output_low(PIN_A1);
  44.       delay_ms(15);
  45.       output_b(disp[decenas]);
  46.       }
  47.    }
  48.  
  49. //----------------------------------------------------------------------------\\
  50.  
  51. void aleatorio()        // Genero el numero semi-aleatorio
  52.    {
  53.    setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
  54.    numero = get_rtcc() % 49;
  55.    numero +=1;
  56.    }
  57.  
  58. //----------------------------------------------------------------------------\\
  59.  
  60. void Comprobacion()    
  61.    {
  62.    switch (numero)   //comprobacion de que el numero no es "0".
  63.       {
  64.       case 0:
  65.       aleatorio();
  66.       break;
  67.       }
  68.    for(a=1;a<7;a++)
  69.      {
  70.      if (cuenta[a]==numero)
  71.       {
  72.       aleatorio();
  73.       }
  74.      }
  75.    }
  76.  
  77. //----------------------------------------------------------------------------\\
  78.  
  79. void animacion(int rotar)     //animacion de comienzo y final
  80.    {
  81.    for(i=0;i<rotar;i++)
  82.       {
  83.       for(y=0;y<10;y++)
  84.          {
  85.          unidades=y;
  86.          decenas=y;
  87.          Muestreo_7seg(2);
  88.          }
  89.       }
  90.    }
  91.  
  92. //--------------------------- PROGRAMA PRINCIPAL -----------------------------\\
  93.  
  94. void main(VOID)
  95.    {
  96.    int e=1;
  97.    setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
  98.    while(1)
  99.      {
  100.      animacion(5);
  101.      for(e=1;e<7;y++) // un bucle for para mostrar solo 6 numeros
  102.       {
  103.       if(input(PIN_A2)) //---------- BOTON PARA OBTENER Nº ALEATORIO------------
  104.          {
  105.           while(input(PIN_A2));
  106.             {
  107.             delay_ms(30);
  108.             animacion(2);
  109.             aleatorio();  // genero el numero aleatorio
  110.             Comprobacion();  // aqui comprobaria que el num no sea 0 y que no se repita
  111.             decenas = numero / 10; // desfragmento el numero para mostrarlo
  112.             unidades = numero - (decenas * 10); // en el 7seg
  113.             cuenta[e] = numero;  // guardo el numero en cuenta
  114.             Muestreo_7seg(65); // y finalmente lo muestro en el 7seg
  115.             e++;
  116.             }
  117.          }
  118.        }
  119.       animacion(1);
  120.       reset_cpu(); // una vez mostrado los 6 numeros reseteo el PIC.
  121.       }
  122.    }


Bueno el resto del programa es operativo al 100% a falta de este punto.
Haber si me podeis echar una manita :P yo creo que el cansancio y la cabezoneria de uno te evita ver la tonta solucion del problema.  :D

« Última modificación: 13 de Octubre de 2006, 16:38:05 por samshiel_pic »

Desconectado Mario_2004

  • PIC10
  • *
  • Mensajes: 30
Re: Problema al comprobar un numero que ya ha salido antes !!!
« Respuesta #1 en: 12 de Octubre de 2006, 14:16:04 »
Hola Candi, el problema lo tienes en el 'if' de la comprobación:

Código: [Seleccionar]
for(a=1;a<7;a++)
  {     
    if (cuenta[a]==numero);    // Elimina este punto y coma
      {
        aleatorio();
      }
  }
Elimina el ; y asunto solucionado.

saludos,

Mario

Desconectado samshiel_pic

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 777
    • Electrónica·Ingenia
Re: Problema al comprobar un numero que ya ha salido antes !!!
« Respuesta #2 en: 12 de Octubre de 2006, 16:24:47 »
pues gracias Mario_2004 pero no es eso  :(  lo del ; se me paso al escribirlo en el .c  corriendo puesto que antes habia usado switch con el valor de "a" pero tampoco y con lo del if tenia que funcionar seguro. Tiene que ser algo que se me este pasando por alto pero no lo veo  :x

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Problema al comprobar un numero que ya ha salido antes !!!
« Respuesta #3 en: 12 de Octubre de 2006, 16:47:03 »
Comprueba que cuenta[7] ... va de 0 a 6 y tu bucle va de i=1 a i=6 (i<7) ... a ver si van por ahí los tiros. Por si acaso te saltas comprobar el valor guardado en cuenta[0]

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado samshiel_pic

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 777
    • Electrónica·Ingenia
Re: Problema al comprobar un numero que ya ha salido antes !!!
« Respuesta #4 en: 12 de Octubre de 2006, 16:56:57 »
Bueno pues ya lo solucione  :mrgreen: :mrgreen: no se puede resistir ante mi este bichejo llamado PIC  :D

El fallo estaba en donde comparaba el numero generado con el numero guardado. Pues ahi si eran iguales generaba otro numero pero este no se comparaba de nuevo para ver si ya habia salido antes por lo que cuando comparaba y generaba uno nuevo este se escapaba de la comprobacion.

La solucion no es que sea muy vistosa e incluso se desaconseja el uso del goto pero a mi me ha venio al pelo  :mrgreen:

EL CODIGO ANTES

Código: C
  1. void Comprobacion()
  2.    {
  3.    switch (numero)   //comprobacion de que el numero no es "0".
  4.       {
  5.       case 0:
  6.       aleatorio();
  7.       break;
  8.       }  
  9.    for(a=1;a<7;a++)
  10.      {
  11.      if (cuenta[a]==numero)
  12.       {
  13.       aleatorio();     // este aleatorio antes no se comprobaba al generarse por lo que se podia repetir
  14.       }
  15.      }
  16.    }

EL CODIGO AHORA


Código: C
  1. void Comprobacion()
  2.    {
  3.    switch (numero)   //comprobacion de que el numero no es "0".
  4.       {
  5.       case 0:
  6.       aleatorio();
  7.       break;
  8.       }
  9. aqui:  a=1;  
  10.    for(a=1;a<7;a++)
  11.      {
  12.      if (cuenta[a]==numero)
  13.       {
  14.       aleatorio();     // Ahora no se escapa nunca sin comprobar jejejeje
  15.       goto aqui;
  16.       }
  17.      }
  18.    }

Lo he probado con los 49 numeros y no se a repetido ninguno lo he hecho aumentado el numero de variables de 7 a 50 y va de lujo. :mrgreen:

AQUI ESTA EL CODIGO COMPLETO PA QUIEN LO QUIERA MAÑANA PONDRE EL FOTOLITO PARA FINALIZAR ESTE TEMA.
Código: C
  1. /*____________________________________________________________________________*\
  2. ||                                                                            ||
  3. ||  SAMSHIEL_PIC"06                                                           ||
  4. ||  11/Septiembre/06                                                          ||
  5. ||                                                                            ||
  6. ||  Programa:  Facil_Primitiva                                                ||
  7. ||  Version:   1.0                                                            ||
  8. ||                                                                            ||
  9. ||  Dispositivo: PIC 16F648A         Compilador:    CCS vs3.249               ||
  10. ||  Entorno IDE: MPLAB IDE v7.20      Simulador:    Proteus 6.7sp3            ||
  11. ||                                                                            ||
  12. ||  Notas:  Proyecto para realizar mas facilmente la loteria primitiva        ||
  13. ||          y que mi padre no se calienta mas la cabeza con los numeritos.    ||
  14. ||                                                                            ||
  15. ||                                                                            ||
  16. ||                                                                            ||
  17. ||                                                                            ||
  18. ||                                                                            ||
  19. ||____________________________________________________________________________||
  20. \*----------------------------------------------------------------------------*/
  21.  
  22. //--------------- DIRECTRICES DE DISPOSITIVOS Y LIBRERIAS --------------------\\
  23.  
  24. #include <16f648a.h>                            //pic a utilizar
  25. #fuses XT,NOWDT,NOPROTECT,PUT,NOLVP             //ordenes para el programador
  26. #use delay (clock=4000000)                      //Fosc=4Mhz
  27. #byte port_a = 5
  28. #byte port_b = 6
  29. //----------------------------- SUBPROGRAMAS ---------------------------------\\
  30.  
  31. int numero,unidades,decenas,cuenta[7],veces,rotar,a,i,y,x;// Variables globales.
  32. unsigned int const disp[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F};
  33.  
  34. void Muestreo_7seg(int veces)  // bucle en que muestro en los 7seg el numero.
  35.    {
  36.    for(x=0;x<veces;x++)
  37.       {
  38.       output_high(PIN_A1);
  39.       output_low(PIN_A0);
  40.       delay_ms(15);
  41.       output_b(disp[unidades]);
  42.       output_high(PIN_A0);
  43.       output_low(PIN_A1);
  44.       delay_ms(15);
  45.       output_b(disp[decenas]);
  46.       }
  47.    }
  48.  
  49. //----------------------------------------------------------------------------\\
  50.  
  51. void aleatorio()        // Genero el numero semi-aleatorio
  52.    {
  53.    setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
  54.    numero = get_rtcc() % 49;
  55.    numero +=1;
  56.    }
  57.  
  58. //----------------------------------------------------------------------------\\
  59.  
  60. void Comprobacion()
  61.    {
  62.    switch (numero)   //comprobacion de que el numero no es "0".
  63.       {
  64.       case 0:
  65.       aleatorio();
  66.       break;
  67.       }
  68. aqui:  a=1;  
  69.    for(a=1;a<7;a++)
  70.      {
  71.      if (cuenta[a]==numero)
  72.       {
  73.       aleatorio();
  74.       goto aqui;
  75.       }
  76.      }
  77.    }
  78.  
  79. //----------------------------------------------------------------------------\\
  80.  
  81. void animacion(int rotar)     //animacion de comienzo y final
  82.    {
  83.    for(i=0;i<rotar;i++)
  84.       {
  85.       for(y=0;y<10;y++)
  86.          {
  87.          unidades=y;
  88.          decenas=y;
  89.          Muestreo_7seg(2);
  90.          }
  91.       }
  92.    }
  93.  
  94. //--------------------------- PROGRAMA PRINCIPAL -----------------------------\\
  95.  
  96. void main(VOID)
  97.    {
  98.    int e=1;
  99.    setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
  100.    while(1)
  101.      {
  102.      animacion(5);
  103.      for(e=1;e<7;y++) // un bucle for para mostrar solo 6 numeros
  104.       {
  105.       if(input(PIN_A2)) //---------- BOTON PARA OBTENER Nº ALEATORIO------------
  106.          {
  107.           while(input(PIN_A2));
  108.             {
  109.             delay_ms(30);
  110.             animacion(2);
  111.             aleatorio();  // genero el numero aleatorio
  112.             Comprobacion();  // aqui comprobaria que el num no sea 0 y que no se repita
  113.             decenas = numero / 10; // desfragmento el numero para mostrarlo
  114.             unidades = numero - (decenas * 10); // en el 7seg
  115.             cuenta[e] = numero;  // guardo el numero en cuenta
  116.             Muestreo_7seg(65); // y finalmente lo muestro en el 7seg
  117.             e++;
  118.             }
  119.          }
  120.        }
  121.       animacion(1);
  122.       reset_cpu(); // una vez mostrado los 6 numeros reseteo el PIC.
  123.       }
  124.    }





PD. Repito que se de buena tinta que se desaconseja usar el GOTO en C pero no tenia ganas de calentarme mas los cascos y esta probado y funciona jejeje. :P
« Última modificación: 13 de Octubre de 2006, 16:52:24 por samshiel_pic »

Desconectado samshiel_pic

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 777
    • Electrónica·Ingenia
Re: Problema al comprobar un numero que ya ha salido antes !!!
« Respuesta #5 en: 12 de Octubre de 2006, 16:59:37 »
Hola Diego que tal?? :P si eso ya lo habia probado. Incluso modifique el programa para que me mostrara en cada caso el numero que se alojaba en las posiciones de cuenta cada vez que guardaba uno en ella e iva bien. El problema es que se escapaba por ahi el jodio  :mrgreen:

Ah!! he borrado el archivo .rar de antes para que no se acumulen archivos inutiles en el foro y así haya mas espacio para colgar cosas. Solo he dejado el .hex del programa bueno y en la foto se ve el esquema en ISIS.
« Última modificación: 13 de Octubre de 2006, 16:55:21 por samshiel_pic »