TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: SYLA0285 en 11 de Diciembre de 2007, 20:23:18

Título: AYUDA SRF02 Y PIC BASIC
Publicado por: SYLA0285 en 11 de Diciembre de 2007, 20:23:18
HOLA ESTOY UTILIZANDO UN SENSOR ULTRASONICO DE DISTANCIA SRF02 QUE SE PUEDE
COMUNICAR VIA SERIE A 9600 BAUDIOS, PERO LO MALO ES QUE SUS COMANDOS SON OPERADOS
CON NUMEROS DECIMALES O HEXADECIMALES, PERO NO SE COMO ENVIARLOS LO QUE HE UTILIZADO PARA
COMUNICARME CON LA COMPU, ES LOS SIGUIENTE, QUE YA MODIFICADO ME QUEDO PARA EL SENSOR DE DISTANCIA,
LO MALO ES QUE NO SE COMO RECIBIR LA RESPUESTA DEL SENSOR.

'****************************************************************
'*  Name    : MOTOR DE PASOS                                      *
'*  Author  : OSCAR SUCHIL PEREZ
'*  Notice  : Copyright (c) 2007 [set under view...options]     *
'*          : All Rights Reserved                               *
'*  Date    : 23/11/2007                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
INCLUDE "modedefs.bas"
DEFINE OSC 4 'se define el oscilador en MHz
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h ' ya no mover esta bien
DEFINE HSER_BAUD 9600
DEFINE HSER_SPBRG 25

TRISB = %00000000 'A B C D _ _ _ _
TRISC = %00000000 ' RX TX _ _ _ _ _ _PUERTO SERIAL

datoin var byte' palabra recibida
datoout var byte' palabra enviada
cu var WORD
decide var WORD

' SALIDAS
A VAR PORTB.7
B VAR PORTB.6
C VAR PORTB.5
D VAR PORTB.4
ali VAR PORTB.3
RX VAR PORTC.7
TX VAR PORTC.6
e1 VAR bit
e2 VAR bit
e3 VAR bit
e4 VAR bit
e1 = 0
e2 = 0
e3 = 0
e4 = 0
decide = 0
high ali
low A
low B
low C
low D
datoin=0
ciclo:
     HSEROUT [HEX 0]
     HSEROUT [HEX 96]
     HSEROUT [HEX 84]
     SERIN RX,2,1000,ciclo,[datoin ]
      if  datoin <=  15 then
       decide = 1
       call imprime
      endif
      if datoin > 15 then
       decide = 2
       call imprime
      endif
     GOTO ciclo
imprime:
        if decide = 1 then
            high A
        endif
        if decide = 2 then
            high C
        endif
RETURN
Título: Re: AYUDA SRF02 Y PIC BASIC
Publicado por: navaismo en 12 de Diciembre de 2007, 13:28:48
bien sean decimales o hexadecimales puedes usar la opcion por sofware Serin y Serout. Pero tendrias que dar mas datos acerca de como funciona el SRF ya que hay ver los tiempos de respuesta. Por ahi creo que utiliza 2 pines o es el de un pin?
Título: Re: AYUDA SRF02 Y PIC BASIC
Publicado por: xocas en 12 de Diciembre de 2007, 13:45:06
hola

quizás en este pdf (http://www.tecnun.es/asignaturas/robots/datasheets/Medidor%20ultrasonico%20SRF02.pdf) puedas encontrar algo que te sirva. yo creo recordar que parallax tenía algún ejemplo para basicStamp (que te sería muy fácil trasladar a picbasic) en su web.

el amigo RedPic tiene un artículo sobre el funcionamiento del sfr04, que a pesar de no ser el mismo no estaría de más que vieras. en su web: RedPic (http://picmania.garcia-cuervo.com/Proyectos_AUX_SRF04.php)

un saludo
Título: Re: AYUDA SRF02 Y PIC BASIC
Publicado por: navaismo en 12 de Diciembre de 2007, 14:11:02
Leyendo el PDF que dejo el amigo Xocas creo que podrias usar mejor las intrucciones por software serin2 y serout2

y un ejemplo rapidin seria:

Código: FreeBasic
  1. include "modedefs.bas"
  2.  
  3. tx var portb.0
  4. rx var portb.1
  5.  
  6. medida var word
  7.  
  8. lectura:
  9. serout2 tx, 84,[dec 84]  'envias el comando de lectura y envio de la lectura en cm
  10. ' pause 70                      ' validar si lleva esta pausa
  11. serin2 rx,84,medida       'inmediato lees el resulatdo en cm
  12.  
  13. lcdout $FE,1, "medida en cm: ", dec medida
  14. goto lectura

Bien es un ejemplo que quizas te funcione, es para darte la idea no vayas a creer que ya lo probe pues no tengo el SRF02 y me queda la duda si en este caso la medida tambien tardara 70mS para la comunicacion serie. Si tambien aplica basta con poner entre el serout y el serin una pausa de 70

Título: Re: AYUDA SRF02 Y PIC BASIC
Publicado por: Mario en 12 de Diciembre de 2007, 17:12:23
el amigo RedPic tiene un artículo sobre el funcionamiento del sfr04, que a pesar de no ser el mismo no estaría de más que vieras. en su web: RedPic (http://picmania.garcia-cuervo.com/Proyectos_AUX_SRF04.php)


Creo que el SRF04 es para I²C....... creo.
Título: Re: AYUDA SRF02 Y PIC BASIC
Publicado por: LordLafebre en 12 de Diciembre de 2007, 18:35:08
Hola:

El SRF04 no es por I2C, esos son el SRF08 y SRF10
Título: Re: AYUDA SRF02 Y PIC BASIC
Publicado por: Mario en 13 de Diciembre de 2007, 03:45:33
Hola:

El SRF04 no es por I2C, esos son el SRF08 y SRF10


Ya decía yo...... entonces tengo el SRF08
Título: OK THANKIUS
Publicado por: SYLA0285 en 14 de Diciembre de 2007, 19:39:35
GRACIAS A TODOS POR SU AYUDA, MIREN LES VOY A EXPLICAR SEGUN EL PROTOCOLO USART QUE TIENE EL PIC 16F877
ESTOY USANDO LAS INSTRUCCIONES

hserout
serin

para poder recibir y enviar datos del pic a la compu con un código en visual basic y funciona, ojo intente ocupar lo mismo para comunicarme
con el SRF02, que se supone solo requiere de un decimal ó un hexadecimal para entrar a los registros del software interno del sensor para habilitar una
medida y recibir los datos ya en cm, pero la bronca es, que no me ha funcionado el comando para recibir datos del sensor.

Lo malo es que no se si sea en si la instrucción que ocupe ó bien
la forma en que declare la variable interna del comando serin(variable) ya que le puse que fuera un byte para poder almacenar el dato en binario
de cuantos centimetros midio.

Ahora la frecuencia a la que comunico con el SRF02 es 9600 baudios igual que con la compu pero no se si tenga problemas ahi.

Bueno voy a seguir probando haber que le hago ya copie su código para probarlo.

Atte SYLA saludos

Título: gracias nuevamente REDPIC
Publicado por: SYLA0285 en 14 de Diciembre de 2007, 19:53:35
yA cheque el apartado que me enviaste voy a probar hacer un contador en el pic para enviar
los pulsos necesarios yo creí que era mas sencillo solo enviarle el comando y este ya te lo
regresaba en cm. y con escala real, pero bueno creo que es mas lo que tu me dices.
Título: Re: AYUDA SRF02 Y PIC BASIC
Publicado por: navaismo en 14 de Diciembre de 2007, 21:27:45
yA cheque el apartado que me enviaste voy a probar hacer un contador en el pic para enviar
los pulsos necesarios yo creí que era mas sencillo solo enviarle el comando y este ya te lo
regresaba en cm. y con escala real, pero bueno creo que es mas lo que tu me dices.

Si de hecho es lo mas Facil. En teoria -recalco en teoria- el codigo que te mande deberia servir ya que envia a 9600 sin invertir -en caso de que sea invertido deberas modificar el 84 por el valor que corresponda a 9600 invertido- el dato 84 que se supone es el que el sensor hara la medida en cm y te la regresa inmediatamente por ello seguido esta el serin2 que recibe los datos del SFR02 y los guarda en la variable llamada medida.
Título: Re: AYUDA SRF02 Y PIC BASIC
Publicado por: SYLA0285 en 20 de Diciembre de 2007, 21:38:53
Hola navaisimo como estas?

Pues estuve probando con el programa que me proporcionaste y pues corrigiendo una que otra
cosilla sigue sin funcionarme siento que debe de ser mas fàcil, por que estuve leyendo y parece ser que solo en el modo I2C
es cuando se requiere que el pic le envie un tren de pulsos y espere al eco de respuesta, pero voy a seguir probando.

Lastima que sea un mugre sensor tan complcado de manejar, por que se supone
que es la ùltima maravilla en sensado de distancia.

Pero bueno seguire probando haber que rollo, ahi si a alguien se le ocurre algo me encantarìa me lo hiciera saber.

Bueno graciotas a todos
Título: YA CASI LO TENGO PERO NECESITO AYUDIN
Publicado por: SYLA0285 en 31 de Enero de 2008, 18:39:06
ESTOY PROGRAMANDO UN SENSOR ULTRASONICO DE DISTANCIA SRF02 CON PICBASIC PRO
TENGO UN PIC16F877A Y UN CRISTAL OSCILADOR DE 4 MHZ

ACTUALMENTE HE LOGRADO UNA COMUNICACION CON LA COMPUTADORA CON EL SIGUIENTE PROTOCOLO
MODO SERIE:
9600 BAUDIOS
SIN PARIDAD
8 BITS DE DATOS
Y 1 BIT DE PARADA

LO MALO ES QUE PARA COMUNICARME CON EL SENSOR REQUIERO:
9600 BAUDIOS
1 BIT DE INICIO
SIN PARIDAD
8 BITS DE DATOS
2 BIT DE PARADA

BUENO MI CODIGO ES EL SIGUIENTE:

INCLUDE "modedefs.bas"' se define la librería donde se encuentran los operadores para puerto serial
DEFINE OSC 4 'se define el oscilador en MHz
DEFINE HSER_RCSTA 90h ' Configuración del modo de recepción del pic
DEFINE HSER_TXSTA 24h ' Configuración del modo de transmisión del pic
DEFINE HSER_BAUD 9600 ' Frecuencia con la que existe una correcta transferencia de datos
DEFINE HSER_SPBRG 25 ' Valor calculado según el valor del Oscilador y el rango de baudios
TRISB = %00000000 'A B C D _ _ _ _ deficinion de Salidas para el movimiento de motor de pasos
TRISC = %00000000 ' RX TX _ _ _ _ _ _ Configuración de pines receptores y transmisores del pic
cu var WORD 'variable interna para contador utilizado en secuencias
decide var WORD 'variable interna para condicionar la entrada a secuencias dependiendo de la recepción de datos
' SALIDAS
A VAR PORTB.7
B VAR PORTB.6
C VAR PORTB.5 ' Pines de control de movimiento de motor de pasos
D VAR PORTB.4
ali VAR PORTB.3 ' Led de alimenación al sistema
RX VAR PORTC.7
TX VAR PORTC.6  ' Pines para puerto de recepción
e1 VAR byte
e2 VAR byte
dato VAR byte
e3 VAR bit   ' Variables que capturan los bits recibidos
e4 VAR bit   
e5 VAR bit
e1 = 0
e2 = 0
e3 = 0  ' Inicialización de bits de datos
e4 = 0
e5 = 0
decide = 0
high ali
LOW A
LOW B     ' Inicialización de pines para control de motor
LOW C
LOW D
cu = 0
ciclo: ' Programa principal
         HSEROUT [$0,$60]
         PAUSE 100
         HSEROUT [$0,$51]
         PAUSE 100
         HSEROUT [$0,$54]
         PAUSE 100
         SERIN RX,2,100,ciclo,[$0],e1,e2 'Recepción de datos y almacenamiento en variables temporales
         if e1 != 0 then
            high A                  ' OJO intullo que aqui tambien anda algo mal por que segun el datasheet del SRF02 el sensor manda
         endif                         de regreso 2 bytes ó 2 palabras las cuales no se como se reciben en código PICBASIC
         if e3 != 0 then            el código anterior lo ocupo y funciona para recibir bits por separado provenientes de la PC de un programa en VISUAL BASIC
            high B
         endif       
         GOTO ciclo
   

AGRADECERIA MUCHO SU AYUDA DE ANTEMANO
es lo malo de no saber picbasic bien hombre jaja
Título: Re: AYUDA SRF02 Y PIC BASIC
Publicado por: LordLafebre en 31 de Enero de 2008, 18:55:23
Hola:

No hace falta que postees lo mismo en varios subforos, voy a borrar el otro tema que tienes puesto en el subforo de Robótica, creaste otro mas en este mismo subforo, por favor lee las reglas del foro.

PD: perdon Xocas por eliminar tu mensaje en uno de los temas repetidos.
Título: Re: AYUDA SRF02 Y PIC BASIC
Publicado por: SYLA0285 en 31 de Enero de 2008, 20:59:29
AH NO HAY PROBLEMA

CREI QUE SI SE PODIA SORRY
PERO RESPECTO AL PROBLEMIN
COMO VES
QUE SOLUCION
HABRA?
Título: GRACIAS NAVAISIMO
Publicado por: SYLA0285 en 11 de Febrero de 2008, 18:58:34
GRACIAS NAVAISIMO !!! Y A TODOS TAMBIEN

FIJATE QUE YA FUNCIONO EL CODIGO QUE ME RECOMENDASTE PARA EL SENSOR DE TEMPERATURA
PARECE SER QUE LA MODALIDAD MAS SENCILLA ES LA I2C SOLO QUE TUVE QUE AGREGAR
A LAS TERMINALES DEL SENSOR SRF02 2 RESISTENCIAS PULL UPS DE 4.7 K OHMS

PERO YA FUNCIONO LUEGO LES PUBLICO EL CODIGO PARA QUE NO TENGAN PROBLEMAS CON
ESTE TIPO DE SENSORES.

Título: Re: AYUDA SRF02 Y PIC BASIC
Publicado por: navaismo en 11 de Febrero de 2008, 20:23:29
Excelente!! y si las comunicaciones I2C llevan las Resistencias  PULLUP.

Que buenoque ya te sirvio
Título: Lo prometido es deuda NAVAISIMO para todos amigos aquiva
Publicado por: SYLA0285 en 15 de Febrero de 2008, 17:05:08
Bueno el siguiente código es para que no batallen mas con el sensor SRF02 y puedan medir perfectamente
utilizo 9600 baudios no hay paridad 1 bit de inicio 1 de paro 8 bits de datos, tienen que hacer una interfaz en visual
para poder ver los datos vía serial del pic pero cualquier duda me contactan:

'****************************************************************
'*  Name    : SRF02 CON COMUNICACION I2C.BAS                    *
'*  Author  : [set under view...options]                        *
'*  Notice  : Copyright (c) 2008 [set under view...options]     *
'*          : All Rights Reserved                               *
'*  Date    : 04/02/2008                                        *
'*  Version : 1.0                                               *
'*  Notes   : Este programa utiliza un SRF02 (sensor de         *
'*          : distancia ultrasónico) utiliza comunicación       *
'*          : I2C con el PIC16F877A y este pic a su vez se      *
'*            : comunica con la PC para enviar datos obtenidos  *
'****************************************************************
DEFINE OSC 4
DEFINE HSER_RCSTA 90h ' Configuración del modo de recepción del pic antes 90h
DEFINE HSER_TXSTA 24h ' Configuración del modo de transmisión del pic antes 24h
DEFINE HSER_BAUD 9600 ' Frecuencia con la que existe una correcta transferencia de datos
DEFINE HSER_SPBRG 25 ' Valor calculado según el valor del Oscilador y el rango de baudios
TRISB = %00000000 'A B C D _ _ _ _ deficinion de Salidas para el movimiento de motor de pasos
TRISC = %00000000 ' RX TX _ _ _ _ _ _ Configuración de pines receptores y transmisores del pic
CCP1CON = 0
ali VAR PORTB.3 ' Led de alimenación al sistema
RX VAR PORTC.7
TX VAR PORTC.6  ' Pines para puerto de recepción
B0 VAR byte[8]
B1 VAR byte[8]
PB VAR byte[8]
c var byte
I2CDataPIN  VAR PortC.4 '
I2CClockPIN  VAR PortC.3 '
medida VAR WORD
srfdevice VAR byte ' PARA SRF02 preprogramó los adress $E0
srfdevice = $E0
B0 = %00000000
srfregister0 VAR byte  ' es el COMMANDregister del SRF02
srfregister0 = $00
srfreadregister2 VAR byte 'registro de lectura
srfreadregister2 = $02
srfreadregister3 VAR byte 'registro de lectura
srfreadregister3 = $03
srfreadregister4 VAR byte 'registro de lectura
srfreadregister4 = $04
srfreadregister5 VAR byte 'registro de lectura
srfreadregister5 = $05
reset VAR byte 'registro que resetea el modulo SRF02
cmcommand VAR byte
cmcommand = 0  'Valor inicial para la variable de comandos
c = 0
high ali
ciclo:
  SERIN2 RX,84,100,ciclo,[BIN B0]
  If B0 = %10000000 then'SI LA CONDICION SE CUMPLE LA LECTURA SE HACE EN PULGADAS
   cmcommand = 80
  EndIF
  If B0 = %01000000 then'SI LA CONDICION SE CUMPLE LA LECTURA SE HACE EN CM.
   cmcommand = 81
  EndIf
  If B0 = %00100000 then'SI LA CONDICION SE CUMPLE LA LECTURA SE HACE EN uS
   cmcommand = 82
  EndIf
  If B0 = %00010000 then'SI LA CONDICION SE CUMPLE LA LECUTRA SE IMPRIMIRA EN M.
   cmcommand = 81
  EndIf
  If B0 = %00000000 then'SI LA CONDICION SE CUMPLE VUELVE A CICLO
    goto ciclo
  EndIf
  i2cwrite I2CDatapin, I2CClockpin, srfdevice,srfregister0, [cmcommand]' MANDA AL SENSOR $E0 REALIZAR MEDIDA
  pause 100
  i2cread I2CDatapin, I2CClockpin,srfdevice,$02,[PB]' REGISTRO 2 ULTIMA MEDIDA REALIZADA BYTE ALTO 
  pause 1000
  i2cread I2CDatapin, I2CClockpin,srfdevice,$03,[B1]' REGISTRO 3 ULTIMA MEDIDA REALIZADA BYTE BAJO
  pause 1000
  If B0 = %10000000 then'SI LA CONDICION SE CUMPLE LA LECTURA SE HACE EN PULGADAS
   HSEROUT["0",DEC2 PB,DEC2 B1]
  EndIF
  If B0 = %01000000 then'SI LA CONDICION SE CUMPLE LA LECTURA SE HACE EN CM.
   HSEROUT["0",DEC2 PB,DEC2 B1]
  EndIf
  If B0 = %00100000 then'SI LA CONDICION SE CUMPLE LA LECTURA SE HACE EN uS
   HSEROUT["0",DEC2 PB,DEC2 B1]
  EndIf
  If B0 = %00010000 then'SI LA CONDICION SE CUMPLE LA LECUTRA SE IMPRIMIRA EN M.
   HSEROUT[DEC2 PB,".",DEC2 B1]
  EndIf
  If B0 = %00000000 then'SI LA CONDICION SE CUMPLE VUELVE A CICLO
    goto ciclo
  EndIf 
         
GOTO ciclo

"Disfrutenlo" Saludos