Generar numero aleatorio (0-F) y mostrarlo en display

Buenas !

Estoy intentando hacer un ejercicio con el 16F84 en el que tengo que generar un numero aleatorio entre 0 y F y que este aparezca en un display...y estoy hecho un lio.

Parece que puede ser algo parecido al dado electronico, pero en vez de entre 1 y 6, debe aparecer entre 0 y F.

Haber si me podeis ayudar un poquilllo, o darme alguna pista para poder conseguirlo.

Muchas gracias !
 
Si se trata generar un numero a partir de un evento 'humano' (alguien que apreta un pulsador) lo mas comodo y verdaderamente es tener un contador de frecuencia alta y leerlo cuando se produce el evento.

Si se trata de generar toda una secuencia, generalmente se hace una multiplicacion o division recurrente con numeros grandes, podes sacar algo de las notas de aplicacion de Microchip.
 
Realizas una rutina que te valla sumando de 0 a F, repitiendo indefinidamente este ciclo.
Al accionar un pulsador empieza la secuencia de sumar, y al soltarlo se detiene.
Por lo tanto el numero representado dependera del tiempo que mantegas presionado el pulsador.
Como supongo que el micro correra a 4Mhz, la actuacion del pulsador te provocara un valor aleatorio. No tienes que corregir los rebotes provocados por el pulsador.
 
Hola de nuevo!

Buff...parece que ando algo perdidillo en el tema, no entiendo muy bien vuestras sugerencias ops: ops: ops: ops: ops: ops:

Partiendo del dado electronico es posible conseguirlo mas facil? o deberia empezar desde 0?

Por cierto, lo tengo que hacer con el simupic (sim84)

De todos modos, muchas gracias por respoder e intentar ayudar

Gracias!
 
Simple, inicias un contador que valla de 0 a F (o de F a 0 que es lo mismo) y cada vez que termine la cuenta vuelva a comenzar, es decir que siempre este corriendo, mediante un pulsador lees el valor que tenga tu contador en el momento que lo presionaste y pasas ese valor al display, como la frecuencia es muy alta (supongo 4MHz) el valor que tenga el contador al momento de presionar el pulsador es totalmente aleatorio.

Puedes hacerlo de varias formas, con un contador programado, con el TMR0, el pulsador mediante interrupciones...

Saludos.
 
Buenas!

He empezado a hacerlo como me a aconsejado Vick. El contador me ha quedado asi:

;----------------------------------------------------------------------------
LIST P=16F84
RADIX HEX
;----------------------------------------------------------------------------

W EQU 0x00 ; Comienzo del campo de etiquetas.
F EQU 0x01
PUERTAB EQU 0x06
ESTADO EQU 0x03
CONTA EQU 0x0C

;----------------------------------------------------------------------------

ORG 0 ; El programa comienza en la dirección 0 y
goto inicio ; salta a la dirección 5 para sobrepasar
ORG 5 ; el vector de interrupción.

;----------------------------------------------------------------------------

inicio bsf ESTADO,5 ; Seleciona el banco 1
movlw 0x00 ; Se configura PuertaB como salida
movwf PUERTAB
bcf ESTADO,5 ; Selección del banco 0

;----------------------------------------------------------------------------

clrf CONTA ; CONTA = 0
bucle1 incf CONTA,F ; CONTA + 1 --> CONTA
movf CONTA,W ; CONTA se carga en W
movwf PUERTAB ; W se carga en el registro de datos PB
movlw 0xff ; W <-- 0xff
subwf CONTA,W ; CONTA - W --> W
btfss ESTADO,2 ; Explora Z y si vale 1 se produce "brinco"
goto bucle1 ; Si Z = 0 se vuelve a bucle1

bucle2 goto bucle2 ; si Z = 1 se produce un bucle infinito
end

;----------------------------------------------------------------------------

Tengo un par de dudas, como ago para que cuando termine la cuenta vuelva a empezar?

Como le pongo el pulsador y como lo configuro? Como puedo visualizar ese numero "aleatorio" en el simupic (sim84), con un registro mediante Dir. Hex., o como?

Siento molestar y hacer tanta pregunta, pero estoy mu verde y es un ejercicio que necesito resolver de alguna manera.. ops:

Muchas gracias a todos!
 
me surge la duda:

¿el ejercicio es generar un número aleatiorio mediante un pulsador o sin intervención del usuario o como?
 
Ese es un ejercicio sencillo. Yo lo haría de la siguiente manera:
-Configuro el timer 0 en modo temporizador, sin precarga y sin preescalador
-Deshabilitar interrupcion de timer 0 (que por default esta deshabilitada) ya que no la necesitamos
-Leer el valor de un interruptor, con btfss es suficiente
-Si se pulsa el interruptor se lee el registro TMR0 (movf TMR0,w) y se enmascara el nibble bajo (andlw 0x0F), con eso ya tomaste el valor del número aleatorio de 0 a F
-Por ultimo decodificas el numero para desplegarlo en un display o LCD o lo que sea que ocupes para mostrar el numero.

Tal vez te puedan servir estos enlaces, el primero es para usar y configurar el timer 0 y el segundo es para controlar un display de 7 segmentos:

http://micropic.wordpress.com/2007/06/24/temporizador-timer-0/
http://micropic.wordpress.com/2007/02/26/displays-de-7-segmentos/

Suerte con tu proyecto!
 
pic-man dijo:
Ese es un ejercicio sencillo. Yo lo haría de la siguiente manera:
-Configuro el timer 0 en modo temporizador, sin precarga y sin preescalador
-Deshabilitar interrupcion de timer 0 (que por default esta deshabilitada) ya que no la necesitamos
-Leer el valor de un interruptor, con btfss es suficiente
-Si se pulsa el interruptor se lee el registro TMR0 (movf TMR0,w) y se enmascara el nibble bajo (andlw 0x0F), con eso ya tomaste el valor del número aleatorio de 0 a F
-Por ultimo decodificas el numero para desplegarlo en un display o LCD o lo que sea que ocupes para mostrar el numero.

Tal vez te puedan servir estos enlaces, el primero es para usar y configurar el timer 0 y el segundo es para controlar un display de 7 segmentos:

http://micropic.wordpress.com/2007/06/24/temporizador-timer-0/
http://micropic.wordpress.com/2007/02/26/displays-de-7-segmentos/

Suerte con tu proyecto!

Iep!

Voy a probar tambien esta opcion que me das...a ver si consigo algo. Que estoy intentando seguir vuestros consejos en diferentes formas de hacerlo, pero en todas me quedo atascado sin saber que hacer y no soy capaz de conseguirlo de ninguna de ellas.

A ver si le empiezo a dar caña, que lo tengo para el lunes y como no me espabile la liare..jeje
Por lo menos gracias a vosotros puedo intentarlo y tener alguna idea de hacerlo...sino...

Muchas gracias!
 
Si estas comenzando con los pics te recomendaría no usar el timer ya que es un poco más dificil, si debes usar un pulsador entonces es bastante facil:

- Inicializa los puertos, el pin RA0 como entrada, que es donde conectaras el pulsador con su resistor de pull-up.
- El puerto B como salida que es donde conactarás el display.
- Inicializa una variable "contador" al cual le cargarás el valor h'0F'
- Crea un bucle en el cual irás decrementando el "contador" y a su vez leeras el valor de RA0 para ver si se ha presionado el pulsador.
- Si se ha presionado el pulsador (si tiene el valor cero) saltará a una subrutina para enviar el valor que tenga "contador" en ese momento al display.
- Mientras no se presione el pulsador (habra un uno en RA0) se sigue decrementando "contador" hasta que llegue a cero, cuando llegue a cero se recarga con h'0F' y así creas un bucle infinito que solo saldrá cuando se presione el pulsador.

Saludos.
 
Hola Vick
He decidido pornerme ya ha hacerlo que se me acaba el tiempo, a ver si lo puedo conseguir con tu ayuda.Aqui va lo que he llegado a enterder de lo que me as dicho:

LISTP=16F84
RADIX HEX

PORTA EQU 0X05 ;PUERTO A
PORTB EQU 0X06 ;PUERTO B

Vick dijo:
- Inicializa los puertos, el pin RA0 como entrada, que es donde conectaras el pulsador con su resistor de pull-up.
- El puerto B como salida que es donde conactarás el display.

BSF ESTADO,5
MOVWL B'00000001'
MOVWF PORTA
CLRF PORTB
BCF ESTADO,5


Vick dijo:
- Inicializa una variable "contador" al cual le cargarás el valor h'0F'
No se como hacerlo.

Vick dijo:
- Crea un bucle en el cual irás decrementando el "contador" y a su vez leeras el valor de RA0 para ver si se ha presionado el pulsador.

SALTAR BTFSS PORTA,0
GOTO DISPLAY
GOTO SALTAR
(Algo mas?)

Vick dijo:
- Si se ha presionado el pulsador (si tiene el valor cero) saltará a una subrutina para enviar el valor que tenga "contador" en ese momento al display.
- Mientras no se presione el pulsador (habra un uno en RA0) se sigue decrementando "contador" hasta que llegue a cero, cuando llegue a cero se recarga con h'0F' y así creas un bucle infinito que solo saldrá cuando se presione el pulsador.
Todavia no lo he hecho, cuando tenga lo anterior bien, seguire con esto, sino me pierdo.

A ver si me puedes ayudar a seguir con ello y puedo conseguir acabarlo para el domingo...

Gracias, muchas gracias!
 
Tengo este programa que hace eso, con un display anodo comun, es parecido o igual a las recomendaciones que te dieron, date una idea e intenta reescribirlo tu entendiendo lo que dice cada linea.
 

Adjuntos

  • foroayuda_440.asm
    1.2 KB · Visitas: 164
Airoa Airon dijo:
Tengo este programa que hace eso, con un display anodo comun, es parecido o igual a las recomendaciones que te dieron, date una idea e intenta reescribirlo tu entendiendo lo que dice cada linea.

Buenas Airoa Airon!

En principio al abrir este post nunca fue mi objetivo que alguien me lo diera hecho, pero viendo que el tiempo se me viene encima y que no tengo los suficientes conocimientos como para conseguirlo...te lo agradezco, de verdad, MUCHAS GRACIAS !

Por cierto, al ensamblarlo me salen 2 errores:

Error[125] C:\...\ANONIMO.ASM 1 : Illegal condition (EOF encountered before END or conditional end directive)
Error[131] C:\...ANONIMO.ASM 1 : Processor type is undefined

Sobre el 1º he leido algo pero soy incapaz de encontrar el error, el 2º no se a que se refiere..

Ayyy, a ver si lo consigo y dejo de molestaros ya... ops:

Muchas gracias!
 
Dado que queda poco tiempo te dejo aquí el que yo tengo, hace unas dos semanas acabo de diseñar un dado electrónico con un PIC16F84A y solo tuve que hacer algunas modificaciones para que funcione para tu proyecto.

En este ejemplo tengo el pulsador en el pin RA0 de tal forma que al presionarlo en ese pin habrá un cero y sin presionar un uno.

He utilizado yo un display de cátodo común, aunquue si tienes el de ánodo común solo hay que cambiar los códigos. El display esta conectado a las primeras siete líneas del puerto B.

En el asm estan los comentarios que explican el funcionamiento del programa, si tienes alguna duda dimelo. La simulación la hice en Proteus dado que no tengo ningún PIC en este momento.

Saludos.
 

Adjuntos

  • aleatorio_145.asm
    1.2 KB · Visitas: 150
Holaa!

Me estoy volviendo loco, uso el simupic(sim84).

Ahora no se que le pasa al programa que al ensamblar me dice:
Checking C:\....\archivo.asm for symbols

y abajo del todo pone:
DOS error: File not found. <0000:014A)

Haber si alguien sabe a que se debe esto...

Muchas gracias a todos!
 
Atrás
Arriba