PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DMX512 senden



guenter1604
13.06.2008, 20:50
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...

Vitis
15.06.2008, 16:55
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

guenter1604
15.06.2008, 22:52
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.



$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

guenter1604
17.06.2008, 17:26
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.

Vitis
18.06.2008, 03:00
warum kompliziert, wenns auch einfach geht ...
Mein RGY-Laser reagiert auf folgendes Progrämmchen
einwandfrei:



$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

guenter1604
18.06.2008, 08:05
Hallo Vitis,

so hab ich erst auch angesetzt, kam aber beim ansteuern von z.B. Kanal 500 nicht mehr hin...

Vitis
18.06.2008, 12:09
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.

guenter1604
18.06.2008, 12:25
Hallo Vitis,

Dim Puffer(513) As Byte

hat Bascom klaglos akzeptiert und es funktioniert auch. :-s

Vitis
19.06.2008, 08:49
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-[

guenter1604
19.06.2008, 09:59
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?

Vitis
19.06.2008, 12:39
ja hab ich,

Vorgehen:
Byte an UDR, dann warten auf TXC-Flag und dann nochmal 44µs
seltsamerweise ... ist halt n Chinateil :-k

guenter1604
19.06.2008, 12:55
Hallo Vitis,

kommt mit meinem Code der gleiche Fehler ?

dann bleibt ja nur noch der Chinalaser übrig ;-)

guenter1604
19.06.2008, 14:02
Achja,

wie ist das mit dem Startbit ?

Vitis
19.06.2008, 19:17
Mit dem folgenden Code
dreht sich n nettes Herzchen beim Nachbarn
an der Hauswand :)



$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(18) As Byte
Dim Countbyte1 As Byte
Dim Flag(9) 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) = 199
A_byte(2) = 128
A_byte(3) = 61
A_byte(4) = 1
A_byte(5) = 1
A_byte(6) = 1
A_byte(7) = 1
A_byte(8) = 1
A_byte(9) = 0
A_byte(10) = 0
A_byte(11) = 0
A_byte(12) = 250
A_byte(13) = 0
A_byte(14) = 0
A_byte(15) = 0
A_byte(16) = 0
A_byte(3) = A_byte(3) * 2

Do
If A_byte(3) > 252 Then A_byte(3) = 0
Ucsrb = Ucsrb And &B11100111
Reset Uart_tx
Waitus 95
Set Uart_tx
Ucsrb = Ucsrb Or &B00011000
Waitus 44
For Countbyte1 = 1 To 16
Udr = A_byte(countbyte1)
Do
Loop Until Ucsra.txc = 1
Reset Ucsra.txc
Waitus 44
Next
Waitms 100
Toggle Led
If Flag(8) = 0 Then ' rotation
A_byte(8) = A_byte(8) + 1
Else
A_byte(8) = 0
Flag(8) = 0
End If
If Flag(6) = 0 Then
A_byte(6) = A_byte(6) + 3
Else
A_byte(6) = A_byte(6) - 3
End If
If Flag(7) = 0 Then
A_byte(7) = A_byte(7) + 2
Else
A_byte(7) = A_byte(7) - 2
End If
For Countbyte1 = 6 To 12
If A_byte(countbyte1) > 127 Then Flag(countbyte1) = 1
If A_byte(countbyte1) < 5 Then Flag(countbyte1) = 0
Next
Loop

Vitis
20.06.2008, 19:10
Startbit? wie meinst Du das? die UART macht doch von sich aus
n Startbit oder meinst Du das 0-Byte am Anfang, das für die
"Dimmer" ?
Das mag der Chinalaser in meiner momentanen Konfiguration
nicht, da ich den auf DMX #1 laufen habe ... kann man aber
auch auf anderen Kanal jumpern wenn erforderlich.

Das ist n Farbwechsler, den Du betreibst, stimmts?

guenter1604
21.06.2008, 23:23
Hallo Vitis,

ja,das Ding kann Farbe wechseln, Gobos einblenden, Strobbo und Dimmen.

Sorry, natürlich Startbyte also das erste Kanal nach dem Reset. Der soll ja 0 sein. Testweise hab ich da mal einen Wert > 0 eingetragen. Lief aber trotzdem.

Vitis
23.06.2008, 22:56
ich hab meinen Laser auf #1 eingestellt und der nimmt direkt
das erste Byte als Datenbyte ... wird wohl auch wieder der
Chinese zuschlagen :)

mafa
30.06.2008, 18:34
Hi

ich will in nächster zeit auch mit einem AVR DMX-Daten versenden, ich möchte zunächst einmal ein wenig rumprobiernen- und programieren, allerdings fehlt mir dazu bisher noch eine einfache Schaltung, um das DMX-Protokoll zu versenden, er wäre nett, wenn jemand eine Schaltung posten könnte, die simpel ist und auch zu den hier geposteten codes einigermaßen kompatibel ist

mfg

mafa

Vitis
30.06.2008, 18:59
Schaltung? ... ist nicht viel ... n MAX485 oder LTC485
oder n sonstigen RS485-Busbaustein, TX vom Controller und
fertig ist die Laube ... ach so, n Abschlusswiderstand noch zwischen
die A-B-Leitungen und n Stützkondensator dazu ...

mafa
30.06.2008, 19:23
Hi

vielen Dank

wenn ich das richtig verstanden habe, dann ist das so ähnlich wie beim max232, der stützkondensator kommt soweit ich weiß direkt an V+ und GND, der Abschluss Widerstand wird ja am ende der DMX-Kette eingebaut, ist aber in manchen dimmern schon eingebaut

Vitis
30.06.2008, 21:47
Richtig, der Abschluss muss terminiert sein ... das hab ich mir nicht ausgedacht, sondern geben die Bausteine vor.
IC hfür meinen Teil halte mir gerne die Optionen offen,
hab bei Bussen schon einiges erlebt (Reflexionen z.B.)
wo ich dann hinterher irgendwie nen Abschluss ranzimmern
musste, damit die Kiste lief. Daher designe ich die heute
immer mit ein und lass sie zunächst weg.
Wirds dann doch nötig hab ich schön die Pads frei um flott
die Terminierung reinzubrutzeln ;)

Die Stützkondensatoren so nah als möglich an den
485er ran. 250kBaud sind ne ganze Menge und
manche Kommunikation kam nciht zustande weil
die Flanken verliefen durch Kabel-Kapazitäten
und fehlende Stützung. Auch da, mein Leitspruch,
lieber die OPtion offen halten eindesignen und unbestückt
lassen als hinterher flickschustern zu müssen :)