Como a mi personalmente no me gusta que dentro de una interrupcion se hagan muchas cosas y sobre todo ejecuten funciones que demoran un buen tiempo menos aun en la interrupcion del timer, te sugiero que pruebes el codigo que dejo a continuacion, ademas de una forma mas elegante de detectar un flanco si obviamente tenes disponible alguna de las patas que pueden interrumpir.
#include <16f84a.h>
#fuses NOWDT,XT,
#use delay(clock=4000000)
#include <Lcd84sinRB0.c> //16f84 con RB0 libre
int contador=0;
int timer1s=0;
#byte PortB=0x06
#bit PataRB2=PortB.2
#bit PataRB0=PortB.0
///////////////////////INTERRUPCION////////////////////////
#int_EXT
Ext_isr()
{
delay_ms(2); //antirrebote
if(PataRB0==1)
contador++;
return;
}
#int_TIMER0
TIMER0_isr()
{
static int timer=0;
timer++; //suma 1 en cada interrupcion
if(timer==250) //a las 250 interrupciones paso 1seg
{
timer1s++;
}
return;
}
//////////////FIN INTERRUPCION////////////////////////////
void main()
{
lcd_init();
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_16); //para que interrumpa cada 4ms
enable_interrupts(INT_TIMER0);
ext_int_edge( L_TO_H ); //para que detecte flancos
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
set_tris_b(0x01);
while(1)
{
if(timer1s==5)
{
disable_interrupts(int_timer0);
lcd_putc("f"
; //borrar la pantalla
switch (contador)
{
case 1:
lcd_putc("1 PULSO
"
;
break;
case 2:
lcd_putc("2 PULSOS
"
;
break;
case 3:
..........................
...................
.........................
...................
default:
lcd_putc("MAS DE 12 PULSOS
"
;
break;
}
contador=0;
enable_interrupts(int_timer0);
timer1s=0;
}
}
}