DMX-Receiver

Gast #75232
Lesenswert?

Hallo, allerseits!

Hat schon mal jemand versucht, mit dem AVR ein DMX-Signal zu dekodieren
und den Quelltext in C geschrieben? Ich habe zwar einen eigenen
Quelltext entwickelt, habe aber zur Zeit keinen DMX-Sender zur
Verfügung und kann mein Programm nicht austesten.

Vielen Dank im Voraus für Eure Antworten!

KMT
Gast #75234
Lesenswert?

Schon mal getan, aber entweder waren es Quelltexte in Assembler oder
Quelltexte für einen DMX-Sender. Ich bräuchte aber zum Anpassen einen
Quelltext in C für einen DMX-Empfänger. Notfalls ließe sich das
sicherlich auch in Assembler programmieren, aber ich bin halt
C-verwöhnt...

Viele Grüße

KMT
Gast #75235
Lesenswert?

Also einen Code für den AVR kann ich Dir leider nicht geben. Ich habe
mal einen für den 8051 geschrieben, ist aber schon ne Weile her und das
war auch in Assembler.

Mit dem normalen UART kannst Du Dir aber leicht einen DMX-Empfänger
bauen. Den Brake kannst Du erkennen, indem Du "Framing Error"
auswertest. Wenn das empfangene Byte 00h war, dann wars der Brake. Dann
nur noch auf das Start warten, dann die eingehenden Bytes zählen und ab
Deiner DMX-Adresse n Bytes in eine Tabelle schaufeln.

Stefan
Gast #75238
Lesenswert?

#pragma vector = 0x48
__interrupt void USART0_RXD_isr(void)
{

  if (UCSR0A & (1<<DOR0))               //Overrun
   {
      dmx_empfangs_zeiger = 515;            //Fehler-Flag setzen
   }
   if (dmx_empfangs_zeiger > 512)          //Zeiger auf DMX-Feld zu groß
   {
      dmx_empfangs_zeiger = 515;            //Fehler-Flag setzen
   }
  if (UCSR0A & (1<<FE0))                 //FE-Bit
   {
     if (UDR0 == 0)                    //Datenregister leer?,wenn ja ist 
es ein
Break
     {
       dmx_empfangs_zeiger = 0;          //DMX-Zeiger setzen
     }
     else
     {
       dmx_empfangs_zeiger = 515;          //Bei Fehler Zeiger auf 
Nirvana
setzen
     }
   }
   else
   {
    dmx_werte[dmx_empfangs_zeiger++] = UDR0;

  }
  fehler = UDR0;

}
IAR Systems
ATM 64
dmx_empfangs_zeiger ist kein richtiger Zeiger, sondern nur ein unsigned
int als Arrayzähler.
fehler ist ein unsigned char, weil, um das Interruptflag zu löschen
immer UDR ausgelesen werden muss.
Die Werte werden in ein 516 Byte großese Array geschrieben.

Bei Unklarheiten bitte meldden.

MW
Gast #996662
Lesenswert?

Hallo Stefan
kannst du mir mal den Quelltest für den 8051 schicken für den empfang 
von DMX daten das würde mir echt sehr helfen.

Ich kann auch mit Asembler was anfangen ich muß ein Projetzt mit dem LPC 
900 machen.

Danke Gruß Alex
#1004850
Lesenswert?

Habe mal den alten Kram rausgesucht.
Das Ding ist ca. 20 Jahre alt, genau Bescheid weiss ich über die 
Einzelheiten nicht mehr, habe auch keine Ahnung, wie damals der 
Assembler hiess.

Der Code, der für Dich interessant ist, steht unter "SIO-Handler".

Wenn ich mich richtig erinnere, lief das Teil mit 8Mhz auf einem 80517.

Um bei dem Takt noch schnell genug zu sein, sind ein paar Register 
exklusiv für den SIO-Interrupt reserviert, also Vorsicht, die darfst Du 
nirgends anders verweden!

Gruß, Stefan
Angehängte Dateien:
Gast #3346127
Lesenswert?

Ich weis der Beitrag ist schon ein paar Jahre alt allerdings habe ich 
ihn gerade entdeckt und es würde mich brennend interessieren woher du 
solche Linsen für die LEDs bekommen hast?? hab nämlich genau das selbe 
geplant :D

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren