Duda de funcionamiento

Tengo el siguiente código
Estoy haciendo un contador de dígitos de 0-9 ascendente y descendente, con un PIC16F84A, y todo iba bien hasta que al simular ésta parte del programa (contador descendente), encontré que no funciona adecuadamente.


Tengo el siguiente código en el fragmento:
(le pongo el encabezado para que solo lo copien y peguen en MPLAB y lo puedan revisar)

;Fragmento de programa que realiza un contador descendente del 9 al 0 y saca el código de cada
;número por el puerto B, en código para un Display de 7 segmentos, con el punto
;decimal encendido

LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


conde equ 0x20 ; registro para contador ascendente




ORG 0 ; El programa comienza en la dirección 0.

;Configuracion de puertos
bsf STATUS,RP0
clrf TRISB ; Las líneas del Puerto B se configuran como salida.
bcf STATUS,RP0
clrf TRISB

contdes
movlw d'10' ;carga a W un 10
movwf conde ;cargar contenido de W a registro contas

deconde
decf conde,1 ;incrementa contador y guarda el incremento en el mismo registro contas

call tabladec
movwf PORTB

movlw d'0'
subwf conde,0
btfss STATUS,Z ;revise el bit z del registro status y si es 1 saltara la sig inst
goto deconde



tabladec

; Tabla para display de 7 segmentos.
addwf PCL,F
Tabla2
retlw 0x9F ; El código 7 segmentos para el "0".
retlw 0x86 ; El código 7 segmentos para el "1".
retlw 0E ; El código 7 segmentos para el "2".
retlw 0xCF ; El código 7 segmentos para el "3".
retlw 0xE6 ; El código 7 segmentos para el "4".
retlw 0xED ; El código 7 segmentos para el "5".
retlw 0xFD ; El código 7 segmentos para el "6".
retlw 0x87 ; El código 7 segmentos para el "7".
retlw 0xFF ; El código 7 segmentos para el "8".
retlw 0xE7 ; El código 7 segmentos para el "9".

end


El problema es que cuando el registro de contador "conde" tiene 9 y 8, salta a la configuración del número 9y cuando llega al 7, salta a la configuración del 8, y al llegar al 6 salta a la configuración 7 y así sucesivamente.
¿Puede alguién asesorarme?
Pensé que el error estaba en el manejo del PCL y tal vez debería recurrir al PCLATCH, pero no estoy muy segura ya que uso solo 8 bits, que es tamaño del PCL.
Agradezco de antemano.
 
Código:
contdes
		movlw 	d'10'			;carga a W un 10
		movwf 	conde		;cargar contenido de W a registro contas
		
deconde	
		decf 	conde,1			;incrementa contador y guarda el incremento en el mismo registro contas

		call	tabladec
		movwf	PORTB

		movlw 	d'0'
		subwf 	conde,0
		btfss 	STATUS,Z		;revise el bit z del registro status y si es 1 saltara la sig inst
		goto 	deconde

Cada vez que llamas a tabladec el contenido de W es conde+1
--> En la primer llamada te pasas de la tabla, y en las otras te devuelve el correspondiente a conde+1
 
en principio lo que me parece es que deberías poner
Código:
 movfw conde  ; Carga conde en W
  call tabladec
caso contrario comienza con 10 y no con 9.

Yo además pongo las tablas antes del código. Así:
Código:
 LIST P=16F84A
 #INCLUDE <P16F84A.INC>
 __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

 conde equ 0x20 ; registro para contador ascendente

 ORG 0 ; El programa comienza en la dirección 0.
	goto	 start  ; Para saltear el vector de interrupciones

 ORG 5  

start  goto main ; Para saltear las tablas

tabladec

; Tabla para display de 7 segmentos.
Tabla2 addwf PCL,F
 retlw 0x9F ; El código 7 segmentos para el "0".
 retlw 0x86 ; El código 7 segmentos para el "1".
 retlw 0E ; El código 7 segmentos para el "2".
 retlw 0xCF ; El código 7 segmentos para el "3". 
 retlw 0xE6 ; El código 7 segmentos para el "4".
 retlw 0xED ; El código 7 segmentos para el "5".
 retlw 0xFD ; El código 7 segmentos para el "6".
 retlw 0x87 ; El código 7 segmentos para el "7".
 retlw 0xFF ; El código 7 segmentos para el "8".
 retlw 0xE7 ; El código 7 segmentos para el "9".

main
;Configuracion de puertos
 bsf STATUS,RP0
 clrf TRISB ; Las líneas del Puerto B se configuran como salida.
 bcf STATUS,RP0
 clrf TRISB

contdes
 movlw d'10' ;carga a W un 10
 movwf conde ;cargar contenido de W a registro contas

deconde
 decf conde,1 ;incrementa contador y guarda el incremento en el mismo registro contas

 movfw conde  ; Carga conde en W
 call tabladec
 movwf PORTB

 movlw d'0'
 subwf conde,0
 btfss STATUS,Z ;revise el bit z del registro status y si es 1 saltara la sig inst
 goto deconde

 end
Nota la posición del rótulo "Tabla2"
 
Muchas gracias Alejandro Sherar, justamente al revisarlo de nuevo muchas veces, el problema que encontré fue ese, debí cargar el contenido del registro "conde" antes de llamar a la tabla.
Ya resolví el problema. ¡¡Muchas gracias!
Y sobre eso de cambiar la instrucción "addwf PCL, F" a enfrente de la etiqueta "Tabla2", no es necesario, dejé el programa tal y como estaba, solo carge el contenido de "conde" en W y funcionó a la perfección.

De nuevo:
¡¡Muchas gracias!
 
Atrás
Arriba