Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: DGM en 06 de Junio de 2008, 20:36:47
Título: Ayudarme a rematar un programilla
Publicado por: DGM en 06 de Junio de 2008, 20:36:47
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
Título: Re: Ayudarme a rematar un programilla
Publicado por: poseidon20 en 06 de Junio de 2008, 20:48:40
Una pregunta, como estan configurados tus fuses?, es decir tienes activado el WDT, el boden, y los demas fuses que tiene el 16f877a, si tu programa una vez que se inicaliza y juegas y arroja el valor del dado y este se mantiene por un tiempo, peor de ahi se reinicia el juego, puede ser por este ultimo, es decir puede que tengas habilitado el WDT. :D
Título: Re: Ayudarme a rematar un programilla
Publicado por: DGM en 06 de Junio de 2008, 20:56:25
Pues yo pensando se me había ocurrido si podría ser un problema de rebote del interruptor, pero ahora que me dices lo del WDT no he configurado nada en el programa, me podrías decir como hacerlo? El caso es que realiza todo el programa perfecto pero al mostrar el valor en el Puerto B al rato se apagan los leds y nunca tarda lo mismo en apagarles, a veces tarda mas y a veces menos, cuando el programa como veis está hecho para que mantenga el valor. Un saludo
Título: Re: Ayudarme a rematar un programilla
Publicado por: poseidon20 en 06 de Junio de 2008, 21:14:35
si estas usando el mplab para trabajar en asm, deberias hacer algo asi:
si el cristal que estas usando es de 4MHz el tipo de oscilador esta bien, pero si usas un cristal de 10 o 20MHz entonces deberias reemplazar XT_OSC por HS_OSC.
Título: Re: Ayudarme a rematar un programilla
Publicado por: DGM en 07 de Junio de 2008, 09:34:14
Efectivamente poseidón, era el WDT, ha sido quitarle y funcionar correctamente. Muchas gracias, a seguir bien un saludo
Título: Re: Ayudarme a rematar un programilla
Publicado por: poseidon20 en 07 de Junio de 2008, 16:11:31
Me alegro haber sido de ayuda, sigue para adelante y ya sabes, que este foro esta para ayudarte :D.