Hi,

ich habe das folgendermaßen gelöst (Slave):

Code:
Do
    If Register = 0 Then Gosub Sensoren                     'Sensoren auswerten

    Twi_control = Twcr And &H80                             'prüfen, ob TWINT gesetzt ist; Bit7 von Controlregister
    If Twi_control = &H80 Then
        Twi_status = Twsr And &HF8                          ' Status

        If Twi_status = &H80 Or Twi_status = &H88 Then      'Wert, der gelesen werden soll
            Register = Twdr                                 'in Register speichern
        End If
        If Twi_status = &HA8 Or Twi_status = &HB8 Then      'Master will ein Byte haben
            If Register = 1 Then Twdr = High(druck)         'Druck MSB
            If Register = 2 Then Twdr = Low(druck)          'Druck LSB
            If Register = 3 Then Twdr = Wasser              'Wasser (Byte)
            If Register = 4 Then Twdr = High(tiefe)         'Echo MSB
            If Register = 5 Then Twdr = Low(tiefe)          'Echo LSB
         End If

        Twcr = &B11000100                                   ' TWINT löschen, mit ACK
    End If

Loop
Der Master sendet einen Wert von 0-5 an den Slave. Der Slave antwortet je nach gesendetem Wert (wird in "Register" abgelegt) mit dem entsprechendem Byte.
Alternativ kann der Slave nach jedem gesendetetem Byte einen Zähler erhöhen und antwortet bei der nächsten Anfrage mit dem nächsten Byte.
Mit meiner Lösung muss ich aber nicht alle Byte auslesen, wenn ich nur eins haben will. Will ich z.B. nur das "Wasser"-Byte haben, sendet der Master eine 3 an den Slave.