Forum: Mikrocontroller und Digitale Elektronik DMX mit AVR empfangen - wer hats schon gemacht?


von Sven Müller (Gast)


Lesenswert?

Hallo, bitte verweist mich nicht auf Google oder die Forensuche, die
habe ich schon bemüht..
Ich möchte gerne mit nem AVR (momentan Mega16) DMX empfangen.

Programmiersprache:C (Codevision)

Hardware: STK 500, SN 75176

Sagt mir mal ob ich auf dem richtigen Weg bin:

-Uart auf 250kbaud eingestellt (UBRRL = (CPU_Takt  16  baud) - 1;)
-1 Start Bit, 8 Daten Bit, 2 Stop Bit (UCSRC = (1<<7) | (1<<3) | (1<<1)
| (1<<0);)
-RX Interrupt an, Receiver an (UCSRB = (1<<7) | (1<<4);)
-Globale Interrupt an (#asm("sei");)

Soweit die initialisierung.

Dann muss ich ja auf nen Break warten, (Frame Error)
wie mache ich das am besten? in meiner Interruptroutine (wenn FE
gesetzt, dann channel =0, da ja das nächste Byte ohne Frame error Kanal
0 (Start) is? oder besser in meinem Hauptprogramm while (FE gesetzt)
channel =0;?

Das erste Wort lese ich doch einfach mit value = UDR ein, oder? und
zähle meinen channel hoch, bis zum nächsten FE, da setze ich channel
wieder auf 0..

Wo ist der Fehler??

Danke, sven

von mmerten (Gast)


Lesenswert?

Das 1. Byte eines DMX-Frame ist der Startcode (im Regelfall 0 für
Dimmerdaten) ab dem 2. Byte folgen die eigentlichen Daten max. 512 Byte

von Sven Müller (Gast)


Lesenswert?

genau, das habe ich verstanden. eventuell könnte man das erste Byte als
Verpolungstest nutzen?

Aber ist der Rest ok. Ich wäre froh wenn ich das 1. Byte richtig
empfanken könnte..

von leo9 (Gast)


Lesenswert?

genaugenommen muß das Byte nach dem Frameerror Null sein, sonst sind die
nachfolgenden Daten keine Kanaldaten. Andere Werte kennzeichnen z.B.
Dimmerkurfen oder irgendwelche Konfigurationsdaten, das ist aber von
Hersteller zu Hersteller unterschiedlich implementiert. Schau mal bei
www.soundlight.de vorbei, dort gibts auch die DMX-Spezifikationen.

grüsse leo9

von Sven Müller (Gast)


Lesenswert?

ja. soundlight kenne ich ebenfalls.

Aber den Uart vielleicht nicht genau genug. jedenfalls funktioniert
mein Code nicht.

mir würde es ja schon reichen den Break zu detektieren. Wo prüfe ich am
besten auf einen Frame Error?

In der Interruptroutine (wird einer während MARK / Reset ausgelöst?
oder polle ich das FE bit im Hauptprogramm und gebe wenn gesetzt den
IRQ frei??

von Stefan Kleinwort (Gast)


Lesenswert?

Ich würde alles in der IR-Routine machen, inkl. FE-Erkennung.

Wenn FE, dann Kanal-Nr NULL setzen.

Wenn Kanal-Nr = NULL, dann muss empfangenes Byte auch NULL sein,
ansonsten sind die Daten ungültig -> verwerfen bis zum nächsten FE.

Wenn Kanal-Nr >= Empfangs-Kanal, dann Empfangsdaten in einem
Empfangs-Array speichern. Auf diese Daten kann dann das HP zugreifen.

Sinnvoll ist es, bei gültigen Daten eine LED und dazu einen Timer zu
setzen. Die LED zeigt den DMX-Empfang an, wenn der Timer abgelaufen ist
oder ungültige Daten empfangen werden, wird die LED wieder gelöscht.
Sehr hilfreich bereits während der Entwicklung und auch später beim
Betrieb!

Stefan

von Sven Müller (Gast)


Lesenswert?

Danke Stefan, das hilft mir weiter.
hast du sowas schonmal umgesetzt? oder jemand anders, der mir zumindest
mal seine UART initialisierung zeigt..

von Stefan Kleinwort (Gast)


Lesenswert?

Ja, vor ein paar Jährchen ... allerdings auf einem 80517 (8031-Clon), in
Assembler. Wird Dir als AVR-C-Programmer garantiert nicht weiterhelfen,
aber wenn Du willst kannst Du das Assemblerzeugs mal haben.

Stefan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.