hola
solamente trabajé con este tipo de módulos (sfr04) en una ocasión y de eso hace bastantes años, ahora no dispongo de uno para hacer pruebas así que todo se basa en teorías más o menos acertadas. para colmo, el trabajo que hice con este módulo fue uno de mis primeros trabajos y entonces aún no era consciente de la importancia de documentar bien el código, de manera que no recuerdo ni el pic usado ni su frecuencia de reloj.
el ejemplo que te puse es un primer boceto del programa, es el único que encuentro y no sé que cambios posteriores pudo haber, aunque si recuerdo que no tuve mayores problemas para que funcionara, que fue sobre todo cosa de ajustar los tiempos. también recuerdo que mientras hacia las pruebas con el módulo al aire tenía muchos falsos rebotes, que cesaron cuando mecanicé una pequeña caja dejando los sensores a paño.
viendo de nuevo el datasheet tenemos que:
- necesita un pulso de disparo de al menos 10us de duración
- envía una trama de 8 pulsos y espera respuesta de eco
- el eco devuelve un pulso cuya duración está determinada por la distancia. desde 100us para 1.7cm a un máximo de 25ms para 431cm. si la duración es mayor se entiende que no ha detectado objeto alguno.
- el valor devuelto por el eco se almacena en una variable al ser leído por PULSIN (var RANGE en nuestro caso)
- dado que la velocidad del sonido es de 29.15 us/cm y que hace un recorrido de ida y vuelta tenemos 58.30 us/cm. para obtener la distancia en cm aplicamos valor/58.
- si mis matemáticas no fallan tendríamos un pulso de aproximadamente 6 ms para una distancia de 1m, que dividido entre 58 nos da, también aproximadamente ya que estoy redondeando, un valor de 103 para RANGE una vez hecha la división.
el problema seguramente está aquí: "The resolution of PULSIN is dependent upon the oscillator frequency. If a 4MHz oscillator is used, the pulse width is returned in 10us increments. If a 20MHz oscillator is used, the pulse width will have a 2us resolution" es decir, creo que según sea la frecuencia del oscilador PULSIN devuelve un valor u otro. si por ejemplo el valor devuelto es 324, a 20Mhz sería = 648us y a 4Mhz = 65us con lo cual tras ser dividido tenemos muchas posibilidades de que la cifra final esté por debajo de 50, y por tanto se encienden ambos leds.
añade a continuación de la línea RANGE = 0 esta otra: disparo = 0, aumenta los pause a 20 y puedes hacerle caso a pajaro y probar con valores fijos para RANGE (comentas la línea PULSIN) y verificas que los condicionales se cumplan
un saludo y espero que puedas resolverlo