Autor Tema: Numeros aleatorios de 0 hasta 65535 en la pantalla lcd  (Leído 5217 veces)

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

Desconectado lavidtz

  • PIC10
  • *
  • Mensajes: 13
Numeros aleatorios de 0 hasta 65535 en la pantalla lcd
« en: 28 de Noviembre de 2006, 23:16:58 »
Hola a todos,soy un estudiante de electrónica de alicante y tengo una pregunta que me trae de cabeza con un programa,a ver si entre todos me podeis ayudar.

Tengo que hacer un programa que me saque por el lcd un número aleatorio que va del 0 hasta el 65535 cada vez que pulso RA4.

Lo he sabido hacer del 0 hasta el 99, pero de ahí no paso,porque no domino muy bien las formulas para sacar un número mayor.

Aquí os dejo mi programa que he realizado con el pic 16f84:



#include <16f84.h>
#use delay(clock=4000000,RESTART_WDT)
#use fast_io(A)
#use fast_io(B)
#include <lcd2.c>

int c;
int dir=1;
void Visualizar_1() // Esta es la formula que no se ampliar para añadia más dígitos.
{
  lcd_gotoxy(dir,2);
  lcd_putc('0'+c/10);       
  lcd_putc('0'+c%10);
 
}

main() {

  lcd_init();   // Comandos de inicialización del LCD.
  lcd_gotoxy(3,1);
  lcd_putc("Num aleatorios");
  delay_ms(1000);

   while(1)
  {
      c++;
      delay_ms(1);
      if(c > 99) //Para que me vaya lo tengo hasta el 99 pero lo tengo que hacer hasta el              c = 1;     //65536.
     

    if(input(PIN_A4) )
    {
      delay_ms(20);

      Visualizar_1();

     while(input(PIN_A4))
        restart_wdt();
      delay_ms(20);
    }
  }
}


Se lo agradecería a quien me pueda ayudar con la solución a este programita, he buscado en todo el foro y no he encontrado nada parecido que me ayude a resolverlo.

Gracias.

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Numeros aleatorios de 0 hasta 65535 en la pantalla lcd
« Respuesta #1 en: 28 de Noviembre de 2006, 23:48:53 »
Me parece que en la librería STDLIB.H hay una función srand que genera un número aleatorio de 32 bit.
Si te puede servir, me fijo si puedo hacer algo con eso y lo posteo...
     

Desconectado lavidtz

  • PIC10
  • *
  • Mensajes: 13
Re: Numeros aleatorios de 0 hasta 65535 en la pantalla lcd
« Respuesta #2 en: 29 de Noviembre de 2006, 00:10:07 »
Si es verdad y lo he probado también al intentar usarlo con los 32 bits,pero me plantea el mismo problema que es la traducción de esos números al lcd ya que este solo entiende de carácteres ascii.

Pero me he decidido por un contador que vaya más o menos rápido,quedandome hasta el 99 porque no me aclaro con el resto de operaciones para añadirle 3 dígitos más.

Pero tampoco descarto otras formas como la última planteada mientras pueda tener una cifra aleatoria traducida en el lcd.

gracias ;)

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Numeros aleatorios de 0 hasta 65535 en la pantalla lcd
« Respuesta #3 en: 29 de Noviembre de 2006, 01:14:28 »
Si alguien me puede decir para qué es el SRAND porque no conseguí averiguarlo.

No obstante me basé en un programa de VsZeNeR'05 a quien aprovecho para agradecerle por los ejemplos que publicó que son de una enorme ayuda para todos.
Y bueno, logré un programita que hace más o menos lo que buscás lavidtz.
Te lo adjunto comprimido con la simulacion en proteus 6.7 y una imagen por si tenés problemas con el proteus.
Espero que sirva
     

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Numeros aleatorios de 0 hasta 65535 en la pantalla lcd
« Respuesta #4 en: 29 de Noviembre de 2006, 01:25:13 »
Lo que vos decis del problema de mandar al lcd un número grande se resuelve con la instrucción

printf(lcd_putc,"%Lu",num);           // donde num es un unsigned long (Lu) de 16bits

Fijate que en el programa que te pasé creo que limité hasta 65535 y debería ser 65536 por el cero
El programa que pasé es medio pesado. Si querés acerlo sin usar las librerías lo que yo haría es hacer dos veces el random de enteros sin signo (unsigned int) que van de 0...255 y multiplicarlos entre sí Eso iría de 0 a 65025  :?

Veo que sos nuevo en el foro, al menos como participante. Yo hace solo 4 semanas que estoy participando y la verdad te recomiendo que te quedes en el foro y participes porque es impresionante lo que se puede aprender acá. Además hay un ambiente muy cordial la mayoría de las veces (muy pocas excepciones)  :D  Saludos desde Villa María - Córdoba
« Última modificación: 29 de Noviembre de 2006, 01:31:48 por Menta »
     

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Numeros aleatorios de 0 hasta 65535 en la pantalla lcd
« Respuesta #5 en: 29 de Noviembre de 2006, 08:45:43 »
Hola!
No uso C, pero el problema puede venir por el tipo de las variables. Quizas las que no declaras explicitamente las toma como Byte, y no permite valores mayores a 255. Proba de cambiar el "99" por "255" y fijate si anda. Si funciona, probar por cambiarlo por "258" o mas. Si dejo de andar, ahi tenes el problema. ;)

Saldudos.
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado lavidtz

  • PIC10
  • *
  • Mensajes: 13
Re: Numeros aleatorios de 0 hasta 65535 en la pantalla lcd
« Respuesta #6 en: 29 de Noviembre de 2006, 11:37:19 »
Menta he estado mirando los ficheros comprimidos,bueno el proteus no me va porque tengo la versión 6.5 pero eso es lo de menos porque tb tenía un esquema hecho para manejar todos los puertos con dos pics diferentes.

Lo que te quería comentar es que lo he compilado el programa y no se porque no me aparece nada en el lcd ni siquiera el titulo de "números aleatorios", la verdad esque debería ir porque parece que no tenga ningun error.Aunque le de al pin A4 se queda totalmente en blanco.No se si esto tiene que ver con la versión del compilador o algo por el estilo,o mi esquema del proteus que tiene algo mal.

Te lo dejo adjunto el esquema para que lo podais ver y si a alguien le sirve de ayuda lo puede usar sin ningun tipo de problemas ;)

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Re: Numeros aleatorios de 0 hasta 65535 en la pantalla lcd
« Respuesta #7 en: 29 de Noviembre de 2006, 12:43:15 »
Un apunte respecto al tema de la aleatoriedad. He mirado un poco la funcion SRAND, y me parece un poco excentrica.

Código: [Seleccionar]
unsigned int32 _Randseed = 1;

long rand(void)
{
   _Randseed = _Randseed * 1103515245 + 12345;
   return ((unsigned long)(_Randseed >> 16) % RAND_MAX);
}

void srand(unsigned int32 seed)
{
   _Randseed = seed;
}

Me da la sensacion de que el calculo de _Randseed debe llevar su tiempo. Yo para buscar numeros aleatorios prefiero jugar con el hardware del sistema. En aplicaciones en las que el usuario toma parte (pulsadores, etc), es tan facil implementarlo como poner a correr el TIMER0 y el TIMER1 con diferentes bases de tiempo, y jugar matematicamente con ellos para conseguir un numero de 16 bits, cuando el usuario pulse algun boton. O incluso coger el registro PC y sumarle el TIMER0... que corra la imaginacion... Lo que conseguiremos no seran numeros 100% aleatorios ni pseudoaleatorios... pero para muchas aplicaciones creo que sera suficiente.


Desconectado lavidtz

  • PIC10
  • *
  • Mensajes: 13
Re: Numeros aleatorios de 0 hasta 65535 en la pantalla lcd
« Respuesta #8 en: 29 de Noviembre de 2006, 16:20:00 »
Eso es lo que trato de hacer más o menos,un contador que vaya muy deprisa y me llegue hasta 65535.
lo que no me ha quedado claro es la operación que tengo que hacer para visualizar en la lcd.

  lcd_gotoxy(dir,2);
  lcd_putc('0'+c/10);       
  lcd_putc('0'+c%10);

Se que tengo que poner algo más que la formulita esta para que me traduzca los números al lcd,y con esto solo consigo los dos primeros dígitos,estoy un poco verde en esto y mira que le pego vueltas y más vueltas y no consigo hacer que pase de los 99.

Desconectado lavidtz

  • PIC10
  • *
  • Mensajes: 13
Re: Numeros aleatorios de 0 hasta 65535 en la pantalla lcd
« Respuesta #9 en: 29 de Noviembre de 2006, 16:36:02 »
Ya está resuelto el problema,mil gracias menta por el programa.No me iba bien porque en el fichero de lcd no tenía una orden de enviar el comando con cursor encendido,simplemente la he cambiado por la mía que tenía he modificado alguna cosita y va como la seda :)

En estos próximos días las dudas que me surjan de problemas con el pic os las iré comentando a ver si entre todos podemos sacarlos.

Al igual que todo lo que necesiteis me teneis a vuestra entera disposición para intentar ayudar y aobre todo aprender,un placer estar en este foro con vosotros.

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Numeros aleatorios de 0 hasta 65535 en la pantalla lcd
« Respuesta #10 en: 29 de Noviembre de 2006, 17:28:50 »
Bueno, me alegro que hayas podido solucionar el problema.
Si la librería a la que te referís es LCD2 y es una modificación tuya... me gustaría poder tenerla para hacer andar tu esquema de proteus que yo tambien estoy tratando de poder correr mi programa sobre él y no hay forma.
Si no, no hay drama, lo que pasa es que me obsesiono cuando algo no me funciona...  :D

Un saludo
     

Desconectado lavidtz

  • PIC10
  • *
  • Mensajes: 13
Re: Numeros aleatorios de 0 hasta 65535 en la pantalla lcd
« Respuesta #11 en: 29 de Noviembre de 2006, 17:42:18 »
No problem amigo,aqui la tienes para uso y disfrute de todos  :)


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Numeros aleatorios de 0 hasta 65535 en la pantalla lcd
« Respuesta #12 en: 29 de Noviembre de 2006, 18:15:45 »
Si el número aleatorio se genera tras la intervención del usuario, el método del Timer propuesto por Manex es una solución perfecta.

Sin embargo, si necesitas generar el número aleatorio siempre en el mismo momento, por ejemplo tras varios ciclos después de un reset, hay un método bastante eficaz que he comentado en otras ocasiones: dejas al aire un pin de entrada del conversor ADC del PIC y efectúas una lectura. Cada vez que lo leas te dará un valor distinto.

Y si necesitas mayor rango de números aleatorios, sacas dos muestras y multiplicas una por otra.


 

anything