Amables Picmaniacos:
En un intento por analizar los efectos de los rebotes en un pulsador he contruido un pequeño programa con el que guardo los sucesivos valores de TIMER0 en cada interrupción externa provocada por una pulsación.
Como pretendo no solo contar los pulsos sino también calcular sus duraciones, lo que hago es conmutar el flanco que dispara la interrupción en cada una de ellas que se produce. Esta técnica ya la utilicé hace años con el 68HC11 programando en ensamblador.
Ahora, con un PIC 16F876A y en CCS PICC he intentado hacer lo mismo.
Con mi rutina de interrupción relleno así dos tablas paralelas con los valores de TIMER0 en cada flanco de subida y en cada flanco de bajada:
Codigo:
#int_EXT
EXT_isr() {
switch(fedge){
case 0: TimesUp[uTimeUp++]=GET_RTCC();
fedge=1;
ext_int_edge(H_TO_L);
break;
case 1: TimesDown[uTimeDown++]=GET_RTCC();
fedge=0;
ext_int_edge(L_TO_H);
break;
}
}
TimesUp y TimesDown son sendos Arrays de integers donde guardo cada uno de los tiempos para cada tipo de flanco del pulso.
Aún suponiendo que mi pulsador fuese perfecto, que no lo es, debería tener siempre pares de valores de TIMER0. Inicio siempre el programa esperando el flanco de subida, que al producirse (case fedge=0) hace que se reprograme la interrupción para esperar el de bajada (case fedge=1) .... con una pulsación perfecta, sin rebotes, con un solo pulso, debería tener al menos dos valores de TIMER0 con ambos flancos.
Sorprendentemente no es así. La mayoria de las veces solo obtengo números impares de interrupciones faltandome uno de los flancos.
Perplejo estoy. ¿Se os ocurre algo?