listo ya solvente la duda... y aqui les dejo mi pequeña implementacion...
Un medidor de velocidad (velocidad media) usando un sensor parallax ultrasonido de 3 pines con un 16f877a y una LCD cualquier aporte para mejorarlo lo agradeceria mucho...
//_________________________________________________________________________________ //
// programa que permite medir la velocidad media de un objeto utilizando un sensor //
// por ultrasonido, el cual lo que hace es tomar dos mediciones de distancia y //
// tiempo para calcular la velocidad media a la cual el objeto se esta moviendo //
// y mostramos los datos en una LCD... //
// //
// se utilizo un PIC 16F877A ya que es el que se tenia disponible y una lcd de 16*2 //
// version 1.1 posiblemente se reestrucure el codigo fuente para un mejor desempeño //
// y funcionamiento //
// //
//________________________________kamus23 toDoPic.com.Ar ___________________________//
#include <16F877A.h>
#use delay(clock=4000000)
#fuses NOCPD,NOWDT,BROWNOUT,PUT,XT,NOWRT,NOLVP,NODEBUG,NOPROTECT //0x3F71
#define use_portb_lcd TRUE //selecciono puerto b para el LCD
#include <lcd.c>
#define sw1 PIN_D0 //definimos el PIN_D0 para el activador
#define sensor PIN_D1 //definicmos el PIN_D1 para el sensor ultrasonido
float tiempo1, tiempo2, distancia1, distancia2, velocidadmedia; // variables a utilizar
void main(){
lcd_init(); //inicializa la LCD
port_b_pullups(true); //activanmos pull ups
enable_interrupts(global); //activamos las interrupciones
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); //prescaler 1:1 cada incremento= 1ms
delay_ms(1000);
//__________________________Inicio del programa principal____________________//
inicio:
set_tris_d(0x1); //configuramos el trisd
output_low(sensor); //garantizamos un nivel bajo en el sensor
delay_ms(100);
if (input(sw1)){ //si pulsador activo entonces medimos velocidad
lcd_putc("\fencendido\n");
delay_ms(1000);
//_____________________________primera Medicion________________________________//
output_low(sensor); // nivel bajo en sensor
delay_ms(10); //retardo mietras se prepara
output_high(sensor); // activamos el sensor
delay_ms(10); // retardo mientras se envia el pulso de ultrasonido
set_tris_d(0xff); //cambiamos el trisd ahora como entrada
for ( ; !input(sensor); ); // Espero el inicio del pulso del eco (flanco de subida)
set_timer1(0); // Cuando llegue pon a cero el Timer1
for ( ; input(sensor); ); // Espero al final del pulso del eco (flanco de bajada)
tiempo1 = get_timer1(); // capturo el primer intervalo de tiempo
distancia1= tiempo1/58; //calculo la distancia1 del objeto
delay_ms(1000); // retardo opcional solo para ver la variacion de distancia
//_____________________________segunda medicion________________________________//
set_tris_d(0x1); // se reconfigura nuevamente el trisd
output_low(sensor); // se garantiza un nivel bajo
delay_ms(10); // retardo mientras se prepara
output_high(sensor); // se activa el sensor
delay_ms(10); // retardo mientras se envia el pulso
set_tris_d(0xff); // ahora configuramos en pin como entrada
for ( ; !input(sensor); ); // Espero el inicio del pulso del eco (flanco de subida)
set_timer1(0); // Cuando llegue pon a cero el Timer1
for ( ; input(sensor); ); // Espero al final del pulso del eco (flanco de bajada)
tiempo2 = get_timer1(); // capturo el primer intervalo de tiempo
distancia2= tiempo2/58; //calculo la distancia2 del objeto
delay_ms(50);
//______________________________________________________________________________//
// ahora con las variaciones de distancia y tiempo se calcula la velocidad media//
//________ velocidadmedia= (distancia2-distancia1)/(tiempo2-tiempo1) ___________//
//______________________________________________________________________________//
tiempo1=tiempo1/1000000; //llevamos tiempo1 a segundos
tiempo2=tiempo2/1000000 ;//llevamos tiempo2 a segundos
distancia1= distancia1/100 ;//llevamos distancia1 a metros
distancia2=distancia2/100 ;//llevamos distancia2 a metros
velocidadmedia=(distancia2-distancia1)/(tiempo2-tiempo1);//unidades metros/segundos
//__________________mostramos los datos en la LCD________________________________//
lcd_gotoxy(1,1);
printf(lcd_putc," %f m",distancia1);
lcd_gotoxy(1,2);
printf(lcd_putc," %f m",distancia2);
delay_ms(5000);
lcd_gotoxy(1,1);
printf(lcd_putc," %f seg",tiempo1);
lcd_gotoxy(1,2);
printf(lcd_putc," %f seg",tiempo2);
delay_ms(5000);
lcd_gotoxy(1,1);
lcd_putc("\fVelocidad Media\n");
lcd_gotoxy(1,2);
printf(lcd_putc," %f m/seg",velocidadmedia);
delay_ms(5000);
goto inicio; // nos devolvemos al inicio
//_____________________________________________________________________________//
}
else { // si el pulsador es cero
set_tris_d(0x1); // garantizamos que el pin este como salida del sensor
output_low(sensor); // dejamos un nivel bajo por seguridad
lcd_putc("\fapagado\n"); // mostramos mensaje en la LCD
delay_us(10); // delay
goto inicio;
}
}