Hallo!

Bin schon fast am verzweifeln. Folgende Situation: An meiner RN-Control hab ich das SRF10-Modul+Sevo hängen und möchte es über einen gesendeten RS232 Befehl vom PC abfragen.
Erstmal ne Routine ohne RS232, sondern nur die Entfernung von drei Servopositionen abgefragt. Funktioniert wunderbar.
Wenns interessiert ist hier der Code:
Code:
'###################################################
'srf10_ultraschallbeispiel2.bas
'für
'RoboterNetz Board RN-Control (ab Version 1.1)
'und das SRF10 Ultraschallmodul für Entfernungsmessung
'Datenblatt zu SRF10:
'https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=310
'Bezug: Robotikhardware.de

'Aufgabe:
' Gibt die Entfernung von Objekten in Zentimetern aus
' Die Messungen werden mit fest vorgegebenen Verstärkungsfaktor
' ermittelt

'Autor: Frank  (Roboternetz)
'Weitere Beispiele und Beschreibung der Hardware
'unter http://www.Roboternetz.de oder robotikhardware.de
'#######################################################


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"


$crystal = 9216000                                          'Quarzfrequenz
$baud = 19200

Config Scl = Portc.2                                        'Ports fuer IIC-Bus
Config Sda = Portc.3
Config Pinc.0 = Output

Config Servos = 1 , Servo1 = Portc.0 , Reload = 10
Enable Interrupts
Dim Entfernung As Integer

Servo(1) = 080
   Wait 3                                                   'Warte 3 Sekunden
   I2cinit
   Print "SRF10 Testprogramm "
   Print "SRF 10 Firmware Version:" ; Srf10_firmware(&He0)

   Srf10_reichweite &HE0 , 5000                             'Reichweite in Zentimetern festlegen
   Srf10_verstaerkung &HE0 , 12                             'Verstärkungsfaktor




   Do
     Servo(1) = 035
     Wait 1
     Entfernung = Srf10_entfernung(&He0)
     Print "Entfernung:" ; Entfernung ; "cm"
     Wait 1
     Servo(1) = 080
     Wait 1
     Entfernung = Srf10_entfernung(&He0)
     Print "Entfernung:" ; Entfernung ; "cm"
     Wait 1
     Servo(1) = 135
     Wait 1
     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
Ist das bekannte Programm vom SRF10.
Nun möchte ich aber einen seriellen Befehl vom PC in meinem Fall ein "t" schicken, um die Messung auszulösen. (der Code kommt unten) Jetzt fährt der Servo in die erste Position und die Portlämpchen für den SCL/SDA-Port in meinem fall c.2 und c.3 flackern. Schaut so aus als hätt sich der M32 aufgehangen. Wenn ich nun ein paar Knöpfe auf der Tastatur drück, hört das Leuchten auf und ich bekomm eine 0 vom SRF zurück. Der Servo fährt in die zweite Position und das Spiel beginnt von vorne, bis er alle drei Messungen hat. Hab die SDA-Leitung auch schon mit nem 10k-Pullupwiederstand versehen, allerdings bessert sich da leider nix. Sitz schon seit heute Mittag dran und find den Fehler einfach nicht.
Könntet ihr euch bitte meinen Code anschauen wo da der Wurm drinsteckt...
Hier der Code:
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"


$crystal = 9216000                                          'Quarzfrequenz
$baud = 19200

Config Scl = Portc.2                                        'Ports fuer IIC-Bus
Config Sda = Portc.3
Config Pinc.0 = Output
Config Pinc.1 = Output

Config Servos = 2 , Servo1 = Portc.0 , Servo2 = Portc.1 , Reload = 10

Dim Entfernung As Integer
Dim I As String * 1
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Pwm1a = 0
Pwm1b = 0
Tccr1b = Tccr1b Or &H02

On Urxc Onrxd
Enable Urxc
Enable Interrupts

Servo(1) = 080

   I2cinit
   Wait 1
   Print "SRF10 Testprogramm "
   Print "SRF 10 Firmware Version:" ; Srf10_firmware(&He0)
   Srf10_reichweite &HE0 , 5000                             'Reichweite in Zentimetern festlegen
   Srf10_verstaerkung &HE0 , 12                             'Verstärkungsfaktor




   Do
     Gosub Rs232abfrage                                     'Hauptschleife
     Wait 3

   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

Onrxd:
I = I + Chr(udr)
Return
                                                                     'Testroutine
Test:
Servo(1) = 035
     Wait 1
     Entfernung = Srf10_entfernung(&He0)
     Print "Entfernung:" ; Entfernung ; "cm"
     Wait 1
     Servo(1) = 080
     Wait 1
     Entfernung = Srf10_entfernung(&He0)
     Print "Entfernung:" ; Entfernung ; "cm"
     Wait 1
     Servo(1) = 135
     Wait 1
     Entfernung = Srf10_entfernung(&He0)
     Print "Entfernung:" ; Entfernung ; "cm"
     Wait 1
Return

Rs232abfrage:

If Len(i) = 1 Then
Select Case I

     Case "t"
     Gosub Test

     Case Else
     I = ""

End Select
Print "OK"
I = ""
End If

Return
Hoff mir kann jemand helfen

Gruß