Paso 7: Generar números aleatorios
Ahora que podemos generar datos en una pantalla de LED dados individual, necesitamos alguna manera de generar un número aleatorio.
Matemáticamente, la generación de un número verdaderamente aleatorio es un ejercicio muy complejo. En nuestro sencillo circuito PIC, podemos generar un número aleatorio por un par de medios;
- Un número aparentemente aleatorio puede obtenerse por la sincronización cuánto tiempo se mantiene el botón abajo, usando un temporizador que incrementa muy rápidamente. (Sería una persona muy rara que podría pulsado el botón exactamente 2243 mS cada vez).
- Alternativamente, podríamos implementar un generador de números pseudo-random matemático. Esto requiere el uso de la multiplicación y división. Un generador pseudo-random genera una secuencia larga de números que eventualmente se repite, después de muchos ciclos.
En nuestro proyecto, el método más sencillo que podemos utilizar para generar un número aleatorio es el temporizador interno (TMR0), que constantemente es incrementar en 1/4 de la velocidad del reloj (aproximadamente 256KHz), la muestra y almacenar en una variable continua, mientras se mantiene pulsado el botón.
Nuestro microprocesador PIC 16F84 o 16F88 tiene 68 posiciones de memoria que pueden utilizarse como variables. Para definir una variable, simplemente declaramos una constante que se refiere a una ubicación particular de memoria y almacenar números en esa localización de memoria según sea necesario.
Una rutina de código corto para realizar esta función sería la siguiente;
; una ubicación de memoria para almacenar nuestro número aleatorio RandomA EQU 30; define dirección de memoria a ; almacenar un número aleatorio Button_Loop MOVFW TMR0; obtener el valor actual del temporizador MOVWF RandomA; almacenar en RandomA BTFSS PortB, 0; ¿Es el botón de abajo todavía? GOTO Roll_Down; no, saltan y lento ; abajo de la pantalla CALL Display_Result; Sí, Mostrar la lista actual CALL Short_Delay; esperar un tiempo CLRF idea; claro ambos dados otra vez CLRF DieB GOTO Button_Loop; y otra vez. Roll_Down:; Aquí va el resto del programa. ; RandomA contiene un número que se ha seleccionado al azar ; depende de cuánto se ha celebrado el botón de. |