DMX Sender - trotz passendem Timing funktioniert es nicht

OP #1562894
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
Angehängte Dateien:
#1562977
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
#1563466
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.
#1563503
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.
Gast #1563543
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!
#1563996
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).
Gast #1564075
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
#1565277
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?
Gast #1565292
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.
#1565329
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
#1565344
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
Gast #1565358
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.
Gast #1566360
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
Gast #1566450
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.
#1571285
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.
Gast #1571303
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.

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