Que tal fulgitron,
Veo varios detalles.
El primero es:
Un_segundo_carga EQU -d'39'
deberia ser:
Un_segundo_carga EQU d'39'
Sin el signo de "-"
y la sentencia deberias colocarla al inicio del codigo de la siguiente manera:
#DEFINE Salida PORTB,3 ; Puerto donde se conecta los diodos LED.
Un_segundo_carga EQU d'39'
Analicemos la subrutina de tiempo con el Timer0.
En la configuración estás asignando el prescalar al TMR0 y definiéndolo como 1:256, según la intruccion que colocaste:
movlw b'00000111' ; Las 5 líneas del Puerto A se configuran como entrada.
movwf OPTION_REG
Ahora bien, el TMR0 lo inicializas con el valor 39, lo que quiere decir que realizará una cuenta de 256-39 = 217, pero como tu prescalar es de 1:256, entonces multiplicamos el 217 X 256 y esto nos da como resultado: 55552. Esto quiere decir que si el cristal que estas usando es de 4 MHZ, el ciclo instruccion es de 1 microsegundo (us, recuerda que la frecuencia de operacion es la frecuencia del cristal usado dividida entre 4)por lo tanto el TMR0 se desbordará cada 55.552 ms. Ahora bien tu tienes un contador de ciclos de 100 (valor de la variable contador). Entonces 55.552ms X 100 = 5.5552 segundos!!!!!
Como puedes ver estas usando valores inadecuados para la inicializacion del TMR0.
Lo que yo te recomiendo es lo siguiente:
Inicializa el TMR0 con el valor de 195, en lugar del 39 que estas usando, con este valor tendrás lo siguiente:
Carga del TMR0 X Prescalar X variable contador = tiempo total.
Carga del TMR0 = 195
Valor del prescalar es 256
variable contador = 20
Entonces sustituyendo:
195 X 256 X 20 = 998400 ciclos.
Ahora bien si tu cristal es de 4 MHz, entonces cada cilo es de 1us, por lo tanto el tiempo total que tienes ahora es es 0.9984 segundos. Como puedes darte cuenta no es exactamente 1 segundo pero es muy cercano. Tu error de tiempo seria: (1,000,000 - 998400)*100/1,000,000 = 0.16%
Espero esto te sirva de ayuda.
Elreypic.