Hi@all!
Hänge am Problem fest wo ich auf eure Hilfe hoffe
Ziel ist es beim unterschreiten einer bestimmten Entfernung,gemessen durch SRF10, einen Servo in eine bestimmte Position zu bringen...
Als Beispiel mal die Entfernung 30cm....
Hier der Quellcode aus dem Wissensbereich+meiner Ergänzung...
Code:
Declare Function Srf10_entfernung(byval Srf10_slaveid As Byte) As Integer
Declare Sub Srf10_reichweite(byval Srf10_slaveid As Byte , Byval Reichweite As Word)
Declare Sub Srf10_verstaerkung(byval Srf10_slaveid As Byte , Byval Srf10_verstaerkung As Byte)
Declare Function Srf10_firmware(byval Srf10_slaveid As Byte) As Byte
$regfile = "m32def.dat"
$framesize = 42
$swstack = 42
$hwstack = 42
$crystal = 16000000 'Quarzfrequenz
$baud = 9600
Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1
Dim Entfernung As Integer
Wait 3 'Warte 3 Sekunden
I2cinit
Print "SRF10 Testprogramm "
Print "SRF 10 Firmware Version:" ; Srf10_firmware(&He0)
Srf10_reichweite &HE0 , 1000 'Reichweite in Zentimetern festlegen
Srf10_verstaerkung &HE0 , 10 'Verstärkungsfaktor
Do
Entfernung = Srf10_entfernung(&He0)
Print "Entfernung:" ; Entfernung ; "cm"
Wait 1
Loop
End
Function Srf10_entfernung(byval Srf10_slaveid As Byte) As Integer
Local LoB As Byte
Local Hib As Byte
Local Firmware As Byte
Local Temp As Byte
Local Srf10_slaveid_read As Byte
Srf10_slaveid_read = Srf10_slaveid + 1
'Messvorgang in starten
I2cstart
I2cwbyte Srf10_slaveid
I2cwbyte 0
I2cwbyte 81 in Zentimetern messen
I2cstop
Warteaufmessung:
Waitms 1
Firmware = Srf10_firmware(&He0)
If Firmware = 255 Then Goto Warteaufmessung
I2cstart
I2cwbyte Srf10_slaveid
I2cwbyte 2 'Leseregister festlegen
I2cstop
I2cstart
I2cwbyte Srf10_slaveid_read
I2crbyte Hib , Ack
I2crbyte Lob , Nack
I2cstop
Srf10_entfernung = Makeint(lob , Hib)
End Function
'Messreichweite in cm festlegen
Sub Srf10_reichweite(byval Srf10_slaveid As Byte , Byval Reichweite As Word)
Local Wert As Word
Local Temp As Byte
Wert = Reichweite / 4 'Ungefähre Registerberechnung
Temp = Low(wert)
I2cstart
I2cwbyte Srf10_slaveid
I2cwbyte 2 'Register
I2cwbyte Temp
I2cstop
End Sub
'Verstärung festlegen
Sub Srf10_verstaerkung(byval Srf10_slaveid As Byte , Byval Srf10_verstaerkung As Byte)
I2cstart
I2cwbyte Srf10_slaveid
I2cwbyte 1 'Register
I2cwbyte Srf10_verstaerkung
I2cstop
End Sub
Function Srf10_firmware(byval Srf10_slaveid As Byte) As Byte
Local Firmware As Byte
Local Srf10_slaveid_read As Byte
Srf10_slaveid_read = Srf10_slaveid + 1
I2cstart
I2cwbyte Srf10_slaveid
I2cwbyte 0 'Leseregister festlegen
I2cstop
I2cstart
I2cwbyte Srf10_slaveid_read
I2crbyte Firmware , Nack
I2cstop
Srf10_firmware = Firmware
End Function
####denke nun müsste folgendes kommen####
Config Servos = 1 , Servo1 = PortA.0 , Reload 10
Config PortA = Output
Enable Interrupts
###hier jetzt ein Befehl der die Distanz <30cm vorm nächsten Schritt abfragt??###
waitms 1000
Servo(1) = 100
loop
Hat jemand einen Tipp??
Gruß,Easy
Lesezeichen