si, claro me recontra sirve, yo de hecho estaba haciendo todo lo contrario, por lo que entiendo lo ideal seria usar la interrupcion en la pata que tengo para detectar el cruce por 0 y en esa interrupcion hacer lo de el pwm y el resto en el eje central del programa, no?.
porque yo estaba poniendo lo del cruce en el eje del programa y un timer con el refresco del lcd.
Claaaaro

, lo que pasa es que la interrupción siempre tiene prioridad sobre el programa principal. El código viene ejecutando el while(1) del main lo más tranquilo, hasta que llega una interrupción, deja todo lo que está haciendo, y se dedica de lleno a la interrupción.
Es como cuando estás trabajando y te llaman porque tu madre tuvo un accidente... interrumpís/largás todo y vas a ver que pasó hasta saber que está atendida.
Vos lo estabas haciendo como cuando estás mirando el partido del Domingo y la bienamada esposa se poner a contarnos que a fulanito le pasó esto o aquello... a esa interrupción la ignoramos sin problema

.
Pero no, tu caso es el accidente de mamá, no el anterior.
Eso siempre y cuando las interrupciones estén habilitadas.
Le damos más importancia a setear el pwm porque la línea de 220V no espera a nadie. 50 Hz no parece mucho, pero es un ciclo cada 20ms, no lo hagamos esperar más de algún que otro milisegundo, no?.
En cambio el mensaje en la pantallita... ni vamos a notar si tarda 10, 50, o 100 milisegundos en presentar el mensaje.
... leo el código sin entrar en mucho detalle ...
Aja... bueno, tiene sabor a Arduino no?. No estoy familiarizado con las cosas internas de la librería LCD y PID, pero creo que no es mucho suponer que es todo programación secuencial (que internamente no usan interrupciones y que las funciones retornan solo cuando se completo la función, es decir, no hay llamadas asíncronas).
Me gusta que hayas hecho algo en base a estados

.
Agrego tarea de teclado:
- Actualizar PWM con detección de cruce por cero: prioridad más alta.
- Leer teclado: que nos gustaría que se ejecute en un intervalo T para no perdernos una pulsación del usuario. Prioridad media
- Mostrar el mensaje en pantalla LCD: prioridad baja.
Pero diría que conviene tener solo 2 tareas, teclado y pantalla en el loop(), y seteo de pwm en la interrupción.
Es más, también podría disparar la actualización de teclado y pantalla por interrupción, pero en la rutina de interrupción de actualización de pantalla y teclado seteamos un flag y volvemos bien rápido. De esa forma también podés configurar para que la actualización se haga 10 veces por segundo, o 20 veces por segundo para el teclado y 5 veces por segundo para la pantalla... pero eso último sería agregar un poco de complejidad, por ahora digamos que teclado y pantalla se actualizan 10 veces por segundo al unísono.
La estructura del código podría ser algo como:
PHP:
void setup() {
//...
//configurar interrupción de pwm -> puerto de I/O
//configurar interrupción de teclado y pantalla -> timer
HabilitarInterrupciones();
}
volatile unsigned int actualizarTecladoPantalla = 0;
void loop (void) {
if (actualizarTecladoPantalla) {
actualizarTecladoPantalla = 0;
teclado(); //lee puertos, actualiza variables de entrada al pid
if(sePresionoAlgunaTecla) {
RecalcularPID(); //los valores calculados los utiliza la rutina de interrupción de seteo de pwm
}
pantalla(); //se imprimen los valores de pantalla
}
}
void RecalcularPID(void) {
cicloPWM = cuentaQueLeeValoresSeteadosPorTeclado();
}
void InterrupcionCrucePorCero(void) {
timerSetearCicloDeTrabajo(cicloPWM);
}
void InterrupcionPorTimerActualizacionTecladoPantalla(void) {
actualizarTecladoPantalla = 1;
}
No sé si se entiende la idea.