Hallo William,

ich habe mal kurz eines meiner Programme zurechtgestutzt:

Code:
$regfile = "m8def.dat"
$crystal = 8000000
$lib "i2c_twi.lbx"

$hwstack = 256
$swstack = 256
$framesize = 64


'Subs deklarieren
Declare Sub Twi_init_slave
Enable Interrupts

'Ports setzen
Ddrb = &B0000111
Portb = &B11111000
Ddrd = &B11101111
Portd = &B00010000

'SDA und SCL definieren
Config Sda = Portc.4
Config Scl = Portc.5
I2cinit

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
'PWM1a auf Pinb.1; PWM1b auf Pinb.2
Config Timer2 = Pwm , Compare Pwm = Clear Up
'PWM2 auf Pinb.3

Waitms 100

Call Twi_init_slave                                         ' TWI aktivieren

Dim I As Byte
Dim J As Byte

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
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 = Maxanzahlbyte Then
                    Neuemsg = 1                             ' Flag für Message gültig
                Else
                    Neuemsg = 0                             ' Flag für Message ungültig
                End If
            ' was anderes empfangen
            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)
        'Erster Wert
               Case 1:
                  Pwm1a = Messagebuf(2)
               Case 2:
                  Pwm1b = Messagebuf(2)
               Case 3:
                  Compare2 = Messagebuf(2)
               Case Else:
        End Select
    'Waitms 250
    End If
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
Ich habe es nicht getestet, aber wenn man 2 Bytes nacheinander schickt (erstes 1, 2 oder 3) sollte der zweite Wert auf den entsprechenen PWM-Kanal ausgegeben werden.
Das Grundprogramm stammt übrigens aus dem RN-Wissen Artikelbereich.