TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: ronaldomh en 23 de Mayo de 2006, 03:27:42
-
hola a todos
estoy trabajando en un proyecto usando el mirocontrolador atmega8, y necesito generar numeros aleatorios (random). por favor alguien podria decirme como hacer para generar numeros aleatorios??????
-
Hola Ronaldo
¿Qué lenguaje estás usando para programar el micro?
Si usas ensamblador te puedo dar una ayuda.
-
hola, hace casi una semana q no vengo x aca.
Sí es en lenguaje ensamblador, asi q cualquier ayuda t lo agradeceria.
-
Cuando yo hice un dado electrónico lo hice con el contador del timer, en un AVR pero para el caso es lo mismo. Simulaba estados random.
Para empezar necesitas saber cuántos estados aleatorios necesitas. En mi caso fueron 6: 1,2,3,4,5 y 6 (las 6 caras del dado). ¿Cuántos estados necesitas tú?
El contador del timer era de 8bits, entonces cuando el usuario apretaba un botón, se obtenía el conteo del timer, que podía ser de 0 a 255, un número aleatorio.
Para obtener los 6 estados de los 256 números posibles se puede hacer una división. Digamos que cae en 137...
137 / 6 = 22 + 5/6 (veintidós enteros cinco sextos)
Tomas el residuo 5 (de cinco sextos). En este caso el estado aleatorio cayó en 5, de 6 estados posibles: 0,1,2,3,4 y5.
Si haces una subrutina que seleccione los estados, tendría que ser para el número de estados que obtendrás (256 si es con un timer de 8bit) dividido entre los estados que deseas (en mi caso 6).
El ejemplo del dado para un at90s1200 está aquí. En este ejemplo uso otro método para elegir el estado random, pero te lo dejo de todas formas.
http://www.todopic.com.ar/foros/index.php?topic=1124.msg9339#msg9339
También hay otra forma de generar números aleatorios usando el hardware del AVR. NEcesitas tener un AVR con convertidor ADC. Simplemente dejas sin concetar la terminal encargada del ADC y en la lectura digital obtendrás un número aleatorio, ya que la terminal está abierta.
Cuéntame si tienes dudas. :mrgreen:
-
hola q tal. gracias x la ayuda.
T explico pues de q trata esta parte d mi proyecto. Usando un modulo AVR y lenguaje assembler Tengo que encender aleatoriamente 8 leds (necesito entonces 8 estados aleatorios), cada led debe estar encendido un cierto tiempo, y si en ese tiempo en el q el led se encuentra prendido presiono un pulsador (cada led estara "concectado" a un pulsador especifico), entonces debo incrementar un contador, y al final mostrar en un display el numero de veces q se consiguio presionar el pulsador a tiempo.
-
jejeje suena bien el juguetito :mrgreen:
Dado que el número random solo puede ser generado por interacción del usuario, te recomiendo lo siguiente...
Para obtener el primer número random pide al usuario que presione cualquier botón (algo así como START :D ). Captura el conteo del timer al momento de la presión, ya tienes un número random en las manos.
Espera un tiempo usando el timer. Una vez pasado ese tiempo (que tú definirás) enciende el led elegido por el número random de hace rato (1 a 8 ).
Empieza un conteo con el timer para ver si el usuario tiene buenos reflejos. Cuando el usuario presione el botón correcto, captura el conteo del timer en ese momento y verifica que el usuario haya sido rápido, que no haya excedido el tiempo que tú marcas. Ahora ya tienes un número random para el siguiente led a encender.
Espero te sirvan estas ideas, te toca mejorarlas y depurarlas, ah y pasarlas a ensamblador.
Saludos
-
hola migsantiago
mira es que me interesa mucho todo lo relacionado con el avr
y e visto que tu ejercicio y me a gustado mucho
pero te queria preguntar algo ya que estoy empezando hacer mis pinitos con el atmel
Para obtener los 6 estados de los 256 números posibles
se puede hacer una división. Digamos que cae en 137
queria saber como haces esta division para poder entenderla
Digamos que cae en 137
que calculos hiciste ??
gracias por contestarme
-
Hola Belgitaes
El programa que hice para el dado usa un método distinto para generar los random. Nunca he programado una división en ensamblador, es muy pesado.
Puedes examinar el del dado y ver si puedes mejorar ese programa, o puedes revisar las application notes que Atmel proporciona.
AVR200: Multiply and Divide Routines (21 pages, revision C, updated 05/06)
This Application Note lists subroutines for multiplication and division of 8 and 16-bit signed and unsigned numbers.
http://atmel.com/dyn/resources/prod_documents/doc0936.pdf
http://atmel.com/dyn/resources/prod_documents/AVR200.zip
Saludos :-/
-
okey muchas gracias migsantiago
lo voy a leer me interesa
me gusta todo lo relacionnado con el atmel
gracias