Puh, das war ein mächtiges Stück Arbeit, aber jetzt sollte das Timing passen. Mit einem AT-Mega8 und 8Mhz Quarz. Ausgang ist der Pin 13, an Pin 23 kann mit 0-5Volt der Kanal 1 gedimmt werden.
DA ich gerade kein DMX512 Gerät habe wärs nett, wenn das jemand testet.
Code:
$regfile = "m8def.dat"
$crystal = 8000000
Ddrc = &B00000000
Ddrd = &B11111111
Admux = &B01100000
Adcsra = &B11100110
Dim Temp As Word
Dim Kanal As Byte
Dim Puffer(65) As Word
Dmxout Alias Portd.7
Declare Sub Dmx()
Enable Interrupts
Do
Puffer(1) = Adch
Call Dmx
Loop
Sub Dmx()
Dmxout = 0 'Reset
Waitus 88
Dmxout = 1
$asm
.def Tmp1 = R17 'Marker
.def Tmp2 = R18
ldi Tmp1, $15
Make_loop1:
dec Tmp1
brne Make_loop1
nop
$end Asm
For Kanal = 0 To 32 '8 'Anzahl der Kanäle
Temp = Puffer(kanal) '20
$asm
.def Temp1 = R17
.def Temp2 = R18
.def Txbyte = R19
Putchar:
LDS Txbyte, {Temp} '2
LDI Temp1 , 9 '1
COM Txbyte '1
SEC '1
Putchar0:
BRCC Putchar1 '1 oder 2
nop '1
CBI Portd,Pd7 '2
RJMP putchar2 '2
Putchar1:
SBI Portd,Pd7 '2
NOP '1
nop '1
Putchar2:
LDI Temp2 , $7 '1
Sd_loop0:
DEC Temp2 '1
BRNE Sd_loop0
'''''''''''''''''
nop
LSR Txbyte '1
DEC Temp1 '1
BRNE putchar0 '1 oder 2
$end Asm
nop
nop
nop
Dmxout = 1 '2
$asm
.def Tmp1 = R17
.def Tmp2 = R18
ldi Tmp1, $1b
Make_loop0:
dec Tmp1
brne Make_loop0
$end Asm '2Stoppbits und der Marker = 16µs
Next Kanal '10
End Sub
Lesezeichen