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

Temas similares

21/12/2014 #1

Avatar de dragon33

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.
21/12/2014 #2

Avatar de Scooter

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.
21/12/2014 #3

Avatar de dragon33

¿Y como podría hacer una señal de parada aleatoria?
21/12/2014 #4

Avatar de Scooter

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.
21/12/2014 #5


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
21/12/2014 #6

Avatar de papirrin

Y si utilizas un timer y cuando presiones lees el contador. o por interrupcion externa con un oscilador lo mas inestable posible.
21/12/2014 #7

Avatar de dragon33

Quiero algo como esto, no hace falta sonido.
21/12/2014 #8

Avatar de papirrin

Yo lo haria como te digo una: interrupcion externa con un oscilador inastable y un timer para hacerlo automatico-
21/12/2014 #9

Avatar de dragon33

Probaré por interrupción del TMR0.
21/12/2014 #10
Moderador general

Avatar de Fogonazo

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.
21/12/2014 #11

Avatar de dragon33

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.
21/12/2014 #12

Avatar de papirrin

Probaré por interrupción del TMR0.


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.
21/12/2014 #13

Avatar de dragon33

Ensamblador por favor, please.
21/12/2014 #14

Avatar de papirrin

A mi el ensamblador me provoca urticaria te pregunto ¿ ya buscaste en google como generar un pseudoaleatorio con ensamblador?
21/12/2014 #15

Avatar de dragon33

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.

---------- Actualizado después de 5 minutos ----------

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.
Archivos Adjuntos
Tipo de Archivo: rar Bingo 2 16F84A.rar (63,9 KB (Kilobytes), 27 visitas)
21/12/2014 #16

Avatar de papirrin

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
21/12/2014 #17

Avatar de dragon33

O sea, que ensamblador es mas difícil que microcode. Pues es lo que mejor se me da, el ensambler.
21/12/2014 #18

Avatar de papirrin

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.
21/12/2014 #19

Avatar de Scooter

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.
22/12/2014 #20

Avatar de Scooter

De todos modos en el foro se ha comentado algunas veces. Busca a ver si te inspira alguno de los hilos que hay.
¿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.