Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

08/09/2011 #1

Avatar de zealot2

Aleatorizacion o ramdom en los micro
Habitualmente suelo usar para muchas cosas en programacion (C/C++) la aleatorizacion, o el ramdon. Normalmente en C esto se hace variable = time(null) y luego se llama a una funcion llamada srand(otros parametros). Esto es muy importante e imprescindible en muchas ocasiones, para juegos, para generar suerte, etc. Necesito implementar esto en un pic, pero no veo nada en el cc5 que me hable de ello, se puede hacer, existe? Gracias
08/09/2011 #2
Moderador

Avatar de Chico3001

En realidad no existe... ni para las computadoras grandes... lo que se hace es una funcion "pseudoaleatoria" que en realidad es una ecuacion que siempre genera el mismo numero apartir de una "semilla", posteriormente el resultado se vuelve a usar como la siguiente semilla y asi sucesivamente, asi que la salida es altamente aleatoria, pero se repetira si vuelves a colocar la primer semilla

En los PICs programar una funcion asi consume muchos recursos, asi que se usan otras medidas, una que me gusta hacer es medir el tiempo de pulsacion de un boton y con eso buscar un valor en una tabla de busqueda donde coloque valores al azar... al cambiar el tiempo en que se presiona el boton y al tener una tabla de valores aleatorios se obtiene una buena funcion de azar..

Otras veces se adquere un valor semilla de un convertidor AD, o de algun timer o de alguna transmision serial, la idea es buscar algo que sea suficientemente aleatorio para poder iniciar una busqueda en una tabla..
08/09/2011 #3

Avatar de Gudino Roberto duberlin

Chico3001 dijo: Ver Mensaje
En realidad no existe... ni para las computadoras grandes... lo que se hace es una funcion "pseudoaleatoria" que en realidad es una ecuacion que siempre genera el mismo numero apartir de una "semilla", posteriormente el resultado se vuelve a usar como la siguiente semilla y asi sucesivamente, asi que la salida es altamente aleatoria, pero se repetira si vuelves a colocar la primer semilla

En los PICs programar una funcion asi consume muchos recursos, asi que se usan otras medidas, una que me gusta hacer es medir el tiempo de pulsacion de un boton y con eso buscar un valor en una tabla de busqueda donde coloque valores al azar... al cambiar el tiempo en que se presiona el boton y al tener una tabla de valores aleatorios se obtiene una buena funcion de azar..

Otras veces se adquere un valor semilla de un convertidor AD, o de algun timer o de alguna transmision serial, la idea es buscar algo que sea suficientemente aleatorio para poder iniciar una busqueda en una tabla..
Hola Colega, pues el sistema de randomizar que ofreces, es muy efectivo, pero no es necesario acudir a una tabla, ya que el tiempo de presion del boton es variable, puedes usarlo para tal fin.-
08/09/2011 #4

Avatar de zealot2

Si, es como dices Chico3001, es la semilla, asi lo llaman en el libro que estudio de 3 tomos, (Como programar en c/c++). Sin embargo Gudino Roberto duberlin, es cierto que si se mide una pulsacion con un reloj de 20Mhz, y esta pulzacion la contamos en microsegundos puede ser aleatoria, pero quizas el usuario tenga la habilidad de dar en el boton a tiempos exactos, o sea, pulsarlo siempre o casi siempre el mismo tiempo, parece dificil no?, no se cuanto?. De hecho para esto hasta existe tambien unas tarjetas PCI de "entropia" se usaron para este fin y para encriptacion tambien. Pero tengo una idea: Desde que el aparato arranque llevar el paso del tiempo e ir incrementando una variable en vez de por segundo, por microsengundo, uns16 de 0 a 65535, cuando llegue al limite comenzaria. Entonces, cuando el usuario presiona, se suma lo que se demoro, mas el numero que tenia la variable que se va incrementando en ese momento, y este numero es la cantidad de veces que el programa pasaria por todos los elementos que puden salir, o sea dando la vuelta si se acaban, luego pararia cuando acabe la cuenta y mostraria o haria esa obcion. Pero el tiempo que siempre cuenta el de 0-65535 sigue caminando siempre internamente. Asi si seria vien dificil de cogerle el tiempo con un pulsador cierto?
08/09/2011 #5
Moderador

Avatar de Chico3001

Lo dificil es generar la semilla... una vez con esa la funcion es lo de menos... se pueden aplicar desde integrales hasta tablas de busqueda...

Depende mucho de los recursos disponibles, la dificultad para aleatorizar aun mas la semilla e incluso las ganas que uno tenga de programar una funcion extra...

algunas veces me he saltado la tabla y solo uso el tiempo de pulsacion... es completamente al gusto del cliente...
08/09/2011 #6

Avatar de zealot2

Si la idea es buena, vale la pena gastar un timer para esto verdad?
08/09/2011 #7

Avatar de electroandres

si queres utilizar este RAMDOM, para una especie de "dado" o algo que el usuario pare ese random con un pulsador, lo unico que necesitas hacer es descontar una memmoria, desde cualquier valor al que vos lo desees, si el pulsador fue apretado, esa memoria es considerada como tu numero aleatorio ( que es aleatorio porque el micro al ir tan a las chapas, puede tocar cualquiera)
11/09/2011 #8

Avatar de dinoelectro

En PIC CCS existe la funcion rand(N), que genera un numero entero aleatorio.

para poder inbocar necesitaras incluir en el inicio de programa la libreria stdlib.h

ejemplo:

#include <16f877a.h>
#include <stdlib.h>
#use delay(clock=20000000)

void main()
{
int numero;
port_b_pullups(true);
set_tris_b(0b00000001); ///pin RB0 como entrada
set_tris_d(0b00000000); ///puerto d como salidas
denuevo:
while(input(pin_b0)==1)
{
numero=rand();
output_d(numero);
delay_ms(300);
}
goto denuevo;
}

el programa anterior genera un numero aleatorio entre 0 y 255, el resultado sale por el puerto D en binario.

si un pulsante es conectado al pin RB0 podra detenerse el bucle y capturar el numero presente en los pines del puerto (juego muy utilizado en los programas concurso que asoman en la tele)... para visualizar el estado del puerto D pueden colocar LEDS en los pines del puerto.

incluyo simulacion y programa para que lo revisen
Archivos Adjuntos
Tipo de Archivo: rar EX33_DADO.rar (54,2 KB (Kilobytes), 23 visitas)
11/09/2011 #9


tambien puedes utilizar un Pseudoaleatorio con un simple registro de desplazamiento y una xor

http://en.wikipedia.org/wiki/Linear_...shift_register

como el tipico de Fibonacci

La gracia esta en encontrar la semilla o valor inicial
Si utilizas la memoria eeprom de micro simplemente añadiendo un contador eliminas el problema de la semilla.
12/09/2011 #10

Avatar de zealot2

Muchas gracias familia, me han dado muy buena informacion, ya tengo muchas ideas, jeje.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.