Autor Tema: Problema con programa para prueba de un sensor  (Leído 6876 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado DanMech21

  • PIC10
  • *
  • Mensajes: 31
Problema con programa para prueba de un sensor
« en: 03 de Mayo de 2009, 03:32:42 »
Que tal? , el motivo de este tema es el de preguntar que error tiene mi programa, ahora estoy trabajando en Pic Basic Pro, hace unos dias me llego un sensor ultrasonico que pedi es el SRF05, el cual quise probar si se encontraba en buen estado y me lanze a hacer un programa despues de leer la Hoja de datos y este fue el programa que realize (casi igual al de el ejemplo dela hoja de datos ...diferenciado por que no tengo el modulo BS2 , solo cuento con un 16f84a)
Programa...

    INICIO:
    RANGE   VAR WORD
   
    GO:
    PAUSE 200
    PULSOUT PORTB.0,5
    PULSIN  PORTB.1,1,RANGE
    RANGE = RANGE / 29
    IF RANGE <= 100 THEN PRENDE
    if RANGE > 100 THEN GO
   
    PRENDE:
    HIGH PORTB.7
    PAUSE 1000
    LOW PORTB.7
    pause 1000
    GOTO INICIO
   
    END




Muchas gracias por su atencion, estare atento por respuesta y ayuda, mi mail es d13_2c@hotmail.com si alguien me podria acesorar en esto

Saludos
Aprendiendo cada dia algo nuevo.

Desconectado Chrisbaf

  • PIC16
  • ***
  • Mensajes: 178
Re: Problema con programa para prueba de un sensor
« Respuesta #1 en: 03 de Mayo de 2009, 22:53:47 »
Cual es el problema pues si lo compila

Desconectado DanMech21

  • PIC10
  • *
  • Mensajes: 31
Re: Problema con programa para prueba de un sensor
« Respuesta #2 en: 04 de Mayo de 2009, 12:15:35 »
Antes que nada gracias por tu respuesta, el problema es que hace la rutina del LED sin hacer caso a las condisiones ... y no veo por que no hace caso a las condisiones :S bueno espero una respuesta muchas gracias

Saludos
     Daniel
Aprendiendo cada dia algo nuevo.

Desconectado doppel

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1536
Re: Problema con programa para prueba de un sensor
« Respuesta #3 en: 04 de Mayo de 2009, 14:49:32 »
con que valor arranca RANGE? no esta definido eso
" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "

Desconectado DanMech21

  • PIC10
  • *
  • Mensajes: 31
Re: Problema con programa para prueba de un sensor
« Respuesta #4 en: 04 de Mayo de 2009, 21:10:43 »
Que tal doppel muchas gracias por tu ayuda , ya le asigne un valor a range le puse el valor de 0 , entonces el programa quedo asi ...

    INICIO:
    RANGE   VAR WORD
   
    GO:
    RANGE = 0
    PAUSE 200
    PULSOUT PORTB.0,5
    PULSIN  PORTB.1,1,RANGE
    RANGE = RANGE / 29
    IF RANGE <= 100 THEN PRENDE
    if RANGE > 100 THEN GO
   
    PRENDE:
    HIGH PORTB.7
    PAUSE 1000
    LOW PORTB.7
    pause 1000
    GOTO INICIO
   
    END

Y sigo teniendo el mismo problema , mediante el LED de actividad del sensor veo que si esta mandando los pulsos , pero... la rutina de prender y apagar LED en el portb.7 , sigue realizandose sin haber nada que detecte el sensor , cuando se supone que el programa esta echo para que esta rutina del LED se desempeñe cuando el Sensor detecte algo a 1m de distancia. Ahora no se que es lo que estara mal :S , lo que quiero que haga mi propraga es que mande un pulso de minimo 10uS para el Trigger del Sensor y mediante otro pin que lea el ancho del eco, mediante el ancho del eco dividido entre 29 se saca la distancia del objeto en cm, en dado caso de haber objeto , si no pues no mide nada simplemente jeje. Espero haberme explicado de no ser asi agradezco me informen. Muchas gracias por las respuestas.

Saludos
      Daniel
Aprendiendo cada dia algo nuevo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema con programa para prueba de un sensor
« Respuesta #5 en: 04 de Mayo de 2009, 21:17:26 »
Daniel: Yo desconozco este lenguaje de programación para los uC, pero por lo que veo estás haciendo THEN PRENDE y THEN GO lo que significa que el compilador puede que interpret que PRENDE y GO son subrutinas en lugar de etiquetas. Tal vez hace falta que agregues GOTO antes de PRENDE y de GO.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado DanMech21

  • PIC10
  • *
  • Mensajes: 31
Re: Problema con programa para prueba de un sensor
« Respuesta #6 en: 04 de Mayo de 2009, 23:38:40 »
Hola bruno , antes que nada gracias por tu atencion , ya habia intentado lo de los GOTO y sigue igual :S y pongo 2  if , por que no me deja usar la opcion ELSE , no tengo la menor idea por la cual me marca error cuando intento compilar el programa de la siguiente manera ...

    INICIO:
    RANGE   VAR WORD
   
    GO:
    RANGE = 0
    PAUSE 200
    PULSOUT PORTB.0,5
    PULSIN  PORTB.1,1,RANGE
    RANGE = RANGE/29
    IF RANGE <= 100 THEN GOTO PRENDE ELSE GOTO GO    ' incluso lo intente sin el goto despues del else , sin los 2 goto  :S en fin me marcar error con el else
   
   
    PRENDE:
    HIGH PORTB.7
    PAUSE 1000
    LOW PORTB.7
    pause 1000
    GOTO GO
   
    END

No entiendo por que mi compilador no me deja ni compilar programas con a funcion FOR , TO, NEXT

   Saludos
        Daniel
Aprendiendo cada dia algo nuevo.

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: Problema con programa para prueba de un sensor
« Respuesta #7 en: 05 de Mayo de 2009, 15:35:11 »
hola

después de ver el datasheet del sfr05 y tu código doy por supuesto que estás usando el modo 1 del sensor y un 16F84A a 4Mhz.

hace muchísimo tiempo que no uso picbasic y lo que te digo está rescatado de mi poca memoria, así que si es incorrecto espero sepas perdonarme.

viendo las gráficas tenemos que el módulo necesita un impulso de al menos 10us para el disparo, envía un tren de 8 pulsos y devuelve una respuesta de eco que varía en función de la distancia al objeto. en este modo 1 se usan los pines Disparo y Salida ECO, manteniéndose el pin Mode sin conectar

veamos el código:

Código: [Seleccionar]
    @ DEVICE pic16F84A, 0x3ff1
      ' palabra de configuración:
        ' oscilador XT
        ' PWRT enable

    DEFINE OSC 4        ' aunque en PULSIN/PULSOUT no tiene influencia

    trisa = %00000      'puerto A todos como salidas
    trisb = %00000010   'puerto B.1 entrada, los demás como salidas
    porta = 0           'ponemos estado de puertos a 0
    portb = 0


    '************** Declaracion de variables ****************
    RANGE VAR WORD

 
   '****************** Inicio programa *********************   
    GO:
    RANGE = 0
    PAUSE 200
    PULSOUT PORTB.0,5
    PULSIN  PORTB.1,1,RANGE
    RANGE = RANGE/29
    IF RANGE <= 100 THEN PRENDE
    IF RANGE > 100 THEN GO
   
    PRENDE:
    HIGH PORTB.7
    PAUSE 1000
    LOW PORTB.7
    PAUSE 1000
    GOTO GO
   
    END


Las primeras líneas las incorporo siempre para no dejar nada al azar, y cuanto antes te acostumbres más fácil te será el paso a otros pics.

El comando PAUSE trabaja con periodos de ms, así PAUSE 200 establece una espera de 200ms. sin embargo tanto PULSIN como PULSOUT dependen de la frecuencia del reloj, que para 4Mhz supone incrementos de 10us y a 20Mhz serán de 2us. de esta forma PULSOUT PORTB.0,5 supone un pulso de 50us, muy por encima de los 10us reflejados en el datasheet del módulo. también podemos ver que el tiempo mínimo entre lecturas es de 20ms, quizá la pausa de 200ms que estableces sea demasiado elevada.

observo en tu código que el segundo pause de la rutina PRENDE está en minúsculas y si no recuerdo mal PBP pone en mayúsculas sus palabras reservadas...

El comando IF..THEN puede ir en una única línea tal como lo ponías, pero si se tratan más parámetros se ha de separar y terminar con la sentencia ENDIF:

IF RANGE <= 100 THEN
        GOTO PRENDE
    ELSE
        GOTO GO
    ENDIF

....

IF RANGE = 34 THEN
     A = 15
     B = 7
   ENDIF

un saludo y espero te sirva de algo (y no haber metido la pata en algo...)


Desconectado DanMech21

  • PIC10
  • *
  • Mensajes: 31
Re: Problema con programa para prueba de un sensor
« Respuesta #8 en: 05 de Mayo de 2009, 23:42:22 »
Que tal  Xocas06 muchas gracias por tu respuesta , y tu codigo esta muy bien ^^ al contrario no tengo que disculparte tengo que agradecerte .

El codigo esta muy bien y lo compilo a la perfeccion ... pero sigue el mismo problema , el LED indicador sigue prendiendo sin haber algo a 1 metro de el ... se supone que cuando no haya nada a 1 metro del sensor el LED no debe de prender , pero la rutina del LED de todos modos se ejecuta aunque la condision no sea verdadera =/ no se por que esta pasando esto. Y gracias a tu ejemplo ya se como compilar con las instruccion ELSE y como hacer un codigo mas completo :D muchas gracias. Pero aclaro , sigo con el problema  :(

Saludos
Aprendiendo cada dia algo nuevo.

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: Problema con programa para prueba de un sensor
« Respuesta #9 en: 06 de Mayo de 2009, 07:54:42 »
hola de nuevo

creo que esto debería funcionarte:

Código: [Seleccionar]
'********************************************
'*  Name    : ultrasons.BAS                 *
'*  Author  : tu mismo                      *
'*  Date    : 06/05/2009                    *
'*  Notes   : código para 16F84A a 4Mhz     *
'********************************************

@ DEVICE pic16F84A, 0x3ff1
  ' palabra de configuración:
     ' oscilador XT
     ' PWRT enable

DEFINE OSC 4        ' aunque en PULSIN/PULSOUT no tiene influencia

trisa = %00000      'puerto A todos como salidas
trisb = %00000010   'puerto B.1 entrada, los demás como salidas
porta = 0           'ponemos estado de puertos a 0
portb = 0


'************** Declaracion de variables ****************

RANGE VAR WORD
led1 VAR PORTB.6
led2 VAR PORTB.7
disparo VAR PORTB.0
echo VAR PORTB.1

'****************** Inicio programa *********************   
principal:
RANGE = 0
PULSOUT disparo,1       'impulso de 10us
PULSIN echo,1,RANGE     'lee eco de respuesta
RANGE = RANGE/11        'convierte a cm.
                        'RANGE/29 si la frecuencia es de 20Mhz
   
IF RANGE <= 150 AND RANGE > 50 THEN GOSUB unled    'si la distancia es menor o igual que 1,5 metros enciende un led
IF RANGE <= 50 THEN GOSUB leds                     'si la distancia es menor o igual que 0,5 metros enciende los dos
IF RANGE > 150 THEN GOSUB apaga                    'apaga leds
GOTO principal   
   
leds:
HIGH led1
HIGH led2
PAUSE 10    'puede que tengas que cambiar a PAUSE 20
GOTO principal

unled:
HIGH led1
PAUSE 10    'puede que tengas que cambiar a PAUSE 20
GOTO principal

apaga:
LOW  led1
LOW  led2
GOTO principal
   
END

si no funciona, cambia los PAUSE 10 por PAUSE 20 y elimina RANGE = 0

un saludo


Desconectado DanMech21

  • PIC10
  • *
  • Mensajes: 31
Re: Problema con programa para prueba de un sensor
« Respuesta #10 en: 06 de Mayo de 2009, 23:31:04 »
Hola xocas06 , mil gracias por tu ayuda :D , pero desafortunadamente sigue sin funcionar , pasa lo mismo , ejecuta las rutinas de los LEDs, en este caso desde que le aplico voltaje al circuito los LEDs se quedan prendidos , los 2 ... sabes yo creo que el problema esta en la division abra alguna otra forma de ver su la instruccion " / " funciona? yo creo que el problema esta ahi, no tengo fundamentos :S jeje pero si un presentimiento ... o tal vez sea mi compilador .. podrias ahora mandarme el HEX para pasarlo directo al micro? de antemano muchas gracias por tus aportes y atencion

Saludos amigo
Aprendiendo cada dia algo nuevo.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Problema con programa para prueba de un sensor
« Respuesta #11 en: 07 de Mayo de 2009, 09:01:54 »
hola amigo

Dederias aplicar,lo de divide y venceras.

primero plueba a encender de forma manual, lo mismo con apagar,

el tiempo  podria ser demasiado corto y no ver como se apaga, y en realidad si que lo hace bien.
La pausa en que medida es milisegundos, segundos, microsegundos


El rango metele uno fijo de momento para ver si funciona, despues se lo cambias y verificas que funciona.

yo no soy muy partidarios de poner los if RANGE......THEN..
en la misma linea, verifica lo que te dijo el amigo xocas, el endif

empieza con distancias cortas y luego la vas a largando.

verifica lo del cristal que usas si se corresponde con el rango usado por ti.

Un saludo amigo.


Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: Problema con programa para prueba de un sensor
« Respuesta #12 en: 07 de Mayo de 2009, 14:12:57 »
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


Desconectado DanMech21

  • PIC10
  • *
  • Mensajes: 31
Re: Problema con programa para prueba de un sensor
« Respuesta #13 en: 11 de Mayo de 2009, 23:32:38 »
que tal , disculpen la tardansa xocas06 y pajaro , en contestarles esque e estado ocupado con la escuela, ahora me gustaria contactarlos por medio del msn ... me podrian agregar o dar sus msn para agregarlos asi mantener una charla del tema un poco mas agusto jeje muchas gracias , mi msn es  d13_2c@hotmail.com , saludos  :mrgreen:
« Última modificación: 11 de Mayo de 2009, 23:35:19 por DanMech21 »
Aprendiendo cada dia algo nuevo.

Desconectado DanMech21

  • PIC10
  • *
  • Mensajes: 31
Re: Problema con programa para prueba de un sensor
« Respuesta #14 en: 21 de Mayo de 2009, 18:12:49 »
Que tal amigos, aqui yo denuevo jeje pero con buenas noticias :-/, el problema esta resuelto porfin funciono el SRF05 y funciono con el siguiente codigo , lo pondre para que les sea util a todos los que manejen este sensor, muchas gracias a los que me brindaron su ayuda en este post... :-)

Código: [Seleccionar]
Include "modedefs.bas" ' Include serial modes

trisa = %00000000 ' set porta to outputs
trisb = %00001000 ' set portb pin 3 to input

lcd           var PORTA.3 ' define variables and constants
piezo       var PORTB.4
trigger      var PORTB.2
echo         var PORTB.3
left_led     var PORTB.0
right_led   var PORTB.1
baud          con N2400
dist_raw     var word
dist_inch    var word
dist_cm      var word
conv_inch    con 15
conv_cm      con 6

low trigger ' set trigger pin to logic 0
low left_led ' turn off left LED
low right_led ' turn off right LED

Serout lcd,baud,[254,1] ' clear lcd screen

pause 1000 ' give time to initialize lcd

Serout lcd,baud,[254,128,"- Sonar Ranger -"] ' display program title on the LCD

sound piezo,[100,10,50,5,70,10,50,2] ' Make startup sound
                                               
pause 1000 ' wait for 1 second

Serout lcd,baud,[254,128,"inches:         "] ' set up the LCD display

Serout lcd,baud,[254,192,"centimeters:    "]

main:

     gosub sr_sonar ' get sonar reading

     if dist_cm <= 100 then call LED
     
     IF dist_cm >100 then call APA
     
     
     Serout lcd,baud,[254,135,#dist_inch,"   "] ' display the distance in inches

     Serout lcd,baud,[254,204,#dist_cm,"   "] ' display the distance in centimeters

Goto main
LED:   
    high PORTB.0
    RETURN
APA:
    low PORTB.0
    RETURN

end

sr_sonar:

         pulsout trigger,1 ' send a 10us trigger pulse to the SRF04
         pulsin echo,1,dist_raw ' start timing the pulse width on echo pin
         dist_inch = (dist_raw/conv_inch) ' Convert raw data into inches
         dist_cm = (dist_raw/conv_cm) ' Convert raw data into centimeters
         pause 1 ' wait for 10us before returning to main

return

Espero le sea util a muchas personas , Saludos
Aprendiendo cada dia algo nuevo.


 

anything