Hola a todos, tengo un problema ya que no me doy cuenta como medir el tiempo entre
dos flancos descendentes, cabe destacar que una señal ingresa a RC2/CCP1 y la otra por RC1/CCP2.
La idea es medir el tiempo que transcurre entre el flanco descendente de una hasta el flanco descendente de
la otra señal (ya que ambas estan desfasadas).
Lo que si pude hacer es mediante las siguientes lineas de codigo, medir el tiempo entre ambos flancos descendentes
de una misma señal. Pero mi problema es como hacer para que esa medida sea entre el flanco descendente de la señal que
ingresa por RC2 y el flanco descendente que ingresa por RCI.
Ojala alguien pueda ayudarme..
Saludos...
----------------------------------------------------------------------------------------------------------
#include <16f877A.h>
#fuses NOPROTECT,NOCPD,NOLVP,NOWDT,XT
// Con estas directivas las funciones "input" y "output_bit" no reprograman
// el pin de la puerta cada vez que son utilizadas. Si no se indica el
// modo fast_io se asume por defecto standard_io el cual reprograma el pin
// siempre antes de ser utilizadas estas funciones.
#use fast_io (A)
#use fast_io (B)
#use fast_io (C)
#use delay(clock=4000000)
#include <lcd2.c> //Incluir funciones de manejo del LCD
int captura=1; //Contiene nº de captura realizada
int32 v_captura; //Contiene valor capturado
#int_ccp1 //Vector de interrupción del CCP1
tratamiento() //Función de tratamiento del CCP1
{
if (captura < 2) //Se han producido 2 capturas ??
{ //No, se ha detectado el flanco descendente
captura ++; //Siguiente captura
CCP_1=0;
setup_ccp1(ccp_capture_fe); //siguiente captura en el flanco descendente
set_timer1(0); //Repone el TMR1 con 0
}
else
{
captura = 1; //Restablecer 1ª captura
lcd_enviar(LCD_COMANDO,LCD_HOME); //Coloca el cursor
v_captura=CCP_1; //Lee valor capturado
v_captura=v_captura*8; //Ajusta *8 según valor del preescaler
printf(lcd_putc,"%06lu",v_captura); //Visualiza resultado
setup_ccp1(ccp_capture_fe); //Siguiente captura en el flanco descendente
}
}
main()
{
SETUP_ADC_PORTS(NO_ANALOGS);//Puerta A Digital
set_tris_c(0xff); //Puerta C entrada
enable_interrupts(int_ccp1); //Activa interrupción del CCP1
lcd_init(); //Inicia el módulo LCD
//El TMR1 actúa en el modo temporizador con reloj interno y un preescaler 1:8 evoluciona cada 8uS a 4MHz.
//Según esto, el periodo máximo que se puede medir estará comprendido entre 0,5s (2Hz) y 8 uS (125 KHz) aproximadamente.
//Para otros rangos se debe seleccionar un preescaler diferente.
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); //TMR1 Interno y preescaler de 1:8
//El módulo CCP1 actúa en modo de captura cada flanco ascendente
setup_ccp1(ccp_capture_fe); //1ª Captura en el flanco descendente
enable_interrupts(global); //Habilita interrupciones
while(1)
{
}
}