Interrupciones y aplicaciones de temporización

2

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

Utilizo el PIC de ejecución de cristal de 20 MHz con el temporizador 0 para actualizar las pantallas multiplexadas, pero el retraso causado por el ISR es evidente en el bucle principal del programa cuando se realiza una medición en tiempo real mediante una rutina de retardo, etc. contados, agrega algunos segundos dependiendo de la configuración del temporizador0 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 seriales?

    
pregunta user132257

2 respuestas

3

En lugar de utilizar un retardo de bucle principal para calcular el tiempo, interrumpido por el contador del hardware, use el contador del propio hardware para proporcionar la sincronización.

Configure el temporizador0 para interrumpir (por ejemplo) cada 1 ms. Esto se convierte en la garrapata de tu sistema, o latido del corazón. Utilice la rutina de interrupción para incrementar el contador de mS y actualizar las pantallas.

En el bucle principal, use el contador 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 es intencionalmente incompleta, hay algunos detalles técnicos más que pueden ser necesarios dependiendo de 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 clara entre el bucle principal y los ISR implica un poco de cuidado, declarar las variables volátiles, tomar instantáneas, deshabilitar interrupciones para períodos críticos, pero todo está documentado y es la forma todos los demás lo hacen.

    
respondido por el Neil_UK
1

Puede usar un intervalo de tiempo 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 marcas y verificarlas en el bucle principal. intente crear un perfil de su código a través de la salida del depurador para buscar tareas que demoren más en ejecutarse. Optimice su código todo lo que pueda, recuerde que las CPU de 8 bits llevan a los humanos a la luna ...

    
respondido por el Mike

Lea otras preguntas en las etiquetas