#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,parity=N,bits=8,stop=1)
unsigned long int contador=0, T=0;
int flag=0;
float f=0;
#INT_CCP1
void handle_ccp1_int()
{
T = contador; //periodo=cantidad de interrupciones
contador = 0;
f = 1000.0 / (float)T; //frecuencia=1/Tms
if(!input(PIN_D0)) //leemos el otro canal para saber la direccion
f*=-1.0;
set_timer1(64543);
flag=1;
}
#INT_TIMER1
void handle_timer1_int()
{
contador++;
set_timer1(64543); //interrumpe cada 1ms
}
void main()
{
set_tris_d(0x01);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts(INT_CCP1);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
set_timer1(64543);
while(TRUE)
{
if(flag)
{
flag=0;
printf("T=%ldms f=%fHz \r\n",T
,f
); }
}
}