Autor Tema: Ayudarme a rematar un programilla  (Leído 3148 veces)

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

Desconectado DGM

  • PIC10
  • *
  • Mensajes: 5
Ayudarme a rematar un programilla
« 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

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: Ayudarme a rematar un programilla
« Respuesta #1 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

Desconectado DGM

  • PIC10
  • *
  • Mensajes: 5
Re: Ayudarme a rematar un programilla
« Respuesta #2 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

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: Ayudarme a rematar un programilla
« Respuesta #3 en: 06 de Junio de 2008, 21:14:35 »
si estas usando el mplab para trabajar en asm, deberias hacer algo asi:

Código: ASM
  1. LIST    P=16F877A
  2. INCLUDE<P16F877A.INC>
  3.  
  4. __CONFIG _CP_OFF  & _WDT_OFF & _BODEN_OFF & _XT_OSC  & _WRT_OFF & _LVP_OFF & _DEBUG_OFF

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.

Desconectado DGM

  • PIC10
  • *
  • Mensajes: 5
Re: Ayudarme a rematar un programilla
« Respuesta #4 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

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: Ayudarme a rematar un programilla
« Respuesta #5 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.