PIC16F84A para hacer un BINGO

Necesito ideas para crear un código en ENSAMBLADOR para PIC16F84A, se trata de que un contador este contando (por ejemplo) del 1 al 20 y que periodicamente se pare y muestre el contenido de ese contaje. El tema de contar está claro incf CONTADOR,1 y se compara con valor contenido en w, ejemplo:


LIMPIA clrf CONTADOR
CUENTA incf CONTADOR,1
movlw .21
subwf CONTADOR,W
btfsc STATUS,2 ;si resultado es=0 entonces cifra CONTADOR = 21
goto LIMPIA ;si bandera de STATUS es = 1 resultado resta = 0
goto CUENTA


Esa forma de contaje como se hace de forma muy rápida nos da un número pseudo aleatorio. Ahora bien, ¿como hago para que ese contaje se detenga de forma autónoma cada 5 segundos y nos muestre un número contenido entre 1 y 20 siendo el número en cada momento diferente?. Imaginaos un BINGO, pues de eso se trata, de ir mostrando números y que cada número que haya salido no vuelva ya a salir.
 
Será aleatorio en la medida en que la señal de parada sea aleatoria. Si la señal de parada no es aleatoria el número no será aleatorio.
 
En realidad no se puede, solo se puede simular con mayor o menor acierto.
Busca en el foro, el tema se ha tratado alguna vez.
 
Tendrias que:
- Hacer un generador de numeros aleatorios.
Guarda el numero aleatorio obtenido, reviza si ya fue sacado en turnos anteriores, si ya fue sacado, que se repida la rutina hasta obtener otro numero aleatorio, si no se ha sacado, que espere a que se ejecute la rutina de temporizacion por interrupcion o polling y que, mientras llega la temporizacion vuelva a generar otro numero aleatorio (guardando el numero obtenido en un ciclo anterior, en caso de que la interrupcion no permita que termines la generacion de un nuevo numero aleatorio) (esto te genera una rutina aun mas aleatoria con la generacion de los numeros), ya una vez ejecutada la interrupcion o la tecnica de polling, que guarde el dato en una lista de numeros ya utilizados.​
- Generar un temporizador y muestra el numeros.
Por interrupcion en el TMR0, es exacto pero tendrias que checar tus demas rutinas para saber como se verian afectadas por la interrupcion​
Por medio de un NE555 configurado a 5 segundos, ya sea por tecnica de polling o por interrupcion en RB0​
- Una rutina que revise que los numeros que vas sacando en turnos anteriores no se repitan (esto podria ir en tu rutina del generador de numeros aleatorios).

Yo te recomendaria mas el uso del 555
 
Lo que quieres hacer es algo mas complicado que un contador con lectura "Aleatoria", también debe prever que no se repitan los números que ya han salido.
 
Última edición:
El número que salga lo almaceno en un registro, luego cada número que salga se compara con el contenido de los registros, si son iguales sigue contaje.
 
Última edición:
Probaré por interrupción del TMR0.

:unsure:

como antecedente y hasta donde tengo entendio una PC, para sacar un Pseudoaleatorio, utiliza el reloj del tiempo real, y el procesador que no esta sincronizado, saca los ultimos digitos casi irrepetibles.

lo que yo propongo es similar, con la interrupcion externa con un oscilador quizas RC, que no esta sincronizado con el micro, incrementaria una variable de 0 a 65535 y se reiniciaria infinitamente, utilizando un timer del micro como temporizador cada equis tiempo toma los ultimos 2 o tres digitos del contador.

todo esto para decir que con solo el timer 0 no creo que puedas algo decente porque utiliza el mismo oscilador. pero bueno no esta demas probar.

CCS creo que tiene una funcion para generar un pseudoAleatorio pero nunca he analizado como lo hace XD.
 
Ya buscare, de todas formas soy muy cabezón y si no lo encuentro te aseguro que acabaré haciéndolo de todas formas...je, je, je.



Mira lo que he encontrado. Es un bingo programado en microcode, con simulación en PROTEUS, la entrada de la "bola" es mediante un botón eso le otorga aletoriedad (eso no es lo que quiero pretendo que sea automático), y tiene un selector para que se vean los números que ya han salido.
 

Adjuntos

  • Bingo 2 16F84A.rar
    63.9 KB · Visitas: 38
Última edición:
Es justo lo que digo, en lugar del boton lo cambias con la interrupcion externa con un oscilador y eso le da lo aleatorio.

no lo he visto pero si ya esta toma ese, basic lo aprendes un par de dias que es la mitad de lo que te tardas en hacerlo en ensamblador :LOL:
 
Última edición:
:unsure: para mi si es mas dificil en cuanto a tiempo.

lo que con basic(microcode) haces con una instruccion o funcion, con ensamblador necesitas 100...(exagere)

basicamente es lo mismo pero no tienes que estar cambiando registros de aqui para alla y de alla para acuya por cada cosa que quieres hacer. depende de cada quien pero el microcode lo aprendi en no mas de una semana. solo uso ensamblador en cosas muy especificas.
 
Puedes ser todo lo cabezón que quieras pero no-se-pue-de generar números realmente aleatorios.
Por ejemplo puedes guardar en la ROM una secuencia lo bastante larga de números "aleatorios" (seria discutible como los Generes) y cuando enchufas el sistema (como la hora de arranque es aleatoria) con alguna función dependiente de la hora elijes por que punto de esa cadena larga empiezas a leer la secuencia.
 
Atrás
Arriba