Autor Tema: PIC16F84A - Juego de Dados - Limitar o dejar pasar un Numero  (Leído 267 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Joandigo

  • PIC10
  • *
  • Mensajes: 1
PIC16F84A - Juego de Dados - Limitar o dejar pasar un Numero
« en: 23 de Febrero de 2020, 17:59:11 »
Buenas. He estado montando un juego de dados con el PIC16F84A. Consegui que me diera un numero pseudo-Aleatorio, pero ahora tengo otro problema:

Quiero que cuente hasta 9 (1001), pero termina contando hasta 15 (1111)

Mi idea para solucionarlo era la siguiente: Cuando el numero salga de la subrutina (en su correspondiente variable=NumA), le resto otra variable de referencia que vale 9(1001). Utilizo la instruccion SUBWF, de manera que si el Bit C es 1 (la resta ha dado positiva o cero) salte y lo mande a PortB, sino que me vuelva 0 el valor de NumA antes de mandarla a puerto.

La cuestion es que no consigo hacer que que deje de mandarme numeros mayores que 9 (1001) ¿Como puedo hacer?

De antemano, les agradesco por el tiempo que se han de tomar para leer esto.

Código: [Seleccionar]
;==============================================================================
;                             ZONA DE DIRECTIVAS                              =
;==============================================================================
LIST P=16F84A ;Modelo de microcontrolador a utilizar
INCLUDE <P16F84A.INC> ;Inclusión de la librería correspondiente al modelo de PIC
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ;Configuración de las banderas de quemado

Cont1  EQU 0x0C
NumA    EQU 0x0D
Nref     EQU 0x0E


;CONFIGURACION DE PUERTOS

ORG 0

BSF STATUS,RP0
MOVLW B'00001'
MOVWF TRISA
CLRF TRISB
BCF STATUS,RP0
MOVLW B'001'
MOVWF NumA
MOVLW B'1001'
MOVWF Nref
CLRF PORTB

;PRINCIPAL
Principal1
BTFSS PORTA,0
GOTO Principal1
CALL NumRan
CALL Delay
MOVF Nref,0 ;Aqui coloco mi numero de referencia (Nref) b'1001'
SUBWF NumA,0 ;Aqui tomo NumA (que puede tener cualquier valor entre 0 y 15) y le resto Nref (9)
BTFSC STATUS,C ;Aqui pregunto si el BIT C es uno (Es decir, si la resta dio cero o positivo)
;Si el resultado es negativo (c=0) Quiero cargar un 0001 en la Variable NumA
MOVF NumA,0 ;Si el resultado es cero o positivo (c=1), dejo pasar el valor al puerto B
MOVWF PORTB
GOTO Principal1


NumRan
BTFSC   NumA, 1
INCF     Cont1, f
BTFSC   NumA, 3
INCF     Cont1, f
BTFSC   NumA, 2
INCF     Cont1, f
BTFSC   NumA, 0
INCF     Cont1, f
RRF       Cont1, f
RRF       NumA, f
CLRF     Cont1
RETURN


Delay
NOP
NOP
NOP
NOP
NOP
RETURN

END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7679
Re:PIC16F84A - Juego de Dados - Limitar o dejar pasar un Numero
« Respuesta #1 en: 24 de Febrero de 2020, 10:47:49 »
Considero que eso no es aleatorio, pero eso queda para otro tema...

Pregunto... no es mas sensato usar un literal en ves de guardar un valor?, Ya que ese valor es fijo.

Código: ASM
  1.         MOVF   NumA,W
  2.         SUBLW 0xA                       ; 0xA - NumA  -> C=0 si W > NumA  o que es lo mismo que NumA < 10 decimal
  3.         BTFSS STATUS,C                  ; Si C=1 (NumA>=10) reseteo NumA
  4.         GOTO  ENVIO_NUMA                ; Si C=0 (Numa<10) Voy a enviarlo al puerto.
  5.         MOVLW 0x1                              
  6.         MOVWF NumA
  7. ENVIO_NUMA
  8.         MOVF NumA, W                   
  9.         MOVWF PORTB    
  10.         GOTO Principal1