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.
Lesezeichen