TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: DanMech21 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 (http://www.msebilbao.com/notas/downloads/Medidor%20Ultrasonico%20SRF05.pdf) 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
-
Cual es el problema pues si lo compila
-
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
-
con que valor arranca RANGE? no esta definido eso
-
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
-
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.
-
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
-
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:
@ 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...)
-
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
-
hola de nuevo
creo que esto debería funcionarte:
'********************************************
'* 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
-
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
-
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.
-
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
-
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:
-
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... :-)
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
-
alguien me podria decir como conecto la LCD con el pic16f628a?
porfavor es urgente