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:
incf PORTA,RA0 ;Incremento ra0
decf PORTA,RA0 ;Decremento ra0
Eso esta mal usado, si tu deseo era incrementar PORTA es
Si tu deseo era poner a 1 RA0
- Mala costumbre y que luego lleva a otros problemas son estos:
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:
movf ContUnidad,W ;Mueve lo que hay en contador de unidades a W
- No hay un codigo de multiplexado para los 2 displays.
Simplificaciones:
DISPLAY:
incf PORTA,RA0 ;Incremento ra0
movf ContUnidad,1 ;Mueve lo que hay en contador de unidades a W
call TABLA_VALORES ;Llamo la tabla de valores.
movwf PORTB ;Muestro lo que esta en w, en el display.
call RETARDO_20ms
decf PORTA,RA0 ;Decremento ra0
movf ContDecena,1 ;Mueve lo que hay en contador de centenas a W
call TABLA_VALORES ;Llamo la tabla de valores.
movwf PORTB ;Muestro lo que esta en w, en el display.
call RETARDO_20ms
btfss PORTB,RB0 ; Testeamos si esta a 1 logico.-
goto DISPLAY ; No, seguimos testeando.-
call RETARDO_20ms ; Eliminamos Efecto rebote
btfss PORTB,RB0 ; Testeamos nuevamente.-
goto DISPLAY ; Falsa Alarma, seguimos testeando.-
CONTAR:
incf ContUnidad ;Incremento el contador
movlw d'10' ;Le asigno 10 a w
subwf ContUnidad,1 ;Hago una resta entre el contador y lo que hay en W.
btfss STATUS,Z ; z=1 salta
goto DISPLAY
clrf ContUnidad ;Limpia el contador de unidad.
incf ContDecena ;Incremento el contador de decena.
movlw d'10' ;Le asigno 10 a w
subwf ContDecena,1
btfsc STATUS,Z ; z=0 salta, z=1 limpia el contador.
clrf ContDecena ;Limpia contador decena.
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.