setup_timer_0(RTCC_DIV_8|RTCC_INTERNAL); //Configuracion TMR0
disable_interrupts(INT_RTCC); //Desahabilitar interutciones TM0
enable_interrupts(GLOBAL); //Habilita interutciones GLOBALES
set_timer0(59286); //Precarga el TMR0
//Interutcion TMR0
#INT_RTCC // Interrupción por desbordamiento
RTCC_ISR() { // del TIMER0 RTCC
if(++nRTCC==100){
nRTCC=0;
if((bandera == false)&&(--segundos < 1)){
if(minutos > 0) --minutos;
segundos=59;
}
}
} set_timer0(59286);mi problema es que la cuenta se retrasa muchisimo.
El problema que tienes es los delay no puedes usar delay en una aplicación que tenga que llegar una base de tiempo o seguir un tiempo real. Cuando pones un del ay tu micro se esta parando sin hacer absolutamente nada, en tu caso tu micro esta parado 500ms sin hacer nada por cada vez que realiza el bucle.
Si quieres llevar una base de tiempos nunca uses del ay, usa timers
Un saludo
El problema que tienes es los delay no puedes usar delay en una aplicación que tenga que llegar una base de tiempo o seguir un tiempo real. Cuando pones un del ay tu micro se esta parando sin hacer absolutamente nada, en tu caso tu micro esta parado 500ms sin hacer nada por cada vez que realiza el bucle.
Si quieres llevar una base de tiempos nunca uses del ay, usa timers
Un saludo
A que puede deberse que cuente una interrupción sin que la misma exista realmente?
Pero yo ni los uso ni los recomiendo
Al iniciar la ejecución, siempre siempre hace 1 cuenta, sin que ingrese ningún pulso
Yo soy tambien asi, a veces son necesarios y no hay con que darle, como esperar 2us que seria insensato hacer una interrupcion por timer y lleva mas tiempo de procesamiento.
Aca en el foro me encontre con personas que por ahi no tienen claro el tema de los timers o interrupciones, y tratar de hacerle entender a esa persona lo que es un timer es complejo.
Ademas de intentar cambiarle la forma de pensar en su programacion, lo que le trae mas dolores de cabeza a el y a vos. Por eso muchas veces voy por los delays. O intento seguir su forma de programacion.
Por ejemplo en tu programa utilizas la variable contador, donde hay delays o instrucciones largas como las del LCD, esto hace que si viene un pulso mientras esta haciendo esa "animacion" no las cuente.
Una solucion es crear una nueva variable y al ocurrir la condicion de 60 segundos copiarla a esa variable, la otra es desactivar las interrupciones por ese momento.
Otra cosa es que nunca vas a tener 1 segundo exacto usando eso. Por todas las instrucciones de mas en ASM que hay y por que con 20Mhz no llegas a que sea 1 segundo exacto.
Otra ademas es que siempre vas a tener que esperar que llegue a los 60 segundos para que comienze la cuenta de vuelta. por que podes agarrarlo a los 40 segundos y solo te quedaria o mediria 20 segundos de pulsos entrantes.
La solucion seria que en primera interrupcion externa, habilite el timer o la interupcion del timer y cargue el valor. Cuando llega a 60 segundos el timer solo se desabilita y modifica una flag para esperar otro pulso que lo habilite por 60 segundos mas.
Todo depende de como queres que funcione tu programa
Proba antes de habilitar las interrupciones globales de limpiar las banderas de interrupcion de ambos.