Me da la impresión que parte de ese código está extraído de mi proyecto "Dimmer con mando".
Si te fijas, la función original que yo utilicé, y que pego a continuación, está precedida por el literal #INT_EXT. Esto significa que la función se ejecutará cada vez que salte la interrupción externa, o lo que es igual, cada vez que el PIC detecte en ese pin un flanco de bajada (si está en H_TO_L) o un flanco de subida (si está en L_TO_H).
/****************************************************************************/
/* El ciclo del TRIAC comienza de nuevo con cada cruce por 0 */
/* por ello en la interrupción externa se pone a 0 la cuenta de PasosDimmer */
/* y se cambia la detección de flanco de la entrada */
/****************************************************************************/
#INT_EXT
void CrucePor0()
{
PasosDimmer=0;
if (j==0){
j=1;
LED_VERDE=1;
LED_ROJO=1;
ext_int_edge(H_TO_L); // Cambio la detección del flanco, para que la proxima sea de bajada
}
else {
j=0;
LED_VERDE=0;
LED_ROJO=0;
ext_int_edge(L_TO_H); // La próxima interrupción será de subida
}
}
Esta función es francamente optimizable y en ella se pueden observar defectos que cometí debido a mi bisoñez con los PIC, como el uso de la variable j, pero te puedo garantizar que funcionaba perfectamente.