-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: DMX512 senden

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329

    DMX512 senden

    Anzeige

    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...

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    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

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    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

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    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.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    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

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    Hallo Vitis,

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

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    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

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    Hallo Vitis,

    Dim Puffer(513) As Byte

    hat Bascom klaglos akzeptiert und es funktioniert auch.

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    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

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    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?

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •