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
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
Vor den Erfolg haben die Götter den Schweiß gesetzt
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
Vor den Erfolg haben die Götter den Schweiß gesetzt
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.
Vor den Erfolg haben die Götter den Schweiß gesetzt
Hallo Vitis,
Dim Puffer(513) As Byte
hat Bascom klaglos akzeptiert und es funktioniert auch.
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
Vor den Erfolg haben die Götter den Schweiß gesetzt
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?
Lesezeichen