Tienes que tomar en cuenta la interrupción para ambos flancos, tanto de subida como de bajada, por cada que se detecte un flanco, dentro de la interrupción hay que configurar para detectar el flanco contrario. Una forma puede ser así (todo el código dentro de la interrupción):
lo que se hace es poner a la salida el valor detectado en el flanco, excepto para los flancos de 33 a 37 para el cambio a 1, mientras que para los flancos 38 y 39 para el cambio a 0.
/*******************************************************************************
* PROGRAMA PARA SIMULAÇÃO DE SINAIS *
*******************************************************************************/
#include <12F683.h>
#use delay(clock = 8000000)
#fuses INTRC_IO,NOMCLR,NOWDT,NOPROTECT,PUT,BROWNOUT
char saida1=0;
#int_ext
void indexador(){
saida1++;
if (saida1 >= 40) {
saida1 = 0;
}
// L_TO_H
if (input(PIN_A2)) {
if (saida1 < 32 || saida1 >= 37) {
output_high(PIN_A0);
}
ext_int_edge(H_TO_L);
}
// H_TO_L
else {
if (saida1 < 38 || saida1 >= 39) {
output_low(PIN_A0);
}
ext_int_edge(L_TO_H);
}
}
void main() {
ext_int_edge(L_TO_H); //interrupção externa na borda de descida
SET_TRIS_A (0b00000100); //configura GP2 como entrada e o resto saida
Enable_interrupts(INT_EXT); //habilita interrupção externa
Enable_Interrupts(GLOBAL); //habilita interrupção global
while(true) {
}
}