Hallo,

mir gefällt dein modularsysten selbstverständlich auch.

ich werfe mal für dein I2C-Slave prob einen code in raum! bei fragen dazu immer raus damit!

Code:
'*******************************************************************************
'  um mit dem master zu senden folgenden code benutzen
'
'  I2cstart
'  i2cwbyte &H22    'slave-id
'  I2cwbyte 1       'für motor 1
'  I2cwbyte PWM1
'  I2cwbyte PWM1b   'falls die pwm variable größer als ein byte ist
'  I2cstop
'
'*******************************************************************************

'===============================================================================
'***| Mikrocontroller Config |**************************************************
'===============================================================================

'Microcontroller
'================
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 10
$framesize = 40


'TWI
'====
Declare Sub Twi_init_slave
Dim Twi_control As Byte
Dim Twi_status As Byte
Dim Command As Byte
Dim Index As Byte
Dim Newbyte As Byte
Dim I2cbyte(10) As Byte
Dim N As Byte

Enable Interrupts


'Init
'=====
For N = 1 To 10
   I2cbyte(n) = 0
Next N

Command = 0
Index = 0

Call Twi_init_slave

'-------------------------------------------------------------------------------
'***| Hauptprogramm |***********************************************************
'-------------------------------------------------------------------------------
Do
     Newbyte = 0

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

     If Twi_control = &H80 Then
        Twi_status = Twsr And &HF8                          ' Status

        'wurde ein Byte geschickt?
        If Twi_status = &H80 Or Twi_status = &H88 Then
            Command = Twdr                                  ' neue Daten merken
            Newbyte = 1                                     ' merken das ein neues Byte da ist
        End If


        'TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
        Twcr = &B11000100                                   ' TWINT löschen, erzeugt ACK
     End If

     'wenn ein neues Byte gekommen ist verarbeiten
     If Newbyte <> 0 Then

       'Register zuordnen -> Befehl
       Select Case Command

               Case 1
               Gosub Motor1

               Case 2
               Gosub Motor2

               Case 3
               Gosub Motor3


       End Select


     End If

Loop
End




'-------------------------------------------------------------------------------
'***| Motor 1 |*****************************************************************
'-------------------------------------------------------------------------------
Motor1:

   Index = 1
   '1 Byte holen / gibt an wieviele bytes geholt werden sollen hier im beispiel max. 10 "i2cbyte(1 bis 10)"
   Gosub I2c_rx

   'PWM1 = i2cbyte(1)

Return


'-------------------------------------------------------------------------------
'***| Motor 2 |*****************************************************************
'-------------------------------------------------------------------------------
Motor2:

   Index = 1                                                '1 Byte holen
   Gosub I2c_rx

   'PWM2 = i2cbyte(1)

Return


'-------------------------------------------------------------------------------
'***| Motor 3 |*****************************************************************
'-------------------------------------------------------------------------------
Motor3:

   Index = 1                                                '1 Byte holen
   Gosub I2c_rx

   'PWM3 = i2cbyte(1)

Return



'-------------------------------------------------------------------------------
'***| I2C-BUS Daten Empfangsroutinen |******************************************
'-------------------------------------------------------------------------------
I2c_rx:

 For N = 1 To Index
 'erstes Byte empfangen
 Newbyte = 0
 Do

    Twi_control = Twcr And &H80

    If Twi_control = &H80 Then
        Twi_status = Twsr And &HF8

        If Twi_status = &H80 Or Twi_status = &H88 Then
            I2cbyte(n) = Twdr
            Newbyte = 2
        End If

        Twcr = &B11000100
    End If

    If Newbyte = 2 Then Exit Do

 Loop

 Next N

Return

'-------------------------------------------------------------------------------
'***| I2C-BUS Daten Senderoutinen |******************************************
'-------------------------------------------------------------------------------
I2c_tx:

For N = 1 To Index
 'erstes Byte empfangen
 Newbyte = 0
 Do

    Twi_control = Twcr And &H80

    If Twi_control = &H80 Then
        Twi_status = Twsr And &HF8

        If Twi_status = &HA8 Or Twi_status = &HB8 Then
            Twdr = I2cbyte(n)
            Newbyte = 2
        End If

        Twcr = &B11000100
    End If

    If Newbyte = 2 Then Exit Do

 Loop

Next N

Return

'-------------------------------------------------------------------------------
'***| TWI: Slavekonfiguration |*************************************************
'-------------------------------------------------------------------------------

Sub Twi_init_slave
    Twsr = 0                                                ' status und Prescaler auf 0
    Twdr = &HFF                                             ' default
    Twar = &H22                                             ' Slaveadresse setzen  I2C-RX-Adr:Hex22
    Twcr = &B01000100                                       ' TWI aktivieren, ACK einschalten
End Sub

achso ich würde die kanten tatsächlich noch abrunden oder irgendwei schützen. das gibt in möbel oder ähnliches ganz hässliche macken wenn das teil da reinfährt.
schöne grüße, Bammel