#include <16F877A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //OSC MAYOR A 4MHz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
int8 numero_de_flanco_subida_ccp1=0;
int8 numero_de_flanco_subida_ccp2=0;
int16 desbordes_tmr0=0;
int16 veces_desbordado_ccp1=0;
int16 veces_desbordado_ccp2=0;
int16 periodo_alto_en_ticks_ccp1=0;
int16 periodo_alto_en_ticks_ccp2=0;
int32 cantidad_de_ticks_ccp1=0;
int32 cantidad_de_ticks_ccp2=0;
int32 ultima_cantidad_de_ticks_ccp1=0;
int32 ultima_cantidad_de_ticks_ccp2=0;
int16 conteo_control_ccp1=0;
int16 conteo_control_ccp2=0;
////////////////////////////////////////////////////////////////////////////////////
// Interrupcion por desborde de TMR0
////////////////////////////////////////////////////////////////////////////////////
#int_timer0
void desbordamiento_tmr0()
{
desbordes_tmr0++;
}
////////////////////////////////////////////////////////////////////////////////////
// Interrupcion por desborde de TMR1
////////////////////////////////////////////////////////////////////////////////////
#int_timer1
void desbordamiento_tmr1()
{
veces_desbordado_ccp1++; //sumo 1 al desborde
veces_desbordado_ccp2++;
conteo_control_ccp1++;
conteo_control_ccp2++;
if (conteo_control_ccp1>151) //10000000=65536*desb+periodo_alto --> desb=151 --> me da f de 0,5Hz Minima q se mide
{
cantidad_de_ticks_ccp1=0;
}
if (conteo_control_ccp2>151)
{
cantidad_de_ticks_ccp2=0;
}
}
////////////////////////////////////////////////////////////////////////////////////
// Interrupcion por Recepcion de flanco de SUBIDA en CCP1
////////////////////////////////////////////////////////////////////////////////////
#int_ccp1
void llego_flanco_ccp1()
{
numero_de_flanco_subida_ccp1++; // Cuento flanco que nos llega
if (numero_de_flanco_subida_ccp1 == 1) //es el primer flanco de subida dentro del conteo
{
veces_desbordado_ccp1 = 0; //reinicio contador de desborde
set_timer1(0); //reinicio el TMR1
}
if (numero_de_flanco_subida_ccp1 == 2) //ahora llego el segundo flanco de subida
{
periodo_alto_en_ticks_ccp1 = CCP_1; //guardo el valor de ccp_1
cantidad_de_ticks_ccp1 = (65536 * veces_desbordado_ccp1) + periodo_alto_en_ticks_ccp1;
if (cantidad_de_ticks_ccp1<41667) // 1000000/(0.2*41667)=120Hz -->MAX F QUE MEDIREMOS
{ // esto es para evitar conteos por ruidos....
cantidad_de_ticks_ccp1=0; //ultima_cantidad_de_ticks_ccp1; //para evitar un poco el posible ruido
} //si midio cualquiera, dejo lo q estaba medido q es bueno...
//ultima_cantidad_de_ticks_ccp1=cantidad_de_ticks_ccp1;
numero_de_flanco_subida_ccp1=0;
veces_desbordado_ccp1=0;
periodo_alto_en_ticks_ccp1=0;
conteo_control_ccp1=0;
}
}
////////////////////////////////////////////////////////////////////////////////////
// Interrupcion por Recepcion de flanco de SUBIDA en ccp2
////////////////////////////////////////////////////////////////////////////////////
#int_ccp2
void llego_flanco_ccp2()
{
numero_de_flanco_subida_ccp2++; // Cuento flanco que nos llega
if (numero_de_flanco_subida_ccp2 == 1) //es el primer flanco de subida dentro del conteo
{
veces_desbordado_ccp2 = 0; //reinicio contador de desborde
set_timer1(0); //reinicio el TMR1
}
if (numero_de_flanco_subida_ccp2 == 2) //ahora llego el segundo flanco de subida
{
periodo_alto_en_ticks_ccp2 = CCP_2; //guardo el valor de ccp_1
cantidad_de_ticks_ccp2 = (65536 * veces_desbordado_ccp2) + periodo_alto_en_ticks_ccp2;
if (cantidad_de_ticks_ccp2<41667) // 1000000/(0.2*41667)=120Hz -->MAX F QUE MEDIREMOS
{ // esto es para evitar conteos por ruidos....
cantidad_de_ticks_ccp2=0; //ultima_cantidad_de_ticks_ccp2; //para evitar un poco el posible ruido
}
//ultima_cantidad_de_ticks_ccp2=cantidad_de_ticks_ccp2;
numero_de_flanco_subida_ccp2=0;
veces_desbordado_ccp2=0;
periodo_alto_en_ticks_ccp2=0;
conteo_control_ccp2=0;
}
}
void main()
{
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
set_tris_b(0b01111111);
set_tris_c(0b10011111); //5out,4in
output_high(PIN_B7);
delay_ms(100);
output_low(PIN_B7);
delay_ms(100);
output_high(PIN_B7);
delay_ms(100);
output_low(PIN_B7);
setup_ccp1(CCP_CAPTURE_RE); //pongo para q espere flanco de SUBIDA el CCP1 y el CCP2
setup_ccp2(CCP_CAPTURE_RE);
set_timer1(0);
enable_interrupts(INT_CCP1); //habilito todas las interrupciones necesarias
enable_interrupts(INT_CCP2);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
while (true)
{
if(desbordes_tmr0>12500) //calculado para q pase 1.5seg es 7500000*0.2us=1500000
{ //si quiero cada 250ms --> 12500*.2us=2500
output_toggle(PIN_B7);
printf("@%Lu#",cantidad_de_ticks_ccp1);
delay_ms(5);
printf("$%Lu#",cantidad_de_ticks_ccp2);
desbordes_tmr0=0;
}
}
}