Interrupciones y aplicaciones de temporización

Mientras aprendía sobre la multiplexación de 7 segmentos usando interrupciones en PIC, se encontró que cuando esto se usaba en aplicaciones de temporización del mundo real, el ISR frecuente provoca un retraso acumulativo paso a paso en el bucle principal, que luego aumenta más allá del tiempo del mundo real, debido al retraso causado por el programa principal por el servicio de subrutina ISR.

Utilizo un PIC de ejecución de cristal de 20 MHz con timer0 para actualizar las pantallas multiplexadas, pero el retraso causado por ISR es evidente en el ciclo principal del programa cuando se realiza una medición en tiempo real mediante una rutina de retraso, etc. Por lo tanto, cuando se cuentan 5 minutos, agrega algunos segundos dependiendo de la configuración del temporizador 0 para ISR. Como 5 segundos durante 5 minutos y un minuto más o menos durante 1 hora, etc.

¿Hay alguna forma de resolver esto además de usar pantallas en serie?

Por supuesto que los hay. Hay muchos relojes precisos. Puede: A) Utilizar rutinas de conducción de segmentos más eficientes. DMA podría ayudar de manera realista. B) Use un reloj de hardware dedicado y solo use el micro para hacer las tareas menos importantes. C) podrías medir y luego contabilizar el tiempo pasado en el ISR. Etc, etc, etc.
¡Obviamente, no puede hacer mediciones en tiempo real a través de retrasos ! Para esto están los temporizadores de hardware; cuente el desbordamiento en el software para rastrear períodos de tiempo más largos.
Chris, el problema es que estoy usando el temporizador 0, cuando habilito el temporizador 1, el código no funciona.

Respuestas (2)

En lugar de usar un retardo de bucle principal para calcular el tiempo, que es interrumpido por el contador de hardware, use el propio contador de hardware para proporcionar el tiempo.

Configure el temporizador 0 para interrumpir (digamos) cada 1 ms. Esto se convierte en el tic de su sistema, o el latido del corazón. Utilice la rutina de interrupción para incrementar el contador de mS y actualizar las pantallas.

En el bucle principal, utilice el contador de mS como su "reloj de pared", espere hasta que haya avanzado 300 000 tics y haya esperado 5 minutos con una precisión no acumulativa de 1 mS.

Esta respuesta está intencionalmente incompleta, hay algunos detalles técnicos más que pueden ser necesarios según la duración de su rutina de verificación de tiempo, pero sobrecargaría la respuesta para presentar un tratado ahora. Una vez que comience a entrar en los detalles, descubrirá que obtener una comunicación limpia entre el bucle principal y los ISR implica un poco de cuidado, declarando variables volátiles, tomando instantáneas, deshabilitando interrupciones durante períodos críticos, pero todo está documentado y es el camino. todos los demás lo hacen.

Puede usar interrupciones de temporizador para mediciones de tiempo, agregar cierta cantidad de ms a un contador en cada ISR para mantener una medición de tiempo precisa, tratar de evitar tareas largas en ISR, establecer indicadores y verificarlos en el bucle principal en su lugar, intente perfilar su código a través de la salida del depurador para buscar tareas que tardan más en ejecutarse. Optimiza tu código tanto como puedas, recuerda que las CPU de 8 bits llevan a los humanos a la luna...