Forum: Mikrocontroller und Digitale Elektronik DMX Empfang mit AVR


von Benny (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich möchte gern eine LED per DMX an und ausschalten. Dazu habe ich einen 
AtMega8 benuzt. mit einem LTC485 wandel ich das rs485 Signal in ein 
rs232 Signal, welches ich mit dem Uart des Mega8 auslese. Quelltext 
liegt bei. DMX empfange ich korekt (Frame Error kommt) jedoch kann ich 
keine Bytes auslesen. Wo könnte mein Fehler liegen?
MFG benny

von Stefan K. (_sk_)


Lesenswert?

Baudrate sieht ja ok aus.
Hast Du den Takt auf externen Quarz umgestellt - oder läuft Dein mega 
mit den internen Default-1Mhz ?

Der Code sieht eigendlich ok aus - zumindest zum Test. Verify der 
Array-Bounds nicht vergessen! Am Besten baust Du das Ganze (später) als 
UART-IR um.

Gib mal zum Test was über den UART aus, um die Baudrate zu verifizieren.


Gruß, Stefan

von Benny (Gast)


Lesenswert?

hab grad ein problem mit ponyprog, wollt die cksel ändern und jetzt 
lässt sich mein MC nicht mehr beschreiben oder lesen.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Externen Takt an XTAL1 anlegen, >=1Mhz, dann kannst Du wieder umfusen. 
Demnächst mal anständigen ISP-Programmer kaufen und AVR-Studio benutzen 
;-)

von Henne (Gast)


Lesenswert?

Evtl. hilft auch mein C-Empfangsmodul etwas weiter:
http://www.razyboard.com/system/forum-hendrikh-dmxkatransceiverfirmwaredevelopment-1336611.html

Es läuft alles auf meinem transceiver (mega8515)  - aber ein Port zum m8 
sollte machbar sein.

Wenn Du noch eine Idee hast, wie man den Code noch flotter bekommt - 
immer her damit :-)

Viele Grüße, Hendrik

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>Wenn Du noch eine Idee hast, wie man den Code noch flotter bekommt -
>immer her damit :-)

Geht doch gar nicht (zumindest nicht beim ASM-Code) ;-) Bei mir läuft 
er, wie geschmiert. µC ist ein ATMEGA16 mit 16MHz, 12-fach Dimmer :-)

von Henne (Gast)


Lesenswert?

Danke, Travel :-))

Allerdings zeigte mein Link auf C-Code - und da sieht die Welt 
(zumindest bei mir) noch anders aus...

Was den Dimmer angeht:
Falls dein Pack dreiphasig auf einer MCU werkelt, würde ich gern mal 
etwas Code mit Dir tauschen. Das Phasenschieben klappt bei mir ganz gut 
- nur bei Zündwinkeln der Slave-Phasen in der Nähe des ZC der 
Master-Phase setzt der jeweilige Kanal beim Durchfaden scheinbar für 
eine HW kurz aus...
(Ich könnte mir vorstellen, dass ich bei frischen T1-Compare Overflows 
noch mal extra im Master-ZC zpnden muss...)

Viele Grüße, Hendrik

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Ähhem ja, das mit C ist klar. Ich verwende ja ASM, da geht´s halt nicht 
besser. Nee, mein Dimmer ist "leider" einphasig, was mir vollkommen 
reicht, da sich die Leistung in Grenzen hält. Ich habe 8A SSRs als 
Endstufen verwendet (SHARP S202 S01), die Kanäle treiben momentan bis 
500W, aber halt nicht alle auf einmal ;-). Anfangs hatte ich ein wenig 
Probleme mit Flimmern in sehr kleinen Leistungsstufen und Aussetzern bei 
Maximalleistung, aber nach Timeroptimierungen und Bug-Beseitigung steht 
das Ausgangssignal jetzt sehr sauber. Ich hatte festgestellt, daß nur 
das Zünden ein wenig nach dem wirklichen Nulldurchgang wirklich 100%ig 
gut funktioniert. Die Nulldurchgangsdetektierung mache ich über 2 
hochempfindliche Optokoppler, die schon bei 1mA LED-Strom schalten. 
Beide Kollektoren der Ausgangstransistoren sind zusammengeschaltet auf 
einen PullUp. Ich habe dann pro Nullduchgang (100x pro Sekunde) einen 
kurzen High-Impuls von etwa 1,5ms Länge (0,75ms zu jeder Seite des 
Nulldurchgangs), wenn dessen Flanke wieder fällt, zünde ich für Maximale 
Leistung, für Minimale Leistung halt mit Zeitfenster von diesem Punkt 
an.

von Benny (Gast)


Lesenswert?

mhhpf, so hab mir erstmal das STK500 bestellt, dieses Verdammte Ponyprog 
mit parportkabel ist einfach zu nervig. So muss mir jetzt nur noch 
überlegen wo ich mehr als ein MHz her bekomm.

von Michael Wilhelm (Gast)


Lesenswert?

@ Travel Rec,

ich habe früher auch so eine ähnliche Nullpunkterkennung gehabt und habe 
bei den Optokopplern große Exemplarstreuungen gesehen. Die für mich 
bessere Variante ist:
nach dem Strombremswiderstand eine DIL-Brücke direkt an den Koppler. 
Damit habe ich bessere Ergebnisse erzielt. Die Brücke kann eine schnöde 
10V Brücke sein, da der Koppler(LED) das Signal an der Brücke auf max. 
2V begrenzt.

MW

von Henne (Gast)


Lesenswert?

@Michael:
Damit hatte es bei mir mal ziemlich geknirscht, da der Opto nicht mehr 
richtig dicht machte (eigentlich komisch...).

Gut geht auch nur auf einer HW zu syncen und den Rest per Timer zu 
machen.

Na ja - dann bin ich hier wohl auch der einzige mit einem 3p-Core :-/


Viele Grüße, Hendrik

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>ich habe früher auch so eine ähnliche Nullpunkterkennung gehabt und habe
>bei den Optokopplern große Exemplarstreuungen gesehen.

Klar, hängt von der Qualität der Teile ab - ich hatte mir die Signale 
auf dem Oszi angeguckt und nur sehr leichte Unterschiede festgestellt. 
Das mag wohl daran liegen, daß es ein Doppelopto in einem Gehäuse war, 
also beide Kanäle aus derselben Produktion stammen. Bei Einzelkopplern 
ist das wahrscheinlich schlimmer. Die Graetz-Brücke wirkt sich 
allerdings negativ auf die Sensitiviät des Kopplers aus, da sich da 
nochmals einige Volt Schwellspannung ergeben und den Koppler so früher 
sperren und später öffnen, was den Wirkbereich des Phasenanschnittes 
einengt.

An Henne: Guck mal in das Datenblatt Deiner Triacs, ab welchem 
Mindeststrom die erst halten. Es kann durchaus sein, daß Du bei 
Induktionseffekten von den Lichtleitungen her mehrfach zünden mußt, weil 
in der Nähe des Nulldurchgangs der Strom über dem Triac noch nicht 
ausreicht oder gar fluktuiert, um ihn die Halbwelle lang halten zu 
lassen. Ich lasse bei den SSRs die LED für die gesamte Dauer des 
wirksamen Phasenbereiches eingeschaltet, so daß der interne Triac bei 
Bedarf nachgezündet wird. Das funktioniert einwandfrei. Kurze 
Zündimpulse in der Nähe des Nulldurchgangs führten hingegen nicht zum 
gewünschten Ergebnis und ließen schonmal die eine oder ander Halbwelle 
aus.

von Henne (Gast)


Lesenswert?

@Travel-Rec:
Genau so arbeite ich auch ;-)

Vielleicht sollte ich hier mal grob die Funktionsweise meines 3p-Cores 
beschreiben:

Beim Init lese ich die Phasenbeziehungen der Slave-Phasen zur 
Master-Phase ein und errechne daraus deren Offsets. (->Phasenschieben)
Bei neuen DMX-Werten hole ich mir nun den passenden Zündwinkel aus der 
gewünschten Curve-Tabelle und addiere (falls Slave-Phase) den Offset.
Liegt dieser Wert außerhalb des Timerbereichs einer Halbwelle (8Mhz, 
clk/8, 50Hz -> 0-10000), subtrahiere ich die 10k, um in der Halbwelle 
(bzw. in der nächsten) zu bleiben.
Über eine comp-ISR zünde ich nun die ch und über einen 2. quenche ich 
sie kurz vor deren jeweiligen ZCs.

Wenn ich nun auf einem Slave-Kanal beim Faden die 10k (s.o.) 
über-/unterschreite, setzt dieser Kanal für eine Halbwelle zZ. aus. 
(Wahrscheinlich überspringe ich den Overflow eine HW?)

Viele Grüße, Hendrik

von Henne (Gast)


Lesenswert?

sorry - sollte heißen:
(Wahrscheinlich überspringe ich DURCH den Overflow eine HW?)

Viele Grüße, Hendrik

von Henne (Gast)


Lesenswert?

Hier wäre das beta-Compilat:
http://www.razyboard.com/system/thread-beta3phasedimmerpack-hendrikh-1336611-4047915.html

...und nun ist wirklich Schluss mit dem Mehrfach-Posten sorry

Hendrik

von Benny (Gast)


Angehängte Dateien:

Lesenswert?

ähhm hallo, sorry aber das thema hieß DMX empfang. Also ich hab mir 
jetzt ein SDK500 geholt und meine ATMega8 reaktiviert. So nun hab ich 
den o.g. Quelltext draufgebrannt und die Taktung auf 8mhz gesetzt. der 
Frame Error von DMX wird empfangen, aber ich kann immer noch nicht meine 
DMX Bytes auslesen.
Hilfe

von Michael Wilhelm (Gast)


Lesenswert?

Was für eine DMX-Quelle hast du denn? Bei vielen Geräten werden alle 512 
Kanäle gesendet. Entweder das Array größer oder eine Abfrage auf 255 und 
dann den dmx_status wieder auf 0 setzen.

Ansonsten probiere doch mal den ISR gesteuerten Empfang.

MW

von Benny (Gast)


Lesenswert?

hab nen Lightcommander 48 der sendet doch nur bis 255, oder? was meinst 
du mit ISR gesteuert?

von Michael Wilhelm (Gast)


Lesenswert?

Hab eben mal nachgesehen. MA gibt als maximale Startadresse 256 an. 
Also, das Array muss mindestens 257 Byte groß sein, da ja noch der 
Startcode gesendet wird.

Mit ISR meine ich interrupt-gesteuerten Empfang.

MW

von Sonic (Gast)


Lesenswert?

>das Array muss mindestens 257 Byte groß sein
Was um Gottes Willen willst du denn mit einem so großen Array? Willst du 
alle DMX-Kanäle auswerten? Das Array muss doch nur so groß wie deine 
Anzahl Ausgänge sein. Beim reinen DMX-Empfänger jedenfalls.
Du musst nur bis zur eingestellten Startadresse die Bytes zählen und ab 
da die empfangenen Bytes dem Array zuweisen. Ob das ab 1, 25 oder 328 
ist, ist wurscht!

von Michael Wilhelm (Gast)


Lesenswert?

@ Sonic,
logisch hast du recht, aber ich bezog mich auf den Quellcode, der von 
Benny gepostet wurde. Und da liest er linear alle Daten in ein Array.

MW

von Benny (Gast)


Lesenswert?

So hab es jetzt mal mit 257 Byte versucht und immer noch kein Ergebnis.

von Michael Wilhelm (Gast)


Lesenswert?

Auch nicht, wenn du am Pult den 6. Kanal hochziehst?

MW

von Benny (Gast)


Lesenswert?

nein

von Benny (Gast)


Lesenswert?

am Montag hab ich wieder die Möglichkeit mir das Signal mal am Oszi 
nzuschauen, vieleicht ist ja auch mein RS485 Baustein kaputt.

von Michael Wilhelm (Gast)


Lesenswert?

Hab noch was rausgefunden. Du must erst das DOR und FE Bit prüfen, 
danach UDR auslesen.

MW

von Sonic (Gast)


Lesenswert?

@Benny:
>was meinst du mit ISR gesteuert?
Muss ich davon ausgehen dass du den Empfang nicht über 
RX-Interrupr-Routine machst? Bei 250kBaud wird's dann wohl zu jeder 
Menge Timingproblemen kommen! Mach' das interruptgesteuert und lies nur 
die Kanäle ein die du brauchst, sonst bleibt außer dem Empfang keine 
Zeit mehr für den Rest (Ansteuerung der zu steuernden Geräte).

von Benny (Gast)


Lesenswert?

so also empfang tut jetzt mit der o.g. Programmierung. Haben das ganze 
mal an nem Oszi ausgewertet und gesehen das das DMX Signal invertiert 
war => DMX + und - getuscht und es ging.
Also vielen Dnak für die Hilfe

von Andreas (Gast)


Lesenswert?

Hallo!

Benny schrieb:
> mit einem LTC485 wandel ich das rs485 Signal in ein
> rs232 Signal, welches ich mit dem Uart des Mega8 auslese.

Hast du dazu einen Schaltplan?
Hab gerade irgendow im Internet gelesen, dass mit RS485 die Daten ums 
4-fache schneller als bei RS232 übertragen werden..

mfg

von weinbauer (Gast)


Lesenswert?

@Andreas ...

das ist Käse, dass er auf RS232 geht. Der LTC gibt
0V und 5V high-low-Pegel aus, passend zum Controller
Uart. RS232 ist was ganz Anderes.

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.