# Sensor ping de Parallax con ccs



## rikicarpio (Abr 13, 2010)

Hola a todos . Estoy trabajando con un pic *16F876A *con un cristal de *16Mhz*.
Estoy intentando utilizar el sensor PING de Parallax para detectar cuando un objeto está a 8cm del sensor,o menos, utilizando el compilador CCS.
Para empezar, este sensor és un clon del SFR04, peró utiliza el mismo pin para enviar el pulso de triger y para detectar la señal de eco.
Las especificaciones del sensor PING son:

Especificaciones:
Rango: 2 cm a 3 metros 
Tensión de alimentación: 5V +/-10- (Min: 4.5V, Max: 6V) 
Consumo: 30 mA típico, (35 mA max) 
Interfaz: 3 pines (VCC, GND, Señal) 
Comunicación "pulse in / pulse out" 
LED indicador de medición en curso 
Pulso TTL, mínimo 2 µs (5 µs típico) 
Pulso echo: Pulso TTL positivo, 115 µs a 18.5 ms 
Burst Frequency: 40 kHz for 200 µs 
Tamaño: 22 mm x 46 mm x 16 mm 

Este sensor proporciona una señal de eco de entre 115us para un objeto muy proximo (segun especificaciones 2 cm pero he leido que no llega a tanto sino a 4 cm) hasta 18500 us (para un objeto situado al límite de cerca de los 3 metros)

La idea que tengo es la siguiente :
Quiero que se ejecute una funcion mientras la señal del sensor no detecte un objeto que esté a 8cm o menos. He realizado un codigo que me gustaria comentar con alguien que haya tocado este tema.

Utilizo la interrupcion del timer0 cargado con un valor que representa 60ms con un preescaler de 256, para que cada ese tiempo, testee el sensor. 
Para la medicion de la duración del pulso de eco, utilizo el timer1 cargado para medir como mucho, un pulso de 25000 us, que significa ningun objeto
en los 3 metros delante del sensor.

Voy a escribir directamente aquí el codigo, obviando lo que no afecta al sensor y dejando para el final los cálculos exactos de los valor a cargar y comparar en los temporizadores...podria ser?

*#include<16F876A>
#use delay_clock(16000000)
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT

#byte PORTC=0x07
#byte TRISC=0x87

#bit pin_sensor=0x07.6 //pin utlizado para comunicar con el sensor

int16 eco=0;           //variable que guardará la duración del pulso de eco recibido
int1 obstaculo=0;     //variable que se pondrá a 1 cuando el obstaculo detectado este lo suficientemente cerca
                       // como a unos 8cm

INT_TIMER0
void_TIMER0_isr(void)  //función de interrupción del timer 0
{
TRISC=0x00;      //todo el puerto C salida incluido RC6
pin_sensor=1;
delay_us(5);
pin_sensor=0;    //envio pulso de 5 us
TRISC=0x40;      //todo el puerto salida excepto RC6 entrada
delay_us(10);    //esta espera no la tengo clara..pero he leido que es importante
while(!pin_sensor) //espero a que ping_sensor valga 1
set_timer1(75000); //cargo el timer1 con un valor que representa la duracion del pulso maximo
while(pin_sensor); //espero a que pin_sensor vuelva a valer 0
eco=get_timer1();

	if(eco<70000) // si el eco es menor que 70000 
	{
		obstaculo=1;

	}
	else
	{

		obstaculo=0;
	} 


}

void main()           //funcion principal
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
setup_timer_1(RTCC_INTERNAL|RTCC_DIV_256);
enable_interrupts(INT TIMER0);
enable_interrupts(Global);
set_timer0(240000);    	//cargo el timer0 para que ejecute su interrupción cada 60ms

	do{
		funcion_marcha();

		}while(!obstaculo)

	funcion_stop();
}*
podria ser más o menos? o estoy muy lejos? GRACIAS de antemano


----------



## jpardo (Jul 19, 2011)

Interesante, podrias colgar algun esquematico de tu circuito para analizarlo 
Saludos.


----------

