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
hab grad ein problem mit ponyprog, wollt die cksel ändern und jetzt lässt sich mein MC nicht mehr beschreiben oder lesen.
Externen Takt an XTAL1 anlegen, >=1Mhz, dann kannst Du wieder umfusen. Demnächst mal anständigen ISP-Programmer kaufen und AVR-Studio benutzen ;-)
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
>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
sorry - sollte heißen: (Wahrscheinlich überspringe ich DURCH den Overflow eine HW?) Viele Grüße, Hendrik
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
ä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 nen Lightcommander 48 der sendet doch nur bis 255, oder? was meinst du mit ISR gesteuert?
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
am Montag hab ich wieder die Möglichkeit mir das Signal mal am Oszi nzuschauen, vieleicht ist ja auch mein RS485 Baustein kaputt.
Hab noch was rausgefunden. Du must erst das DOR und FE Bit prüfen, danach UDR auslesen. 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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.