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
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
>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 :-)
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
Ä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.
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.
@ 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
@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
>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.
@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
ä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
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
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
>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!
@ 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
@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).
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
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