Hallo Daniel,

du solltest (zumindest beim Slave) auf jeden Fall die Pins für SCL und SDA verwenden, die hardwaremäßig dafür vorgesehen sind.

Folgender Code für einen Slave sollte funktionieren. Es wird z. B. der Buchstabe S oder X übertragen, gefolgt von einem weiteren Wert:

Code:
$regfile = "m8def.dat"
$crystal = 8000000

'Subs deklarieren
Declare Sub Twi_init_slave

'SDA = pind.4 ; SCL = pind.5 (Hardware TWI)

Waitms 100
Call Twi_init_slave                                         ' TWI aktivieren

Const Maxanzahlbyte = 2                                     ' Wenn mehr Zeichen kommen werden diese verworfen !
Dim Messagebuf(maxanzahlbyte) As Byte
Dim Anzahlbuf As Byte                                       ' Anzahl Zeichen die gesendet wurden
Dim Neuemsg As Byte                                         ' zeigt an wenn eine neue Message gültig ist

Dim Twi_control As Byte                                     ' Controlregister lokale kopie
Dim Twi_status As Byte
Dim Twi_data As Byte
dim tmp as byte
Const Slaveid = &H82                                        'Adresse für I2C


Twi_data = 0
Anzahlbuf = 0
Neuemsg = 0

Do

    ' schauen ob TWINT gesetzt ist
    Twi_control = Twcr And &H80                             ' Bit7 von Controlregister auslesen

    If Twi_control = &H80 Then
        Twi_status = Twsr And &HF8                          ' Status ->Bit3 bis Bit7

        Select Case Twi_status

            ' Slave Adress received, wir sind gemeint !
            Case &H60 :
                Twcr = &B11000100                           ' TWINT löschen, erzeugt ACK
                Anzahlbuf = 0
                Neuemsg = 0                                 ' Flag für Message ungültig

            ' Byte mit ACK
            Case &H80 :
                If Anzahlbuf < Maxanzahlbyte Then
                    Incr Anzahlbuf                          ' zähler +1
                    Messagebuf(anzahlbuf) = Twdr
                End If
                Twcr = &B11000100                           ' TWINT löschen, erzeugt ACK

            ' Stop oder restart empfangen
            Case &HA0 :
                Twcr = &B11000100                           ' TWINT löschen, erzeugt ACK
                ' es müssen 2 Byte sein, damit das Paket OK ist
                If Anzahlbuf = 2 Then
                    Neuemsg = 1                             ' Flag für Message gültig
                Else
                    Neuemsg = 0                             ' Flag für Message ungültig
                End If
            'Master will ein Byte haben
            Case &HA8:
                 Twdr = Vers
                 Twcr = &B11000100
            'Master will weiteres Byte haben
            Case &HB8:
                 'TWDR = Count
                 'incr Count
                 'Twcr = &B11000100
            ' letztes Byte mit NACK, brauchen wir nicht
            Case &H88 :
            Case &HF8 :
            ' Fehler, dann reset TWI
            Case &H00 :
                Twcr = &B11010100                           ' TWINT löschen, reset TWI
            ' was anderes empfangen, sollte nicht vorkommen
            Case Else :
                Twcr = &B11000100                           ' TWINT löschen, erzeugt ACK

        End Select

    End If

    ' ein gültiges Paket angekommen
    If Neuemsg = 1 Then
        Neuemsg = 0                                         ' Flag wieder löschen
        Select Case Messagebuf(1)
                  Case "S":
                  Tmp = Messagebuf(2)
                  'Mache etwas damit
                  
                  Case "X":
                  Tmp = Messagebuf(2)
                  'Mache etwas anderes
              Case Else:
        End Select
    Waitms 100
    End If

    Waitms 10

Loop


End


' TWI als slave aktivieren
Sub Twi_init_slave
    Twsr = 0                                                ' status und Prescaler auf 0
    Twdr = &HFF                                             ' default
    Twar = Slaveid                                          ' Slaveadresse setzen
    Twcr = &B01000100                                       ' TWI aktivieren, ACK einschalten
End Sub