mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DMX Empfang mit AVR


Autor: Benny (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benny (Gast)
Datum:

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: Henne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Evtl. hilft auch mein C-Empfangsmodul etwas weiter:
http://www.razyboard.com/system/forum-hendrikh-dmx...

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Henne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Henne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Henne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Henne (Gast)
Datum:

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

Viele Grüße, Hendrik

Autor: Henne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier wäre das beta-Compilat:
http://www.razyboard.com/system/thread-beta3phased...

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

Hendrik

Autor: Benny (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benny (Gast)
Datum:

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

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So hab es jetzt mal mit 257 Byte versucht und immer noch kein Ergebnis.

Autor: Michael Wilhelm (Gast)
Datum:

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

MW

Autor: Benny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein

Autor: Benny (Gast)
Datum:

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

Autor: Michael Wilhelm (Gast)
Datum:

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

MW

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Benny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: weinbauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.