Ich habe mir vor ein paar Tagen ein eigentlich einfaches Ziel gesetzt: Die Ansteuerung eines Dimmerpacks mittels eines atmega16. Zuerst habe ich versucht dies mit einem Timerinterrupt zu realisieren. Doch ich musste schnell feststellen, dass der µc dabei schnell an seine Grenzen stößt. Aus diesem Grund habe ich mich auf die "Endlosschleifenmethode" "herabgelassen". Dabei werden die vorgegebenen Zeiten problemlos eingehalten. Doch das Dimmerpack reagiert nicht auf die Daten, im besten Fall wird angezeigt, dass Signale empfangen werden. Es wäre nett, wenn sich ein DMX512 Kundiger den passenden Code ankucken würde. In solch einem Fall wäre es sicher einfacher direkt die Ausgangssignale mittels eines einfachen Logiganalyser im Forum zu posten. Ist jemandem dazu eine Lösung für weniger als 100EUR bekannt?
Gibt es einen Grund, warum Du den UART des mega16 nicht benutzt? Hast Du ein Oszi, um die Signale mal anzuschauen? Stefan
Nein ein Oszi habe ich nicht. Deshalb haben ich ja auch den Logicanalyser angesprochen. Man müsste solch ein Gerät doch mit einfachen Mitteln bauen können. Als Anzeigeelemetn könnte ja mein PC fungieren. Beim UART besteht das Problem, dass zwischen den einzelnen Datenpacketen das Ausgangssignal stets auf High liegt.
Ich habe dsa Bitscope (www.bitscope.com). Ist zwar etwas über Deiner Preisvorstellung, aber ide verkaufen auch Leerplatinen bzw. Bausätze. Wenn Du nur einen Logikanalyzer willst, kannst Du ja erstmal den AD-Wandler weglassen und später nachrüsten. Es gibt auch eine Lowest-Cost-Lösung für die Centronics, schau mal bei den Links, weiss aber nicht, ob die die 250khz schafft. Der UART ist sogar optimal dafür geeignet! Habe ich auch schon gemacht, allerdings nicht mit dem AVR. Das einzige, was Probleme macht, ist das Break (oder auch Reset)-Signal. Dazu entweder den UART-TXD auf normalen Port schalten und das Break ausgeben oder auf 125kbit Baudrate umschalten und eine 0hex ausgeben. Bei letzterer Lösung wird auch gleich automatisch das Mark-after-Break erzeugt. Aber Vorsicht: wirklich sichergehen, dass alle Daten den Transmitter komplett verlassen haben, bevor die Baudrate geschaltet wird! Bei der Verwendung des UART (mit Interrupt) hast Du auch noch etwas Zeit, um was anderes als nur die Ausgabe zu machen ... Was ich in Deinem Code vermisse, ist der Startcode. Normalerweise wird ein Null-Byte dafür verwendet. Stefan
Interessante Sache. Habe sowas vor auchmal zu bauen, aber momentan keine Zeit. Bist du sicher das deine Hardware richtig ist? Polarität des DMX Signals? Ich würde dafür auch den Uart nutzen..spart viele Probleme. Mal ne OT Frage: hat einer schonmal nen DMX->PMX Umsetzer gebaut? DMX empfang ist kein PRoblem, das bekomme ich gut mit dem Uart hin. PMX senden ist auch nciht schwer. Ist RS232 mit 9600 Baud. Wenn ich den Uart zum empfangen nutze, muss ich ja entweder die Parameter ändern und schnell im Reset senden oder meint ihr das geht mit nem Softuart zwischen den Empfangsinterrupt? sorry für diese OT Frage. Sven
Das Gerät auf www.bitscope.com liegt leider auch ohne AD-WAndler deutlich über meinem finanziellen Möglichkeiten. Ich habe unter "Links" foglende Seite gefunden: http://www.qsl.net/dg5dbz/pcla/pcla.html Sieht ganz gut aus, ist aber leider recht umfangreich. Wenn das Umschalten des UARTs auf einen normalen Port problemlos funktioniert, werde ich das Ganze wohl damit realisieren. Durchgehend Nullbytes asuzugeben wird wohl nicht gehen, da das Stopbit dazwischenfunken würde. Aber es muss doch auch mit dem jetzigen Code funktionieren. Das Null-Byte ist übrigens in dem Datenarray bereits enhalten.
so OT ist die Frage nicht, PMX ist das Protokel von Pulsar? wie werden dort die Daten übertragen? könntest du vielleicht die Specs posten. Wenn du AVR einsetzt könnte ich dir bei der Programmierung helfen. (SW-Uart ist übrigends für diese Anwendung überhaupt kein Problem). Ein Problem sehe ich eher darin was mit Daten passieren soll die "zuviel" reinkommen, DMX kommt ja (fast) permanent und den Informationsgehalt bekommt man dann nicht 1:1 auf 9600 raus. grüsse leo9
Die Hardware müsste OK sein, da ich bereits alle typischen Fehlerquellen durchgegangen bin.
>Wenn das Umschalten des UARTs auf einen normalen Port problemlos >funktioniert, werde ich das Ganze wohl damit realisieren. Durchgehend >Nullbytes asuzugeben wird wohl nicht gehen, da das Stopbit Es reicht EIN Null-Byte mit langsamerer Baudrate. Was an Deinem Code nicht tut, kann ich ansonsten nicht entdecken. Bist Du sicher, dass Deine Quarz-Frequenz stimmt? Kleine Idee zum lowest-Cost-debuggen: Bau Dein wait_zeit so um, dass (Soll-Zeit mal 250.000) gewartet wird. Dann hänge an den Ausgang eine LED und schau Dir Dein Signal an. 1Bit = 1Sekunde. @Sven: Das funktioniert. Den Break kann man auf der Empfänger-Seite als Framing-Error detektieren. Hier wurde auch schon öfters drüber geredet. 9600 senden geht problemlos per Software-UART. Stefan
Hallo, die PMX Specs sind im Anhang. Original von Pulsar. Ich will zwei GS1 die nur PMX oder analog verstehen zu DMX fähigen geräten umbauen. Darum muss ich nicht alle Kanäle senden, sondern nur sechs und diese an eine feste Adresse. Zum DMX empfangen nutze ich momentan einen Mega16 / Mega8. das klappt auch problemlos. Meine Frage ist eher wamm und womit ich am besten das PMX Signal ausgebe. Die Hardware ist ja sehr simpel, Atmel, max232, dip-schalter. fertig.
Hallo Sven, Verkoppel doch über I/O Pins einen Mega8 mit einem 90S2313 der Mega8 macht den DMX Part und der 2313 den PMX Part. vorallem kannst du die Quarze genau bestimmen und der 2313 kostet nur 2,15
@Sven: den 2313 kannst du getrost einsparen, die 9600 erledigt der Mega8 nebenbei (wenn er wirklich nur DMX auf PMX übersetzen muß). 512/250000*9600 =~ 16, also sind die 6 Kanäle auch kein Thema, ich werd mich morgen mal mit der SW-Uart und einem Timingkonzept beschäftigen. In welcher Sprache/Compiler arbeitest du? grüsse leo9
Über die Lösung mit einem zweiten µC kam ich auch schon, fand die aber auch etwas "unprofessionell" Ich programmiere in C mit Codevision. Es darf aber kein Interrupt erfolgen während ich ein Zeichen per Softuart verschicke, oder? Um ein zeichen zu verschicken brauche ich aber doch mindestens 833µs..wie passt das? oder habe ich einen denkfehler?
Du musst den Softuart mit Timer-Interrupts aufbauen, dann ist das kein Problem. Also Startbit ausgeben, nächsten Timer-IR in 104us, dann der Reihe nach die Datenbits und das Stopbit. Stefan
Hallo Sven: ich plauder jetzt zwar aus dem Bauch raus, aber der einzige Interrupt den wir brauchen ist der Timer für die SW-Uart, den HW-Uart zum empfangen poll ich nebenbei. Codevision ist gut, den verwende ich auch recht gerne. Wenn ich morgen dazu komme gibts ein fertiges Konzept. Eine "Bedingung" habe ich aber: ich bin gerade am Aufbau einer Web-Page über diverse Technikbereiche, unter anderem DMX (im Eigenbau) für den Partykeller. Der DMX-PMX Converter wird dann auch beschrieben, ich hoff' du baust dann eine fotogene Hardware dazu ;-) grüsse leo9
@leo9: Prima Projektsharing ;-) @Julius: Ich habe nochmal auf der Bitscope-Homepage geschaut. Es gibt auch unbestückte Platinen zu kaufen, dazu muss man allerdings etwas suchen: http://www.bitscope.net/store/ Anleitungen und alles mögliche finden sich im Downloadbereich. Mittlerweile sind die Selbstbauersachen ziemlich versteckt, das war früher mal anders, Geldverdienen geht mit fertigen Produkten halt einfach besser ... Stefan
@Stefan Habs den Kit endlich gefunden, ich würds gleich bestellen (die Software gibts als Linux-Version) wenn ich mit Paypal zahlen könnte.
@Fritz: Für die ältere Version gibt es auch das Layout zum Downloaden. Damit könnte man sich die Platine auch selbst erstellen. Ich habe mein bitscope erst seit kurzem und noch nicht viel damit gemacht, wenn Interesse besteht, kann ich gerne mal berichten, sobald ich selbst den Überblick habe. Stefan
@leo: Ok, das gibt ne feine Platine mit Mega8. kann sich allerdings noch 4 Wochen hinziehen. Gebe dir dann gerne alle Infos. Meinst du das Pollen des Uart reicht beim DMX Empfang? Muss ich mit dem Senden aufhören wenn was empfangen wurde? Naja, ich bin mal gespannt.
Ich habe den Fehler nun endlich entdeckt. Der µc war noch auf RC-Osc.-Betrieb und hat daher sher unsauber gearbeitet. Nun funktioniert alles bestens. Ich hoffe aus diesem Fehler zu lernen.
@sven: könntest du bitte deine e-mail adresse posten ;-) grüsse leo9
@leo, Du bist ein großer Optimist. Ich programmiere seit ca. 6-7 Jahren DMX-Sende- und Empfangroutinen. Im Polling ist das eine (fast)Unmöglichkeit. Aber die UART's der AVR's sind prädisteniert für diese Aufgaben. Denke bitte daran, daß Du mit 250KBaud fertig werden mußt. Michael
Hey Michael.. 250kbaud empfangen ist auch kein Problem. Aber gleichzeitig noch 9,6kBaud senden..das weiß ich nicht wie ichs anstellen soll.. vielleicht doch mit nem externen uart.oder nem Mega 128? oder 2 Mega 8?
@Michael: so ein großer Optimist bin ich nicht, eventuell hab ichs schlecht formuliert. Mit Polling habe ich nicht den Datenstrom gemeint sondern das RXC-Flag, bei 250000Baud -> 4us pro Bit -> 40 us pro Byte habe ich 40us Zeit um meine Hauptschleife zu durchlaufen, welche praktisch nichts tut. Parallel dazu läuft ein Timerinterrupt (alle 104 us = 1/9600 Baud) der die PMX-Signale per Software generiert. Die Routine zum DMX-Daten lesen (RXC=1) braucht etwa 5us, die tmr-Interrupt Routine benötigt etwa 3,5us, wenn ein neues Byte ansteht etwa 2us länger; also ca. 75% idle. Sorgen bereitet mir nur noch die Berechnung eines neuen PMX-Telegrams, dafür brauch ich derzeit noch 34us. Reicht zwar nach obiger Betrachtung aus (zu dem Zeitpunkt stehen ja keine tmr ints an), ist für meinen Geschmack aber etwa knapp kalkuliert. In den nächsten Tagen sollt ich aber dazu kommen den Code in freier Wildbahn zu testen, dann poste ich mehr. grüsse leo9
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.