TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: manuelroin24 en 15 de Agosto de 2007, 20:25:14

Título: Codigo Numero Aleatorio ...
Publicado por: manuelroin24 en 15 de Agosto de 2007, 20:25:14
Hola amigotes necesito su ayuda es para generar un numero aleatorio, lo intente revisar pero no encuentro en que puedo haber equivocado, gracias de antemano.

Código: C
  1. #include <16F84A.h>
  2.  
  3. #FUSES NOWDT                    //No Watch Dog Timer
  4. #FUSES XT                       //Crystal osc <= 4mhz
  5. #FUSES NOPUT                    //No Power Up Timer
  6. #FUSES PROTECT                  //Code protected from reads
  7.  
  8. #use delay(clock=4000000)
  9.  
  10. #include <stdlib.h>
  11. #byte porta=0x05
  12.  
  13. int number;
  14. void main()
  15. {
  16.    disable_interrupts(GLOBAL);
  17.    set_tris_b(0);
  18.    set_tris_a(1);
  19.    srand(10);
  20.    
  21.    do {
  22.             if(bit_test(porta,0))
  23.                  {
  24.                       do{
  25.                             number = rand();
  26.                           }while(bit_test(porta,0));
  27.                   }
  28.        output_b(number);
  29.       }while(true);
  30. }
Título: Re: Codigo Numero Aleatorio ...
Publicado por: pelusac en 16 de Agosto de 2007, 15:38:39
En esta página hay un soberbio ejemplo de Vszener que creo te vendrá como anillo al dedo:

http://www.todopic.com.ar/foros/index.php?topic=4530.msg38904#msg38904

Saludos
Título: Re: Codigo Numero Aleatorio ...
Publicado por: jfh900 en 16 de Agosto de 2007, 15:40:22
¿Y cual es el problema?

Un saludo
Título: Re: Codigo Numero Aleatorio ...
Publicado por: manuelroin24 en 16 de Agosto de 2007, 19:12:21
Estoy siguiendo los ejemplos de VsZener pero no me funciona debe ser porque esta es una nueva version del CCS (4.038) y esa era una anterior y no se que cosa esta mal, me podrian dar una mano y decirme cual es mi error??? Me genera los numero aleatorios , pero de 0 a 32676 y yo quiero q el maximo generado sea 9 , ese es el problema.
Título: Re: Codigo Numero Aleatorio ...
Publicado por: jfh900 en 16 de Agosto de 2007, 19:26:44
Vale, ahoraestá claro el problema. Según lo puesto en el manualde CCS sobre rand():

The rand function returns a sequence of pseudo-random integers in the range of 0 to RAND_MAX.

Por lo tanto tienes que modificar RAND_MAX para cambiar el valor:

#ifdef  RAND_MAX
#undef RAND_MAX
#define RAND_MAX 9
#endif

Un saludo

Título: Re: Codigo Numero Aleatorio ...
Publicado por: manuelroin24 en 16 de Agosto de 2007, 19:31:01
Esa modificacion se hace directamente en la libreria??? pq asi si me salio, pero pense que se podia poner el limite en el mismo programa, sin tener q modificar la libreria. Disculpa por la terquedad    :(
Título: Re: Codigo Numero Aleatorio ...
Publicado por: jfh900 en 16 de Agosto de 2007, 19:35:31
Claro que lo puedes poner en el programa, pero muy importante, despues de llamar a la libreria, sin no, no tendrá efecto.

Un saludo
Título: Re: Codigo Numero Aleatorio ...
Publicado por: manuelroin24 en 16 de Agosto de 2007, 19:42:17
Código: C++
  1. #include <stdlib.h>
  2.  
  3. #define RAND_MAX 10
  4.  
  5. #byte porta=0x05
  6. int number;
  7. void main()
  8. {

Si era algo asi, no funciono amigo. La verdad no entiendo muy bien el orden q me indicas, puedes ayudarme ??
Título: Re: Codigo Numero Aleatorio ...
Publicado por: jfh900 en 16 de Agosto de 2007, 20:00:26
El programa deberia de funcionar así:

Código: C
  1. #include <stdlib.h>
  2.  
  3. #ifdef  RAND_MAX
  4. #undef RAND_MAX
  5. #define RAND_MAX 9
  6. #endif
  7.  
  8. #byte porta=0x05
  9.  
  10. int number;
  11.  
  12. void main(){

Ese es el orden que debe de tener y las seudo intrucciones a incluir.

Un saludo
Título: Re: Codigo Numero Aleatorio ...
Publicado por: manuelroin24 en 16 de Agosto de 2007, 20:04:01
Mi amigo siento decir esto pero me dio el mismo resultado, no entiendo cual es el problema , puede ser por la version de mi CCS ??? 4.038 probaste ese programa ??? gracias.
Título: Re: Codigo Numero Aleatorio ...
Publicado por: jfh900 en 16 de Agosto de 2007, 20:22:07
No deberia dar problemas. Tienes la simulación en Proteus para probar el programa?, si es así postealo junto con el programa para probarlo.

Un saludo
Título: Re: Codigo Numero Aleatorio ...
Publicado por: manuelroin24 en 16 de Agosto de 2007, 20:37:13
Adjunto el Hex. y pongo el programa en C, simulacion en Proteus 7.1 SP2


Código: C++
  1. #include <16F84A.h>
  2.  
  3. #FUSES NOWDT                    //No Watch Dog Timer
  4. #FUSES XT                       //Crystal osc <= 4mhz
  5. #FUSES NOPUT                    //No Power Up Timer
  6. #FUSES PROTECT                  //Code protected from reads
  7.  
  8. #use delay(clock=4000000)
  9. #byte porta=0x05
  10. #include <stdlib.h>
  11. #ifdef  RAND_MAX
  12. #undef RAND_MAX
  13. #define RAND_MAX 10
  14. #endif
  15.  
  16.  
  17. void main()
  18. {
  19.  
  20.       int number;
  21.  
  22.    srand(10);
  23.    disable_interrupts(GLOBAL);
  24.    set_tris_b(0);
  25.    set_tris_a(1);
  26.    
  27.    
  28.    do {
  29.        if(bit_test(porta,0))
  30.          {
  31.           do{
  32.                 number = rand();
  33.               }while(bit_test(porta,0));
  34.          }
  35.        output_b(number);
  36.       }while(true);
  37. }
Título: Re: Codigo Numero Aleatorio ...
Publicado por: jfh900 en 16 de Agosto de 2007, 20:59:40
Ya está probado, la solución es ponerlo delante de la llamada a la libreria:

Código: C
  1. #define RAND_MAX 9
  2. #include <stdlib.h>

Un saludo
Título: Re: Codigo Numero Aleatorio ...
Publicado por: manuelroin24 en 17 de Agosto de 2007, 11:10:31
Excelente mi amigo , disculpa las molestias, funciona perfecto, gracias!!! a seguir aprendiendo....
Título: Re: Codigo Numero Aleatorio ...
Publicado por: manuelroin24 en 17 de Agosto de 2007, 12:30:46
Muchas Gracias amigo aqui dejo el Codigo para el dado electronico jejejeje gracias!!!
Código: C++
  1. #include <16F84A.h>
  2.  
  3. #FUSES NOWDT                    //No Watch Dog Timer
  4. #FUSES XT                       //Crystal osc <= 4mhz
  5. #FUSES NOPUT                    //No Power Up Timer
  6. #FUSES PROTECT                  //Code protected from reads
  7.  
  8. #use delay(clock=4000000)
  9. #byte porta=0x05
  10.  
  11.  
  12. #define RAND_MAX 9
  13. #include <stdlib.h>
  14.  
  15.  
  16. void main()
  17. {
  18.  
  19.       int number;
  20.  
  21.    disable_interrupts(GLOBAL);
  22.    set_tris_b(0);
  23.    set_tris_a(1);
  24.    
  25.    
  26.    do {
  27.        if(bit_test(porta,0))
  28.          {
  29.           do{
  30.                 number = rand();
  31.               }while(bit_test(porta,0));
  32.          }
  33.        output_b(number);
  34.       }while(true);
  35. }
Título: Re: Codigo Numero Aleatorio ...
Publicado por: jfh900 en 17 de Agosto de 2007, 15:15:58
Gracias a tí por compartirlo.

Un saludo
Título: Re: Codigo Numero Aleatorio ...
Publicado por: Nocturno en 19 de Agosto de 2007, 04:23:38
Manuel, ¿has observado que siempre que enciendes el micro salen los mismos números aleatorios en secuencias iguales?
Título: Re: Codigo Numero Aleatorio ...
Publicado por: MGLSOFT en 19 de Agosto de 2007, 16:52:04
Y si, es asi ya que la semilla (rand) es la misma para todos los inicios.
Eso porque no toman la semilla de un lugar aleatorio, como podria ser el estado de una entrada analoga al aire, por ejemplo. :mrgreen: :mrgreen: