La forma más fácil de hacer esto es usar la multitarea cooperativa. Ni siquiera necesitas usar una interrupción de temporizador para esto. Debido a que tiene 3 tareas que se ejecutan simultáneamente, un enfoque es utilizar máquinas de estado en su ciclo principal.
Lo que hago es configurar Tmr0 para que se desplace en algún intervalo específico. Elijo usar aproximadamente 1 ms en la mayoría de mis proyectos.
Configura cada tarea en una máquina de estado. En cada punto de cada tarea en la que está esperando que suceda algo, salga de esa máquina de estados y haga lo siguiente.
Cuando termine todas sus tareas, pierda tiempo en un bucle esperando a que se active el indicador de interrupción Tmr0. Tenga en cuenta que NO tiene configurado el bit de habilitación de interrupción, simplemente está esperando que Tmr0 se desplace. Usar la marca de interrupción es la forma más fácil de hacer esto.
Cuando el TMR0IF se ponga en funcionamiento, haga todo su mantenimiento. Esto incluye la actualización de sus relojes en tiempo real y los temporizadores de retardo, el procesamiento de conversiones A / D, etc. También asegúrese de restablecer TMR0IF para el próximo paso.
Cuando haya terminado con el servicio de limpieza, simplemente vuelva a la parte superior del bucle y comience a ejecutar sus máquinas de estado nuevamente.
He utilizado este enfoque en la mayoría de mis proyectos, incluidos los PIC más simples (núcleo de 12 bits). Es robusto y fácil de mantener.