Hola a todos, soy nuevo aqui, asi que es un placer. Os comento, mirar he hecho un programa del típico dado electrónico basado en la generación de un número aleatorio entre el 1 y el 6 y mostrado sobre el puerto B, pero me he visto obligado a acudir a vosotros para ver si encontrais el fallo debido a que el programa funciona correctamente salvo que mi intención es que se muestre el número aleatorio sobre el puerto B y que permanezca fijo hasta que se realice otra tirada, sin embargo, habiendo realizado el programa con ese fin, el PIC me enciende un instante los leds del puerto B correspondientes pero me les apaga no tardando mucho. El pic que he utilizado es un PIC 16F877A con un oscilador de 20MHz. Os copio el programa para ver si se os ocurre cualquier cosa que pueda fallar, un saludo a todos !!!
List p=16F877a ;Tipo de procesador
include "P16F877a.INC" ;Definiciones de registros internos
num equ 0x21
; org 0x00 ;Dirección de comienzo de programa
; goto Inicio
org 0x05
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; INICIALIZAR PUERTOS Y REGISTROS ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Inicio clrf num ;Borrar el registro NUM
clrf PORTB ;Borro los latch de salida del PortB
bsf STATUS,RP0 ;Banco 1 de RAM
movlw 0xff
movwf TRISA ;PORTA ENTRADAS, aunque en realidad solo voy a utilizar RA4
movlw 0x06
movwf ADCON1 ;Configuramos el PORTA como E/S digitales
clrf TRISB ;PORTB SALIDAS
bcf STATUS,RP0 ;Volver al banco 0 de RAM
Bucle btfss PORTA,4 ;Compruebo si RA4 está accionado
goto PULSADO ;Si el pulsador está accionado vas a GEN_NUM (PULSADO => RA4=0)
goto Bucle ;Si el pulsador NO está accionado esperas (NO PULSADO => RA4=1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; GENERACIÓN DE UN NÚMERO ALEATORIO ENTRE 1 Y 6 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PULSADO
clrf PORTB
bcf STATUS,Z
bcf STATUS,RP0
incf num,f ;Mientras estemos pulsando RA4 se irá incrementando el número
movf num,w ;Con esto se comprueba si el num es superior a 6
sublw .7 ;Restamos 7 a num
btfss STATUS,Z ;Compruebo si la resta es 0 (Z=1), si la resta es 0 es que num=7
goto COMP_PULSADO ;Si num no ha llegado a 7, Z=0 y vamos a COMP_PULSADO
movlw 0x01
movwf num ;Si num ha llegado a 7, Z=1 => Iniciamos num a 1.
COMP_PULSADO
btfsc PORTA,4 ;Compruebo de nuevo el estado de RA4
goto NO_PULSADO ;Sí RA4=1 (interruptor NO PULSADO)
goto PULSADO ;Sí RA4=0 (interruptor PULSADO)
NO_PULSADO
call MOSTRAR_NUM
goto Bucle
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; RUTINA PARA MOSTRAR NUM DE LA TIRADA EN EL PORTB ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOSTRAR_NUM
bcf STATUS,RP0
UNO movf num,w ;Compruebo si num=1
sublw .1
btfss STATUS,Z
goto DOS
movlw b'00000001' ;Enciendo RB0
goto FIN
DOS movf num,w ;Compruebo si num=2
sublw .2
btfss STATUS,Z
goto TRES
movlw b'00001000' ;Enciendo RB3
goto FIN
TRES movf num,w ;Compruebo si num=3
sublw .3
btfss STATUS,Z
goto CUATRO
movlw b'00001001' ;Enciendo RB0 y RB3
goto FIN
CUATRO movf num,w ;Compruebo si num=4
sublw .4
btfss STATUS,Z
goto CINCO
movlw b'00001010' ;Enciendo RB1 y RB3
goto FIN
CINCO movf num,w ;Compruebo si num=5
sublw .5
btfss STATUS,Z
goto SEIS
movlw b'00001011' ;Enciendo RB0, RB1 Y RB3
goto FIN
SEIS movlw b'00001110' ;Enciendo RB1, RB2 Y RB3
FIN movwf PORTB
return
end
; Por último comentaros que el literal que muevo al puerto B correspondiente a cada número es simplemente por cómo he colocado los leds para hacer el dado, pero eso si que funciona, el unico problema es que no mantiene el valor en el puerto B hasta que yo vuelva a pulsar RA4. Estoy aqui para cualquier sugerencia, un saludo