ui, da hab ich aber tief im Bastelordner suchen müssen ...
naja, war damals fast and dirty zusammengestrickt, aber funktioniert:

Code:

' #######################################
' DAS IST DER CODE !!!!!!

$regfile = "m8def.dat"
$crystal = 16000000

$baud = 250000
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 2 , Databits = 8


Dim Timeout_counter As Byte , X As Byte , Y As Byte , Z As Byte , Fe_error As Byte
Dim Adresse As Byte , Adresse2 As Byte , Pointer As Byte At &H82
Dim Timercounter As Byte , Flag As Byte , Summe_pwm As Word
Dim Pwm_werte(5) As Byte
Dim Rotation_byte As Byte , Rotation_zaehler As Byte

On Urxc Zeichenempfang
Enable Urxc

Const Pwm_teiler = 255 / 46

Config Int0 = Falling
On Int0 Nulldurchgang
Enable Int0

Config Timer0 = Timer , Prescale = 64
On Timer0 Timer_irq
Const Timervorgabe = 220
Enable Timer0

Enable Interrupts
Config Portd.2 = Input
Config Portb = Output
Config Portc = Input
' interne Pullups an
Portc = &HFF

485_rw Alias Portc.6
Config 485_rw = Output
485_rw = 0

Led Alias Portb.0

Adresse = Pinc
Adresse = Not Adresse
Adresse = Adresse And &B00111111

For Z = 1 To 4
   Pwm_werte(z) = 2
Next

Rotation_byte = &B10001000

Do
   If Flag = 1 Then
      Flag = 0
      Y = Pointer
      Shift Y , Right , 2
      If Y = Adresse Then
         Y = Pointer
         Y = Y And &B00000011
         Incr Y
         Summe_pwm = Summe_pwm + X
         Pwm_werte(y) = X / Pwm_teiler
         Pwm_werte(y) = 49 - Pwm_werte(y)
      End If
   End If

   If Summe_pwm = 1020 Then
      If Rotation_zaehler > 30 Then
         Rotation_zaehler = 0
         Rotate Rotation_byte , Right , 1
      End If

      For Y = 1 To 4
          If Rotation_byte.y = 0 Then
             Pwm_werte(y) = 60
          End If
      Next
   End If

    If Timercounter < 48 Then
       If Pwm_werte(1) <= Timercounter Then
         Set Portb.1
       Else
         Reset Portb.1
       End If
       If Pwm_werte(2) <= Timercounter Then
          Set Portb.2
       Else
          Reset Portb.2
       End If
       If Pwm_werte(3) <= Timercounter Then
          Set Portb.3
       Else
          Reset Portb.3
       End If
       If Pwm_werte(4) <= Timercounter Then
         Set Portb.4
       Else
         Reset Portb.4
       End If
    End If
    ' Pause für Zünden
    Waitus 10
    Portb = 0

   If Timeout_counter > 150 Then
     For Z = 1 To 4
         Pwm_werte(z) = 100
     Next
     Summe_pwm = 0
   End If
Loop
End

Zeichenempfang:
   X = Udr
   If Fe_error = 1 And X = 0 Then
        Fe_error = 0
        Pointer = 0
        Summe_pwm = 0
   End If
   If Ucsra.fe = 1 Then
        Fe_error = 1
        Ucsra.fe = 0
   End If
   Incr Pointer
   Flag = 1
   Timeout_counter = 0
Return
End

Nulldurchgang:
   Timercounter = 0
   Incr Timeout_counter
   Incr Rotation_zaehler
Return
End

Timer_irq:
  Timer0 = Timervorgabe
  Incr Timercounter
Return
End
Hab aber auch nur bis zu Adresse 255 genutzt, für 512 brauchst Du halt
ne Word Variable

@guenter1604:
Deinen Code kannst Du aber noch ne ganze Ecke kürzen:

Code:
$regfile = "m88def.dat"
$crystal = 16000000
$baud = 250000

Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 2 , Databits = 8

Dim Buffer(513)as Byte
Dim Dmx_byte As Byte

Dim Kanal As Word

On Urxc Empfang
Enable Urxc
Enable Interrupts

Do
'Hier werden die Ausgänge von Buffer() bestückt
Loop

Empfang:
   If Ucsr0a.fe0 = 1 Then
      Kanal = 1
   Else
       Buffer(kanal) = Udr
       Incr Kanal
   End If
Return