- Labornetzteil AliExpress         
Ergebnis 1 bis 4 von 4

Thema: DMX senden.

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    31.12.2009
    Ort
    Ahrensburg
    Alter
    31
    Beiträge
    24

    DMX senden.

    Anzeige

    Praxistest und DIY Projekte
    Guten Abend zusammen,
    Ich weiß, dass dieses Thema mit Sicherheit schon mindestens 200.000 mal besprochen wurde, aber die Forensuche bringt mir nie wirklich das, was ich brauche, oder zu viel, um es mal durchzuschauen
    Deshalb ein 200.001. mal:
    Ich möchte DMX-512 Signale senden. Einige Recherchen ergaben bereits, dass das durch den UART des AVR-Controllers von Haus aus ganz gut möglich sein sollen. Ich bin nun allerdings weitestgehend absoluter neuling in diesen Sachen, was mir das ganze wahrscheinlich unnötig erschwert. Ich finde leider auch nie irgendwelche Code-Beispiele (im Suchen selbiger bin ich auch 'ne Niete ). Mir geht es erst einmal um die Theorie, das dann in der Praxis aufzubauen, ätzen etc. kommt deutlich später, nicht nur aus Gründen finanzieller Naturen.
    Nun die Frage: Habt ihr bereits Erfahrungen mit dem Senden von DMX-Signalen, und könnt mir vielleicht ausschnittsweise Codebeispiele für dieses geben? Z.B. auch zum Senden des "Breaks", was ja eigentlich ein Fehler in der Seriellen übertragung angibt, und demzufolge scheinbar nicht so super zu senden möglich ist.

    mit vielem Dank im Vorraus,

    Merlin

    PS.: Zu erwähnen sei vielleicht: Ich Programmiere ausschließlich C, habe dort auch einige Erfahrung. Bascom müsste ich lesen können, habs aber bisher nicht probiert.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.188
    Ich hab das so gelöst:
    Code:
    // Daten senden
    void send_data (void)
    {
    // Resetimpuls Start
          if(tx_counter==0&&(UCSRA & DATA_REGISTER_EMPTY)>0)
            {
            UCSRB&=0b11110111;                 /* Sender ausschalten */
            PORTD.1=0;
            delay_us(90);
            PORTD.1=1;
            UCSRB|=0b00001000;
            putchar(0);
            if(uc_sendmode==0)
                {
                putchar(uc_red);
                putchar(uc_green);
                putchar(uc_blue);
                putchar(uc_dmxsendvalue[3]);
                putchar(uc_dmxsendvalue[4]);
                putchar(uc_dmxsendvalue[5]);
                putchar(uc_dmxsendvalue[6]);
                };
            if(uc_sendmode==1)
                {
                putchar(uc_dmxsendvalue[0]);
                putchar(uc_red);
                putchar(uc_green);
                putchar(uc_blue);
                putchar(uc_dmxsendvalue[4]);
                putchar(uc_dmxsendvalue[5]);
                putchar(uc_dmxsendvalue[6]);
                };
                    
            };
    }
    Der USART wir dabei abgeschaltet und ein festes Potetial auf des Port des USART für mehr als 88µs gegeben.
    Danach wird der USART wieder aktiviert und die Werte gesendet.

    Der Rest der Sendung läuft dann bei mir über eine fertige .lib ab, die den TxD Interrupt nutzt.
    Man könnte auch eine normale Senderoutine verwenden, aber das hat mir nicht gefallen.

    Eine andere Möglichkeit der BREAK Erzeugung wäre die Übertragungsgeschwindigkeit des USART auf einen niedrigen Wert ( z.B. 2400 Baud ) einzustellen und das Byte 0x00 zu senden.
    Auch das würde ein Break Signal bewirken.
    Vor dem Senden der DMX Kanaldaten muss natürlich der USART wieder auf 250kBaud hochgestellt werden.

    Beides wird praktiziert und funktioniert.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    31.12.2009
    Ort
    Ahrensburg
    Alter
    31
    Beiträge
    24
    Hey,
    Vielen Dank schon einmal dafür! Das hilft mir!

    Zitat Zitat von wkrug
    Der Rest der Sendung läuft dann bei mir über eine fertige .lib ab, die den TxD Interrupt nutzt.
    Was sendest du denn noch?! Ich sehe da nichts, was noch gesendet werden müsste, oder?

    Merlin

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.188
    Die putchar(x) füllt ja nur einen Puffer.
    Die Routine arbeitet dann diesen Puffer ab und sendet Ihn über die serielle Schnittstelle.
    Das hab ich mit der .lib gemeint.

    Im Prinzip ist sowas bei jedem Compiler ohnehin enthalten.

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad