-
DMX512 senden
Hallo,
ein ATMega soll DMX-Signale senden können. Dazu hab ich diese Seite gefunden: http://www.soundlight.de/techtips/dmx512/dmx512.htm
Laut Spezifikation ist ja das Timing sehr wichtig. Wie sorge ich dafür, daß das eingehalten wird? Reicht ein $baud = 250000?
Hat sich schon jemand mit einem DMX512 SENDER in letzter Zeit beschäftigt?
Meine Suche ergab nur sehr alte Beiträge...
-
bin auch gerade am DMX512 ... zunächst scheint mir die Wahl des
Quarzes von wegen Baudrate und Teiler wichtig.
Der Bascom compiler sagt bei 16MHz Fehler von 0,0%
Soweit bin ich bisher gekommen
-
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
-
Hallo,
der Sender läuft an einem SGM Colorlab250 ohne Probleme.
Nachdem ich noch ein paar Änderungen vorgenommen habe bedient der AT-Mega alle 512 Kanäle (also muss das Timing einigermassen stimmen ;-)).
Das Programm und ein Plan werden in ein paar Tagen unter
www.gerold-online.de/cms zu finden sein.
-
warum kompliziert, wenns auch einfach geht ...
Mein RGY-Laser reagiert auf folgendes Progrämmchen
einwandfrei:
Code:
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 30 ' default use 32 for the hardware stack
$swstack = 50 ' default use 10 for the SW stack
$framesize = 50
$baud = 250000
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 2 , Databits = 8
Dim A_byte(16) As Byte
Led Alias Portd.7
Config Led = Output
Uart_tx Alias Portd.1
Config Uart_tx = Output
485_rw Alias Portd.4
Config 485_rw = Output
485_rw = 1
A_byte(1) = 50
A_byte(2) = 130
A_byte(3) = 250
A_byte(4) = 63
A_byte(5) = 63
A_byte(6) = 0
A_byte(7) = 0
A_byte(8) = 255
A_byte(9) = 10
A_byte(10) = 255
A_byte(11) = 128
A_byte(12) = 120
Do
Ucsrb = Ucsrb And &B11100111 ' UART deaktivieren
Reset Uart_tx ' break setzen
Waitus 95
Set Uart_tx
Ucsrb = Ucsrb Or &B00011000 ' UART reaktivieren
Waitus 22
Printbin A_byte(1) ; 16 ' Daten senden
Toggle Led
Waitms 100
Loop
-
Hallo Vitis,
so hab ich erst auch angesetzt, kam aber beim ansteuern von z.B. Kanal 500 nicht mehr hin...
-
bascom erlaubt auch keine array > 255 Elemente ;)
Die Baudrate stimmt aber, hab ich mit dem Oszi nachgemessen.
Framelänge 44µs wenn ichs noch recht im Kopf hab.
Eine Möglichkeit, warum es nicht mehr synchron ging
währe, dass die Frames zu schnell aufeinander kamen.
Da währe dann noch die Möglichkeit über for-next den
Printbin hochzählen lassen und nen Waitstate einzubauen
sprich:
for variable=1 to 255
printbin arraywert(variable);1
waitus 10
next
oder so.
-
Hallo Vitis,
Dim Puffer(513) As Byte
hat Bascom klaglos akzeptiert und es funktioniert auch. :-s
-
huch, da ist mir was bei Update durchgerutscht ... war aber
mal so mit der Arraygröße ... naja, was solls, um so besser :)
Es haben sich bei mir dann doch Probleme ergeben, wodurch
der Code nochmal geändert werden musste.
Die Datenübertragung war zu schnell für mein Gerät !
Echt der Hammer, ich musste auf die For-Next Variante ändern
und n Wartezyklus zwischen den Frames von 44µs, also
nen ganzen Frame (!) einbauen damit mein Laser alles mitbekommen
hat. Der Hammer ... wozu 250 kBaud wenn man dann doch nur
125 davon nutzt ?
In der Spec ist das ja drinne, keine Frage, aber ist das so
DMX512 Standard?
Der Fehler trat bei dem Code ab dem 4. Frame auf, dann hat er einen
verloren, dann wieder beim 9. Hab dann nach und nach den Wartezyklus
vergrößert, bis 100% Datenempfang waren und das war dann bei
44 µs ... hammer 8-[
-
Hallo Vitis,
nach Spezifikation braucht man die Marker zwischen den Frames garnicht. Man kann nach den 2 Stoppbits gleich mit dem nächsten Startbit beginnen. Das hab ich mal so realisiert und es läuft mit dem SGM Colorlab 200 auf allen 512 Kanälen. Die min. Gesamtübertragungsdauer des DMX512-Signals von 22668 us hab ich jetzt genau erreicht.
http://www.gerold-online.de/cms/index.php?id=144
hast du das Signal mal mit dem Oszi nachgemessen?