Forum: Mikrocontroller und Digitale Elektronik DMX Sender - trotz passendem Timing funktioniert es nicht


von Benjamin A. (beni0664)


Angehängte Dateien:

Lesenswert?

Hallo!

Schon im vorhinein: Der angehängte Sourcecode ist von einem guten 
Freund, der aber selbst schon am verzweifeln ist!

Laut Oszibilder sieht das Timing genau so aus wie es sein sollte, jedoch 
wird das Signal von keinem DMX Gerät anständig erkannt! LED PAR 
Scheinwerfer machen überhaupt nichts und ein selbstgebauter Empfänger 
(funktioniert mit Mischpult & PC) blinkt abwechselnd mit der grünen (DMX 
Signal liegt an) und der roten (kein DMX) und zwar so schnell das es 
wirkt als würden beide leuchten...

Ich wär für jeden Tipp aufs allerhöchste erfreut!

mfg beni

von holger (Gast)


Lesenswert?

a) TXC Interrupt ausschalten wenn alles gesendet wurde
b) Da fehlen jede Menge volatile für die Variablen
   die im Interrupt verwendet werden.
c) _delay_us() im Interrupt. Pfui Deibel!

von Falk B. (falk)


Lesenswert?

@  Benjamin A. (beni0664)

>      Oszi-Bilder.pdf
>      3,1 MB, 10 Downloads

OMG!!!

Schon mal über Bildformate nachgedacht?!??!

>Schon im vorhinein: Der angehängte Sourcecode ist von einem guten
>Freund, der aber selbst schon am verzweifeln ist!

Jaja, es sind immer die guten Freund, die Probleme haben, nie der 
Fragesteller selber ;-)

>Laut Oszibilder sieht das Timing genau so aus wie es sein sollte,

Glaub ich nicht. Ihr verwendet den falschen Interrupt. Nicht TXC sondern 
UDRE ist gefragt. Ja, es geht auch so, aber dann hat man immer etwas 
größere Lücken im Signal.

>Ich wär für jeden Tipp aufs allerhöchste erfreut!

Der Break ist zu klein! Das korrelliert nicht mit einer 0x00 bei 9600 
Baud.
Ausserdem macht ein UBRR von 12 einen Baudrate von 76k8.

Leitungen A und B am RS485 IC vertauscht? Masse angeschlossen, auch 
am MAX485?

MFG
Falk

von Konrad L. (konrad)


Lesenswert?

Im Kommentar schreibst Du was von einem 4 Mhz Quarz, definierst die 
CPU-Speed aber auf 16 Mhz. Könnte ein Problem sein.

von Dominik W. (absurdum)


Lesenswert?

Zuerst einmal:
Ja der Sourcecode ist vom einem guten Freund, von mir.
Hab aber in letzter Zeit ziemlich viel zu machen und keine Zeit gehabt 
selbst das Problem hier rein zu stellen.

Wegen der Datei Oszibilder.pdf:
Hab das schnell schnell im Dienst gemacht.

Wieso ist der TXC der falsche Interrupt?
Gedankengang war so: Wenn eine Übertragung vollständig gemacht wurde, 
wird die nächste Übertragung gemacht.
Macht es einen großen Unterscheid, wenn ich den UDRE nehme?
Hab mir im Vorhinein mehrere andere Sourcecodes anderer Leute angeschaut 
um Ideen zu sammeln. Auch im Projekt von hoelscher-hi.de wird der TXC 
Interrupt verwendet (siehe 
http://www.hoelscher-hi.de/hendrik/light/ressources/txd.zip).

Der Break ist ziemlich genau 88µs lang, so wie es in der Norm 
beschrieben ist.

UDRR = 12 macht eine Baudrate von 76,8kBAUD, des stimmt, hab i vergessen 
im Kommentar zu ändern.

hab keinen MAX485 sondern einen 75176B verwendet. Leitung A und B hab 
ich geprüft, die passen, das Signal an den beiden Leitungen stimmt auch 
und auch die Masse ist verbunden, hab ich alles mehrfach geprüft.

Des mit dem Quarz hab ich auch vergessen im Kommentar zu ändern.
Es ist ein 16 MHz Quarz.

von Robert L. (manateemoo)


Lesenswert?

Der Startcode sollte eine 0 wärend 36us (9x4us) sein, aber auf deinen 
Oszi Bildern siehts nicht so aus.
Die Break to Break time ist in der ANSI E1.11 (DMX Standard) als min 
1204us definiert, sieht auf deinem Oszi nicht so aus.
Auf deinem Oszi bild sehe ich das Break <80 us.

von Dominik W. (absurdum)


Lesenswert?

Die Oszibilder hab ich nur so zum anschaun andn Benjamin 
(Threadersteller) geschickt, hab nicht damit gerechnet das er sie hier 
rein stellt.
Die Bilder sind nicht wirklich qualitativ.
Allerdings fällt mir jetzt auch auf, das der Break auf dem Bild zu kurz 
ist.
Hab das vor ein paar Tagen mitten in der Nacht nach einem anstrengenden 
12 Stunden Dienst gemacht, kann sein das mir da ein Fehler unterlaufen 
ist.
Werd das Heute Abend nochmals prüfen.

von STK500-Besitzer (Gast)


Lesenswert?

>Gedankengang war so: Wenn eine Übertragung vollständig gemacht wurde,
>wird die nächste Übertragung gemacht.
Ist soweit auch in Ordnung.

>Macht es einen großen Unterscheid, wenn ich den UDRE nehme?
Ja. TXC wird ausgelöst, sobald der Übertragungspuffer komplett geleert 
wurde.
Beim AVR passen dort 2 Bytes hinein. Es entsteht also eine Pause, wenn 
man auf das Auslösen des TXC wartet, sofern noch Daten zu senden sind, 
aber nicht im UDR-Puffer stehen.


>Hab aber in letzter Zeit ziemlich viel zu machen und keine Zeit gehabt
>selbst das Problem hier rein zu stellen.
Dann solltest du dich lieber um Sachen mit höherer Priorität kümmern!

von Dominik W. (absurdum)


Lesenswert?

Werd sobald ich zu Hause bin den Interrupt umschreiben und das Timing 
anpassen und es dann nochmals probieren.

Danke für alle konstruktiven Antworten!

von Robert L. (manateemoo)


Lesenswert?

Kleiner Hinweis: (ohne den ATmega8 im detail zu kennen)
Uarts haben gewöhnlich zum Senden zwei Buffer. Ein Daten-Register und 
ein Schieberegister. Normalerweise benutzt man den Interrupt der meldet 
wenn das Datenregister leer ist (UDRE).
Wenn man aber ein Break generieren will, indem man die Baudrate 
verändert, muss man warten bis auch das Schieberegister leer ist (TXC).

von Henne (Gast)


Lesenswert?

Ihr macht leider alle zusammen einen kleinen Denkfehler mit dem UDRE, 
der mir auch zunächst das Leben schwer gemacht hat:

Viele billigere Fixtures aus China haben keinen vernünftigen 
Empfangspuffer am USART und können zusätzlich die eintreffenden Bytes 
nicht in normgerechter Zeit verarbeiten. Wenn Ihr nun den FIFO zum 
Senden nutzt - und somit zwischen den Bytes keine kurzen Pausen lasst - 
kommen diese Geräte nicht mehr mit und beginnen zu flackern.

Deshalb sollte zwischen jedem Byte eine Pause von 2..5us eingeplant 
werden (interbyte gap). Und dies bekommt Ihr bei 8n2 nur über den 
TxC-IRQ hin.


case-Bedingungen bei so einer kleinen FSM halte ich für schlecht, da 
ineffizient.


Viel Erfolg,
Hendrik

von Dominik W. (absurdum)


Lesenswert?

Hab gestern am Abend noch die BAUD Raten angepasst und bin auf ein 
Problem drauf gekommen, welches der Grund ist, dass es nicht so 
funktioniert wie es soll.
Und zwar, wie schon oben einmal bemerkt wurde, ist die Zeit eines Bytes 
viel zu kurz, hab dann zum Test zwei Datenbytes mit '85' und '170' 
gesendet, welche ja eine High - Low Bitfolge haben. Dabei ist mir 
aufgefallen, dass keine 8 Datenbits gesendet werden, sondern nur 5.

In der Subroutine initDMX konfiguriere ich doch den USART auf das 
Datenformat 8N2, oder hab ich da wo einen Fehler drin?

von Sven P. (Gast)


Lesenswert?

Henne schrieb:
> Viele billigere Fixtures aus China haben keinen vernünftigen
> Empfangspuffer am USART und können zusätzlich die eintreffenden Bytes
> nicht in normgerechter Zeit verarbeiten. Wenn Ihr nun den FIFO zum
> Senden nutzt - und somit zwischen den Bytes keine kurzen Pausen lasst -
> kommen diese Geräte nicht mehr mit und beginnen zu flackern.
Dagegen hilft es manchmal auch, ein volles Universum mit 512 Kanälen 
auszugeben (auch wenn dann 500 Kanäle ungenutzt sind). Viele 'günstige' 
Geräte kommen ins schleudern, wenn sie nur 30 Kanäle oder weniger sehen.

von Dominik W. (absurdum)


Lesenswert?

Ja, das wird schon stimmen, doch bei mir ist das Problem nicht der 
Empfänger, sondern der Sender.

Ich sende (zurzeit Testweise) 10 Kanäle, Problem wie vorhin gesagt, es 
werden nur 5 Datenbits pro Übertragung gesendet!

von Falk B. (falk)


Lesenswert?

@  Sven P. (haku) Benutzerseite

>Dagegen hilft es manchmal auch, ein volles Universum mit 512 Kanälen
>auszugeben (auch wenn dann 500 Kanäle ungenutzt sind). Viele 'günstige'
>Geräte kommen ins schleudern, wenn sie nur 30 Kanäle oder weniger sehen.

Mann O Mann, wie dämlich oder geizig muss man sein, um sowas Primitives 
wie ein DMX512 Signal nicht gescheit EMPFANGEN zu können?!?!???
Das ist ja nun weiss Gott keine Meisterleistung. Vor allem für die 
Geräte, die nur einen oder ein paar Kanäle haben.
Aber Geiz ist eben geil, auch in China.

MfG
Falk

von Falk B. (falk)


Lesenswert?

Schreib mal anstatt

1
  // Format: 8N2
2
  UCSRC |= (1 << URSEL);
3
  UCSRC |= (1 << USBS) | (1 << UCSZ0) | (1 << UCSZ1);

lieber
1
  // Format: 8N2
2
  UCSRC = (1 << URSEL) | (1 << USBS) | (1 << UCSZ0) | (1 << UCSZ1);

Denn es kann sein, dass der implizite Lesezugiff deiner ersten Version 
nicht die Daten aus UCSRC liefert sondern eher UBRRH, die Doku ist da 
nicht eindeutig.

MfG
Falk

von Sven P. (Gast)


Lesenswert?

Falk Brunner schrieb:
> @  Sven P. (haku) Benutzerseite
>
>>Dagegen hilft es manchmal auch, ein volles Universum mit 512 Kanälen
>>auszugeben (auch wenn dann 500 Kanäle ungenutzt sind). Viele 'günstige'
>>Geräte kommen ins schleudern, wenn sie nur 30 Kanäle oder weniger sehen.
>
> Mann O Mann, wie dämlich oder geizig muss man sein, um sowas Primitives
> wie ein DMX512 Signal nicht gescheit EMPFANGEN zu können?!?!???
> Das ist ja nun weiss Gott keine Meisterleistung. Vor allem für die
> Geräte, die nur einen oder ein paar Kanäle haben.
> Aber Geiz ist eben geil, auch in China.
Naja, siehst du ja.
Eurolite hat sowas auch ganz gerne mal.

von Dominik W. (absurdum)


Lesenswert?

Ich werd wenn ich heute nach Hause kommen probieren, die initialisierung 
in eine Zeile zu schreiben, hoffe das es funktioniert.
Danke auf jeden Fall, an das hab ich noch gar nicht gedacht.

von Dominik W. (absurdum)


Lesenswert?

Wenn ich die Initialisierung in einer Zeile schreibe, funktioniert die 
Initialisierung wenigstens schon, hab jetzt 8 Daten- und 2 Stoppbits.
Dennoch schaffe ich es noch nicht einen einfachen LED Scheinwerfer 
anzusteuern.
Irgendwo hab ich in meinem Code noch einen Fehler drin.

von holger (Gast)


Lesenswert?

>Irgendwo hab ich in meinem Code noch einen Fehler drin.

Hast du das mit dem volatile berücksichtigt?

volatile unsigned char value[DMXANZ];      // DMX Werte
volatile unsigned int  dmxnum;          // aktueller DMX channel
volatile unsigned char status;          // aktueller DMX Status

von Wunder (Gast)


Lesenswert?

Sagt mal, welche Baudrate macht DMX eigentlich ?

76k8 erscheint mir zu langsam, schonmal mit 250k versucht? Damit hab ich
mir mal über Nacht nen Freund gemacht, am Abend beim Bühnenaufbau hatte 
er
nur einen 0/10V Strobo, nach der Nacht am Lötkolben brachte ich ihm nen
DMX->0/10V Teil auf Lochraster mit 250 kBaud vorbei... funktionierte auf
Anhieb.

von Dominik W. (absurdum)


Lesenswert?

Hab jetzt nach langer Suche den entscheidenden Fehler bei meinem DMX 
Sender gefunden. Irgendwie is mir der Fehler jetzt ziemlich peinlich. 
Arbeite seit über 3 Jahren im Bereich der Eventtechnik und hab dennoch 
den DMX+ und den DMX- vertauscht.
Naja, jetzt funktioniert der Sender und das ist wichtig.
Ein herzliches Dankeschön an alle, die mit konstruktiven Posts geholfen 
haben.

von Stephan (Gast)


Lesenswert?

Na, da kann ich noch einen drauflegen. Hab mal zwei Stunden an einem 
Fernseher den Fehler gesucht - wäre besser gewesen, den Netzstecker in 
die Steckdose zu stecken, anstatt das ganze Gerät aufzuschrauben...
Stephan.

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.