Module1 - 1
'_________________________________________________________________________________________
'
' Rotinas para uso de um ou mais SRF08 em barramentoI2C pelo BX01.
'
' O endereço do SFR08 vem de fábrica como &HE0. portanto se tivermos
' mais de um no mesmo barramento, torna-se necessário mudar o endereço
' de cada um para que não tenhamos endereços repetidos. Isso é feito
' através da rotina:
'
' SRF08_Change_Addr(ByVal Addr As Byte, ByVal NewAddr As Byte)
'
' onde damos o endereço atual e o novo. Para essa mudança, o SRF08
' deverá estar sozinho no barramento. Os endereços válidos são:
' &HE0,&HE2,&HE4,&HE6,&HE8,&HEA,&HEC,&HEE,&HF0,&HF2,&HF4,&HF6,&HF8,
' &HFA,&HFC,&HFE. O SRF08 responde ao endereço &H00 (General Broadcast),
' portanto podemos solicitar o início da medida para todos ao mesmo
' tempo via broadcast. Porém a leitura das medidas deverá ser feita
' um a um individualmente. As outras rotinas são:
'
' SRF08_Do_Ranging(ByVal Addr As Byte)
'
Executa o "Ping" e recebe os ecos (17) num tempo de 70ms
'
' Function SRF08_Read_Ldr(ByVal Addr As Byte) As Byte
'
Lê a intensidade de luz
'
' Function SRF08_Read_Distance(ByVal Addr As Byte, ByVal Echo As Byte) As UnsignedInteger
'
Lê a distância em Cm de um determinado eco (1 a 17)
'
'_________________________________________________________________________________________
Public Sub SRF08_Change_Addr(ByVal Addr As Byte, ByVal NewAddr As Byte)
'Rotina para troca do endereço de um SRF08.
'Addr - Endereço atual
'NewAddr - Novo endereço
Call
Call
Call
Call
Call
Call
Call
I2C_start
I2C_out_byte(Addr)
I2C_nack
I2C_out_byte(0)
I2C_nack
I2C_out_byte(&HA0)
I2C_nack
Call
Call
Call
Call
Call
Call
Call
I2C_start
I2C_out_byte(Addr)
I2C_nack
I2C_out_byte(0)
I2C_nack
I2C_out_byte(&HAA)
I2C_nack
Call I2C_start
Call I2C_out_byte(Addr)
Module1 - 2
Call
Call
Call
Call
Call
I2C_nack
I2C_out_byte(0)
I2C_nack
I2C_out_byte(&HA5)
I2C_nack
Call
Call
Call
Call
Call
Call
Call
Call
I2C_start
I2C_out_byte(Addr)
I2C_nack
I2C_out_byte(0)
I2C_nack
I2C_out_byte(NewAddr)
I2C_nack
I2C_stop
End Sub
'_________________________________________________________________________________________
Public Sub SRF08_Do_Ranging(ByVal Addr As Byte)
'Rotina para executar uma medida pelo SRF08 endereçado
'Addr - Endereço do SFR08
Call
Call
Call
Call
Call
Call
Call
Call
I2C_start
I2C_out_byte(Addr)
I2C_nack
I2C_out_byte(0)
I2C_nack
I2C_out_byte(81) ' Cm - 81, polegadas - 80, us - 82
I2C_nack
I2C_stop
Call Delay(0.07)
End Sub
'_________________________________________________________________________________________
Public Function SRF08_Read_Ldr(ByVal Addr As Byte) As Byte
'Rotina para ler o valor relativo (adimensional) da intensidade de luz
'Addr - Endereço do SRF08
Dim Ldr As Byte
Call
Call
Call
Call
Call
Call
Call
Call
Call
I2C_start
I2C_out_byte(Addr)
I2C_nack
I2C_out_byte(1)
I2C_nack
I2C_start
I2C_out_byte(Addr + 1)
I2C_in_byte(Ldr)
I2C_ack
Module1 - 3
Call I2C_stop
SRF08_Read_Ldr = Ldr
End Function
'_________________________________________________________________________________________
Public Function SRF08_Read_Distance(ByVal Addr As Byte, ByVal Echo As Byte) As UnsignedInteger
'Rotina para ler a distância correspondente a um determinado eco (1 a 17)
'Addr - Endereço do SRF08
Set SRF08_Read_Distance = New UnsignedInteger
Dim
Dim
Dim
Dim
Temp1 As Byte
Temp2 As Byte
MSB As Byte
LSB As Byte
If (Echo < 1) Or (Echo > 17) Then
Echo = 1
End If
MSB = Echo * 2
LSB = MSB + 1
Call
Call
Call
Call
Call
Call
Call
Call
Call
Call
Call
Call
Call
Call
Call
Call
Call
Call
Call
I2C_start
I2C_out_byte(Addr)
I2C_nack
I2C_out_byte(MSB)
I2C_nack
I2C_start
I2C_out_byte(Addr + 1)
I2C_in_byte(Temp1)
I2C_ack
I2C_start
I2C_out_byte(Addr)
I2C_nack
I2C_out_byte(LSB)
I2C_nack
I2C_start
I2C_out_byte(Addr + 1)
I2C_in_byte(Temp2)
I2C_ack
I2C_stop
SRF08_Read_Distance = CuInt(Temp1) * 256 + CuInt(Temp2)
End Function
'_________________________________________________________________________________________