No importa los milisegundos de espera o los microsegundos de ejecución de las instrucciones. Eso es muy poco comparado con los mil misegundos que van a pasar hasta la próxima interrupción.
Si la rutina de interrupción ocupa un par de milisegundos, aún quedan 998 milisegundos para el programa principal, antes de que se repita la interrupción.
Bien entonces tienes razón, me queda claro entonces, que los microsegundos de checkeo SI afectan al tiempo del TMR0.
En interrupciones cortas no se llega a notar, pero si quiero hacer tiempos de horas ahi si voy a tener problemas.
Una solución que pensé, ya a extremo, es usar la rutina que hice de 1 minuto ininterrumpida, y la corto con un pulsador al Reset del micro ( No es lo ideal pero creo que no queda otra ).
Es lo mas cerca a lo que quiero y no afectaría el tiempo de trabajo.
Lógico, seria lo mismo que usar una rutina de 1 minuto ( sin usar el TMR0 ) y usar el mismo metodo del reset.
Acabo de hacer un ejemplo basico normal sin TMR0:
Código:
cblock 0x0c
milisegundo
segundo
minuto
endc
boton
call 10ms
incrementar milisegundo
milisegundo = 100 ? 10ms x 100 = 1 seg
NO, ir a boton
SI, resetear milisegundo
incrementar segundo
segundo = 60 ? 1 seg x 60 = 1 minuto
NO, ir a boton
SI, resetear segundo
incrementar minuto
mostrarlo en PORTB ..... etc ....
ir a boton
;============ RUTINA 10MS ==============
10MS
BLA BLA BLA
BLA BLA BLA
.................
RETURN
Muestro minutos usando un ( display 7 seg ) probe de 0 a 9 minutos.
En 9 minutos conseguí un retraso de 1 segundo.
Probé alterar el 60 por 59 de MINUTO y se alteraba mucho, tambien el 100 de milisegundos por 99, y lo mismo ...
pero a la rutina de 10ms le quité un NOP que tenía y ahora me quedó justo.
No se como un microsegundo cada 10ms en 1 minuto me corrigió el retraso ...
No hice calculos y nada,solo probé.
Pero al final aprendí mucho sobre el TMR0, o por lo menos lo basico de como se usa, pero no lo veo muy probechoso en el fin que quiero hacer de un simple contador de ( segundos, minutos y horas seleccionables de 0 a 9 ).
Mi pensamiento era como dije antes, lo pongo a contar una rutina ininterrumpida de EJ: 1 hora y mientras checkeo el pulsador de parada sin alterar los tiempos de rutina del TMR0.
Pero veo que como tu me explicas, el programa se detiene para la rutina del TMR0,
quedando invalida para este fin que pretendo hacer.
Lo que si se puede como tu me has dicho es tomar fracciones cortas ( maximas 1 segundo ), y de ahi ir decrementando o incrementando n veces con registros auxiliares.
Con lo que, no difiere mucho en hacerlo con la rutina normal sin la necesidad del TMR0.
Yo lo entiendo y veo necesario por ejemplo, para hacer un reloj continuo como tu has mensionado, y por ejemplo, al cambiar la hora no afectaría su tiempo constante ..
O por ejemplo, ( un temporizador en LCD con menu, algo que hice con rutina común ) para manejar el menu se cortaba o alteraba el tiempo ejecutandose.
Con el TMR0 esto no pasaría ....
Pero bueno ....
Es un arma muy potente segun la necesidad de pequeña precisión que uno necesite !!!
Muchas gracias nuevamente Joaquin por estar presente !!!