Forum: Mikrocontroller und Digitale Elektronik Probleme bei DMX512-Signalerzeugung


von Julius Krebs (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe mir vor ein paar Tagen ein eigentlich einfaches Ziel gesetzt:
Die Ansteuerung eines Dimmerpacks mittels eines atmega16. Zuerst habe
ich versucht dies mit einem Timerinterrupt zu realisieren. Doch ich
musste schnell feststellen, dass der µc dabei schnell an seine Grenzen
stößt. Aus diesem Grund habe ich mich auf die
"Endlosschleifenmethode" "herabgelassen". Dabei werden die
vorgegebenen Zeiten problemlos eingehalten. Doch das Dimmerpack
reagiert nicht auf die Daten, im besten Fall wird angezeigt, dass
Signale empfangen werden.
Es wäre nett, wenn sich ein DMX512 Kundiger den passenden Code ankucken
würde.

In solch einem Fall wäre es sicher einfacher direkt die Ausgangssignale
mittels eines einfachen Logiganalyser im Forum zu posten. Ist jemandem
dazu eine Lösung für weniger als 100EUR bekannt?

von Stefan Kleinwort (Gast)


Lesenswert?

Gibt es einen Grund, warum Du den UART des mega16 nicht benutzt?
Hast Du ein Oszi, um die Signale mal anzuschauen?

Stefan

von Julius Krebs (Gast)


Lesenswert?

Nein ein Oszi habe ich nicht. Deshalb haben ich ja auch den
Logicanalyser angesprochen. Man müsste solch ein Gerät doch mit
einfachen Mitteln bauen können. Als Anzeigeelemetn könnte ja mein PC
fungieren.

Beim UART besteht das Problem, dass zwischen den einzelnen
Datenpacketen das Ausgangssignal stets auf High liegt.

von Stefan Kleinwort (Gast)


Lesenswert?

Ich habe dsa Bitscope (www.bitscope.com). Ist zwar etwas über Deiner
Preisvorstellung, aber ide verkaufen auch Leerplatinen bzw. Bausätze.
Wenn Du nur einen Logikanalyzer willst, kannst Du ja erstmal den
AD-Wandler weglassen und später nachrüsten.
Es gibt auch eine Lowest-Cost-Lösung für die Centronics, schau mal bei
den Links, weiss aber nicht, ob die die 250khz schafft.

Der UART ist sogar optimal dafür geeignet! Habe ich auch schon gemacht,
allerdings nicht mit dem AVR. Das einzige, was Probleme macht, ist das
Break (oder auch Reset)-Signal. Dazu entweder den UART-TXD auf normalen
Port schalten und das Break ausgeben oder auf 125kbit Baudrate
umschalten und eine 0hex ausgeben. Bei letzterer Lösung wird auch
gleich automatisch das Mark-after-Break erzeugt. Aber Vorsicht:
wirklich sichergehen, dass alle Daten den Transmitter komplett
verlassen haben, bevor die Baudrate geschaltet wird!

Bei der Verwendung des UART (mit Interrupt) hast Du auch noch etwas
Zeit, um was anderes als nur die Ausgabe zu machen ...

Was ich in Deinem Code vermisse, ist der Startcode.  Normalerweise wird
ein Null-Byte dafür verwendet.

Stefan

von Sven Müller (Gast)


Lesenswert?

Interessante Sache. Habe sowas vor auchmal zu bauen, aber momentan keine
Zeit.
Bist du sicher das deine Hardware richtig ist? Polarität des DMX
Signals?
Ich würde dafür auch den Uart nutzen..spart viele Probleme.

Mal ne OT Frage: hat einer schonmal nen DMX->PMX Umsetzer gebaut? DMX
empfang ist kein PRoblem, das bekomme ich gut mit dem Uart hin. PMX
senden ist auch nciht schwer. Ist RS232 mit 9600 Baud. Wenn ich den
Uart zum empfangen nutze, muss ich ja entweder die Parameter ändern und
schnell im Reset senden oder meint ihr das geht mit nem Softuart
zwischen den Empfangsinterrupt?

sorry für diese OT Frage.

Sven

von Julius Krebs (Gast)


Lesenswert?

Das Gerät auf www.bitscope.com liegt leider auch ohne AD-WAndler
deutlich über meinem finanziellen Möglichkeiten.
Ich habe unter "Links" foglende Seite gefunden:
http://www.qsl.net/dg5dbz/pcla/pcla.html Sieht ganz gut aus, ist aber
leider recht umfangreich.

Wenn das Umschalten des UARTs auf einen normalen Port problemlos
funktioniert, werde ich das Ganze wohl damit realisieren. Durchgehend
Nullbytes asuzugeben wird wohl nicht gehen, da das Stopbit
dazwischenfunken würde.
Aber es muss doch auch mit dem jetzigen Code funktionieren. Das
Null-Byte ist übrigens in dem Datenarray bereits enhalten.

von leo9 (Gast)


Lesenswert?

so OT ist die Frage nicht, PMX ist das Protokel von Pulsar? wie werden
dort die Daten übertragen? könntest du vielleicht die Specs posten.
Wenn du AVR einsetzt könnte ich dir bei der Programmierung helfen.
(SW-Uart ist übrigends für diese Anwendung überhaupt kein Problem).
Ein Problem sehe ich eher darin was mit Daten passieren soll die
"zuviel" reinkommen, DMX kommt ja (fast) permanent und den
Informationsgehalt bekommt man dann nicht 1:1 auf 9600 raus.

grüsse leo9

von Julius Krebs (Gast)


Lesenswert?

Die Hardware müsste OK sein, da ich bereits alle typischen Fehlerquellen
durchgegangen bin.

von Stefan Kleinwort (Gast)


Lesenswert?

>Wenn das Umschalten des UARTs auf einen normalen Port problemlos
>funktioniert, werde ich das Ganze wohl damit realisieren. Durchgehend
>Nullbytes asuzugeben wird wohl nicht gehen, da das Stopbit

Es reicht EIN Null-Byte mit langsamerer Baudrate.
Was an Deinem Code nicht tut, kann ich ansonsten nicht entdecken. Bist
Du sicher, dass Deine Quarz-Frequenz stimmt?

Kleine Idee zum lowest-Cost-debuggen: Bau Dein wait_zeit so um, dass
(Soll-Zeit mal 250.000) gewartet wird. Dann hänge an den Ausgang eine
LED und schau Dir Dein Signal an. 1Bit = 1Sekunde.

@Sven:
Das funktioniert. Den Break kann man auf der Empfänger-Seite als
Framing-Error detektieren. Hier wurde auch schon öfters drüber geredet.
9600 senden geht problemlos per Software-UART.

Stefan

von Sven Müller (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, die PMX Specs sind im Anhang. Original von Pulsar.

Ich will zwei GS1 die nur PMX oder analog verstehen zu DMX fähigen
geräten umbauen.
Darum muss ich nicht alle Kanäle senden, sondern nur sechs und diese an
eine feste Adresse.
Zum DMX empfangen nutze ich momentan einen Mega16 / Mega8. das klappt
auch problemlos. Meine Frage ist eher wamm und womit ich am besten das
PMX Signal ausgebe.

Die Hardware ist ja sehr simpel, Atmel, max232, dip-schalter. fertig.

von Christof Rieger (Gast)


Lesenswert?

Hallo Sven,
Verkoppel doch über I/O Pins einen Mega8 mit einem 90S2313
der Mega8 macht den DMX Part und der 2313 den PMX Part. vorallem kannst
du die Quarze genau bestimmen und der 2313 kostet nur 2,15 €

von leo9 (Gast)


Lesenswert?

@Sven:

den 2313 kannst du getrost einsparen, die 9600 erledigt der Mega8
nebenbei (wenn er wirklich nur DMX auf PMX übersetzen muß).
512/250000*9600 =~ 16, also sind die 6 Kanäle auch kein Thema, ich werd
mich morgen mal mit der SW-Uart und einem Timingkonzept beschäftigen. In
welcher Sprache/Compiler arbeitest du?

grüsse leo9

von Sven Müller (Gast)


Lesenswert?

Über die Lösung mit einem zweiten µC kam ich auch schon, fand die aber
auch etwas "unprofessionell"

Ich programmiere in C mit Codevision.
Es darf aber kein Interrupt erfolgen während ich ein Zeichen per
Softuart verschicke, oder?
Um ein zeichen zu verschicken brauche ich aber doch mindestens
833µs..wie passt das? oder habe ich einen denkfehler?

von Stefan Kleinwort (Gast)


Lesenswert?

Du musst den Softuart mit Timer-Interrupts aufbauen, dann ist das kein
Problem. Also Startbit ausgeben, nächsten Timer-IR in 104us, dann der
Reihe nach die Datenbits und das Stopbit.

Stefan

von leo9 (Gast)


Lesenswert?

Hallo Sven:
ich plauder jetzt zwar aus dem Bauch raus, aber der einzige Interrupt
den wir brauchen ist der Timer für die SW-Uart, den HW-Uart zum
empfangen poll ich nebenbei. Codevision ist gut, den verwende ich auch
recht gerne. Wenn ich morgen dazu komme gibts ein fertiges Konzept.
Eine "Bedingung" habe ich aber: ich bin gerade am Aufbau einer
Web-Page über diverse Technikbereiche, unter anderem DMX (im Eigenbau)
für den Partykeller. Der DMX-PMX Converter wird dann auch beschrieben,
ich hoff' du baust dann eine fotogene Hardware dazu ;-)

grüsse leo9

von Stefan Kleinwort (Gast)


Lesenswert?

@leo9:
Prima Projektsharing ;-)

@Julius:
Ich habe nochmal auf der Bitscope-Homepage geschaut. Es gibt auch
unbestückte Platinen zu kaufen, dazu muss man allerdings etwas suchen:
http://www.bitscope.net/store/

Anleitungen und alles mögliche finden sich im Downloadbereich.

Mittlerweile sind die Selbstbauersachen ziemlich versteckt, das war
früher mal anders, Geldverdienen geht mit fertigen Produkten halt
einfach besser ...

Stefan

von Fritz Ganter (Gast)


Lesenswert?

@Stefan

Habs den Kit endlich gefunden, ich würds gleich bestellen (die Software
gibts als Linux-Version) wenn ich mit Paypal zahlen könnte.

von Stefan Kleinwort (Gast)


Lesenswert?

@Fritz:

Für die ältere Version gibt es auch das Layout zum Downloaden. Damit
könnte man sich die Platine auch selbst erstellen.
Ich habe mein bitscope erst seit kurzem und noch nicht viel damit
gemacht, wenn Interesse besteht, kann ich gerne mal berichten, sobald
ich selbst den Überblick habe.

Stefan

von Fritz Ganter (Gast)


Lesenswert?

Ja, würde mich interessieren.

von Sven Müller (Gast)


Lesenswert?

@leo:
Ok, das gibt ne feine Platine mit Mega8. kann sich allerdings noch 4
Wochen hinziehen. Gebe dir dann gerne alle Infos.

Meinst du das Pollen des Uart reicht beim DMX Empfang? Muss ich mit dem
Senden aufhören wenn was empfangen wurde? Naja, ich bin mal gespannt.

von Julius Krebs (Gast)


Lesenswert?

Ich habe den Fehler nun endlich entdeckt. Der µc war noch auf
RC-Osc.-Betrieb und hat daher sher unsauber gearbeitet. Nun
funktioniert alles bestens.
Ich hoffe aus diesem Fehler zu lernen.

von leo9 (Gast)


Lesenswert?

@sven:
könntest du bitte deine e-mail adresse posten ;-)

grüsse leo9

von Michael (Gast)


Lesenswert?

@leo,
Du bist ein großer Optimist. Ich programmiere seit ca. 6-7 Jahren
DMX-Sende- und Empfangroutinen. Im Polling ist das eine
(fast)Unmöglichkeit. Aber die UART's der AVR's sind prädisteniert für
diese Aufgaben. Denke bitte daran, daß Du mit 250KBaud fertig werden
mußt.
Michael

von Sven Müller (Gast)


Lesenswert?

Hey Michael..

250kbaud empfangen ist auch kein Problem.
Aber gleichzeitig noch 9,6kBaud senden..das weiß ich nicht wie ichs
anstellen soll..
vielleicht doch mit nem externen uart.oder nem Mega 128? oder 2 Mega 8?

von leo9 (Gast)


Lesenswert?

@Michael:
so ein großer Optimist bin ich nicht, eventuell hab ichs schlecht
formuliert.
Mit Polling habe ich nicht den Datenstrom gemeint sondern das RXC-Flag,
bei 250000Baud -> 4us pro Bit -> 40 us pro Byte habe ich 40us Zeit um
meine Hauptschleife zu durchlaufen, welche praktisch nichts tut.
Parallel dazu läuft ein Timerinterrupt (alle 104 us = 1/9600 Baud) der
die PMX-Signale per Software generiert. Die Routine zum DMX-Daten lesen
(RXC=1) braucht etwa 5us, die tmr-Interrupt Routine benötigt etwa 3,5us,
wenn ein neues Byte ansteht etwa 2us länger; also ca. 75% idle. Sorgen
bereitet mir nur noch die Berechnung eines neuen PMX-Telegrams, dafür
brauch ich derzeit noch 34us. Reicht zwar nach obiger Betrachtung aus
(zu dem Zeitpunkt stehen ja keine tmr ints an), ist für meinen
Geschmack aber etwa knapp kalkuliert.

In den nächsten Tagen sollt ich aber dazu kommen den Code in freier
Wildbahn zu testen, dann poste ich mehr.

grüsse leo9

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.