Bueno como lo prometido es deuda acá va el programilla....
Se puede arreglar mejor , pero no me he dado el tiempo para hacerlo
Ojalá les sirva.
Saludos
#include <16f877.h>
#device PIC16F877 *=16 ADC=8
#fuses HS,NOWDT,NOPROTECT
#USE DELAY(clock=20000000)
#use RS232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,PARITY=N,bits=8)
#ORG 0x1f00,0x1fff void loader(){}
#USE FAST_IO(b)
#byte PORTB=6
/*definicion de tiempos*/
/* Delay trigger en microsegundos*/
#define INPUT_TRIGGER_DELAY 5
/* Delay entre medidas 200us */
#define DELAY_BETWEEN_ECHO_PULSE 200
#define MAX_DELAY_ECHO_PULSE 44000 /*incrementos del timer para 35 ms usando prescaler de 4 */
/* Cada incremento del timer 1 toma 0.8us con un prescaler de 4 */
/* = # increments *( 0.8* 347) / (5000 *4) app. t / 72 */
#define GET_DISTANCE(t) (t / 72)
/* Configuracion del PIN */
#define ULTRASONIC_TX PIN_B4
#define DISTANCE_INFINITE (0xffff)
/* Definicion tipo de datos */
typedef int uint8_t;
typedef long uint16_t;
/* definicion de variables */
char c;
uint16_t echo_delay;
/* definicion de variables globales */
uint16_t distance = DISTANCE_INFINITE; /*Esta es la distancia del obejto mas cercano
frente al sensor (en cm). Si es infinito, la distancia
del objeto es mayor a la distancia que puede medir el sensor*)
/* Funciones prototipos*/
/* Interfaces publicas */
void main(void);
void init_timers(void);
void init(void);
void monitor_distance_sensor();
/* Inicializacion del driver.*/
void init(void) {
init_timers();
}
void init_timers(void) {
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4); /* Setup del Timer1 */
}
/* Programa principal. */
void main(void) {
loop: switch(getc()){
case'1':{ init();
for ( ; ; ) {
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
set_tris_b(0b00000000);
output_low(ULTRASONIC_TX);
monitor_distance_sensor();
if(c=='2'){ delay_ms(1000);
set_tris_b(0b00000000);
goto loop;
}
printf("echo delay %lu\r\n", echo_delay);
printf("distancia %lu\r\n", distance);
}
}
} /* main */
}
void monitor_distance_sensor(void) {
/*Se envia el pulso alto (trigger) por el Pin RB4 */
output_high(ULTRASONIC_TX);
delay_us(INPUT_TRIGGER_DELAY); /*duracion de 5us del pulso*/
output_low(ULTRASONIC_TX);
delay_us(250);
set_tris_b(0b00010000); /*Se invierte el PIN RB4 para recibir el pulso alto que mandara el sensor*/
/* Se espera el pulso alto que mandará el sensor. Esto detectara*/
/*la transicion de bajo a alto en el PIN RB4 . */
for ( ; !input(ULTRASONIC_TX); )
;
/* Se restea el TIMER1. */
set_timer1(0);
/*Aca se detecta la bajada del pulso anterior*/
for ( ; input(ULTRASONIC_TX); )
;
/*se captura la cuenta del TIMER1*/
echo_delay = get_timer1();
/*si la distancia es mayor a 35ms ( 44000*0.8 ) la distancia es infinita*/
if (echo_delay >= 44000) {
distance = DISTANCE_INFINITE;
}
else {
distance = GET_DISTANCE(echo_delay); /*si la distancia es menor a 35ms la distancia se detectara*/
}
delay_us(DELAY_BETWEEN_ECHO_PULSE);
}
#int_rda
inter() {
c=getc();
}