Autor Tema: Ayuda con código en assembler!!!  (Leído 1852 veces)

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

Desconectado joyfulpuupi

  • PIC10
  • *
  • Mensajes: 4
Ayuda con código en assembler!!!
« en: 25 de Septiembre de 2015, 16:51:53 »
Estamos usando pic 16f 62 8a, con assembler... El codigo tiene que prender un contador de 7 seg, de 00-99 (con pulsador en RB0, el RA0 es igual a 1 es unidad y cuando es 0 es decena)
Compila, pero en proteus, no hace lo que debe hacer... en la silumacion  de mplab se queda en la tabla de valores y no sale... AYUDA POR FAVOR.


   
« Última modificación: 25 de Septiembre de 2015, 22:36:57 por joyfulpuupi »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con código en assembler!!!
« Respuesta #1 en: 25 de Septiembre de 2015, 18:31:31 »
Esto tiene unos cuantos errores + se podria haber simplificado algunas cosas

Errores:

- Le falta configurar el puerto como digital. De reset el comparador esta activo. Incluso en el datasheet bajo I/O ports tiene un codigo para ponerlos todos como digitales
- Instrucciones mal utilizadas:

Código: ASM
  1. incf   PORTA,RA0 ;Incremento ra0
  2.       decf      PORTA,RA0               ;Decremento ra0

Eso esta mal usado, si tu deseo era incrementar PORTA es

Código: ASM
  1. INCF   PORTA,F

Si tu deseo era poner a 1 RA0

Código: ASM
  1. BSF   PORTA,RA0

- Mala costumbre y que luego lleva a otros problemas son estos:

Código: ASM
  1. movf    ContUnidad,1 ;Mueve lo que hay en contador de unidades a W

Por que usar 1 o 0 cuando claramente el .inc tiene un equivalente de que W es igual a 0 y F es igual a 1. Ahi no estaria haciendo lo que dice el comentario, sino que solo moveria el valor del registro al mismo lugar. Distinto esto y que es mas claro de leer:

Código: ASM
  1. movf    ContUnidad,W ;Mueve lo que hay en contador de unidades a W

- No hay un codigo de multiplexado para los 2 displays.


Simplificaciones:

Código: ASM
  1. DISPLAY:
  2.       incf   PORTA,RA0 ;Incremento ra0
  3.       movf    ContUnidad,1 ;Mueve lo que hay en contador de unidades a W
  4.       call    TABLA_VALORES ;Llamo la tabla de valores.
  5.       movwf    PORTB ;Muestro lo que esta en w, en el display.
  6.       call    RETARDO_20ms
  7.       decf   PORTA,RA0 ;Decremento ra0
  8.       movf    ContDecena,1 ;Mueve lo que hay en contador de centenas a W
  9.       call    TABLA_VALORES ;Llamo la tabla de valores.
  10.       movwf    PORTB ;Muestro lo que esta en w, en el display.
  11.       call   RETARDO_20ms
  12.       btfss   PORTB,RB0       ; Testeamos si esta a 1 logico.-
  13.       goto   DISPLAY         ; No, seguimos testeando.-
  14.       call   RETARDO_20ms      ; Eliminamos Efecto rebote
  15.       btfss   PORTB,RB0       ; Testeamos nuevamente.-
  16.       goto   DISPLAY         ; Falsa Alarma, seguimos testeando.-
  17.  
  18. CONTAR:  
  19.       incf   ContUnidad ;Incremento el contador
  20.       movlw   d'10' ;Le asigno 10 a w
  21.       subwf   ContUnidad,1 ;Hago una resta entre el contador y lo que hay en W.
  22.       btfss   STATUS,Z ; z=1 salta
  23.       goto   DISPLAY
  24.       clrf    ContUnidad ;Limpia el contador de unidad.
  25.       incf   ContDecena ;Incremento el contador de decena.
  26.       movlw   d'10' ;Le asigno 10 a w
  27.       subwf   ContDecena,1
  28.       btfsc   STATUS,Z ; z=0 salta, z=1 limpia el contador.
  29.       clrf   ContDecena ;Limpia contador decena.
  30.       goto   DISPLAY

Tambien otra cosa que se realizar yo para "simplificar un poco el programa es crear un loop infinito y de ahi llamar a subrutinas, con CALL intentando de que cada seccion de codigo sea lo mas independiente posible sin afectar el rendimiento. de esa forma podes testear cada una de las subrutinas.


Desconectado joyfulpuupi

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda con código en assembler!!!
« Respuesta #2 en: 25 de Septiembre de 2015, 19:57:27 »
Muchisimas gracias!!!!!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con código en assembler!!!
« Respuesta #3 en: 25 de Septiembre de 2015, 22:50:00 »
No hace falta que edites para quitar el codigo, si alguno tiene un problema podria haberlo solucionado mirando tu codigo y la solucion.