-
-
Erfahrener Benutzer
Begeisterter Techniker
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
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen