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