Hallo Vitis, hallo Gento,

jetzt hab ich mal nachgerechnet:

ein Frame des DMX-Signals dauert kürzestenfalls 44µs.
Das bedeutet, mein Interrupt darf maximal 44µs dauern denn dann könnte das nächste Byte anstehen. Bei 16MHz dauert:

$asm
.def Uart_status = R16
.def Temp_var = R17

IN Uart_status,USR
SBRC Uart_status,FE0
RJMP Asm_reset
RJMP Asm_kanal

Asm_reset:
ldi temp_var, $00
sts {Kanal}, temp_var
RJMP Asm_exit

Asm_kanal:
$end Asm
Buffer(kanal) = Udr
Incr Kanal
$asm
Asm_exit:

$end Asm

fast genau so lange wie:

If Ucsr0a.fe0 = 1 Then
Kanal = 0
Elseif Kanal > 0 Then
Buffer(kanal) = Udr
Incr Kanal
End If

nämlich ca. 10,875µs. Darum verbleiben 33µs pro Frame für weiteres.

Gespeichert werden alle Werte aller Kanäle in einem riesigen Array ob sie gebraucht werden oder nicht. Das hält den Interrupt kurz und Platz ist ja genug.
Der Rest kommt jetzt in die Mainloop

Günter