Guten abend liebe Leute,
nach langem suchen habe ich nun doch entschieden zufragen.
Ich suche eine DMX Senderoutine in Assambler hatte da mal etwas gehabt
aber verloren und wenn ich in der Suche dmx eingab kamen zwar
1000ergebnisse aber filtern wir die Empfänger und die Codeschnipsel in C
raus bleibt nich mehr viel übrig.
Möchte das Fahrrad nicht neu erfinden hat einer ein Codeschnipsel mit
dem ich die Kanalbytes die im Ram liegen über UART raus senden kann?
Brauch das in Assembler
ist doch weiter kein Problem, erstmal das
Breake-Signal und dann die Bytes nacheinander ins
Senderegister schreiben, dazwischen entweder warten bis Senderegister
leer
oder den TXC-Interrupt nehmen um das nächste Byte zu schreiben.
ist es wirklich so einfach? ich generiere 22mal ne 0 als break 88ųSek
dann 8ųsek 2mal ne 1 mark after break dann mein startbit eine 0 dann
mein kanalbyte das stopbit 8ųsek lang und dann wieder n startbit?
mark after break is das 8ųsek oder 4ųsek lang?
frameformat ist 8bit?
schreibst du deine Programme in ähnlicher Sprache wie deine Beiträge?
Meldet da der Compiler keine Fehler?
Übrigens heißt das Zeugs "Assembler" und nicht "Assambler"
@ der bastler (Gast)
>ist es wirklich so einfach?
Eigentlich schon.
>ich generiere 22mal ne 0 als break 88ųSek>dann 8ųsek 2mal ne 1 mark after break dann mein startbit eine 0 dann>mein kanalbyte das stopbit 8ųsek lang und dann wieder n startbit?
Wenn du so programmierst wie du hier schreibst wird das eher ehtwas
schwierig. Du weißt anscheinend nicht, wei ein UART funktioniert.
>mark after break is das 8ųsek oder 4ųsek lang?
Das ist vollkommen nebensächlich. Mach es irgendwa zwischen 10-100us und
gut.
>frameformat ist 8bit?
Schon mal versucht, eine Spezifikation von DMX512 zu lesen?
http://www.mikrocontroller.net/articles/Linksammlung#DMX512_2
Moin,
warum in Assembler?
So eine wahnsinnsperformance braucht man für DMX nicht, dass sich das
lohnen würde.
Grundsätzlich gibt es zwei gebräuchliche Wege, DMX zu senden:
1) Man nutzt einen UART und einen Timer, wobei der Timer für MAB und
Break sorgt
2) Man nutzt nur den UART und verändert die Baudrate passend, um Break
und MAB zu erzeugen
Beides schon gesehen. Selber nutze ich meist die Variante mit Timer und
UART.
Ich hänge da mal den C-Code für DMX-Tx an, den ich irgendwann mal
geschrieben habe. Läuft so wie er da steht mit einem 16MHz-Quarz, für
andere Frequenzen sind die Timings entsprechend anzupassen.
So schaut mein Programm nun aus ich habe den TXD ausgang nach dieser
Abbildung mit der DMX Buchste verschaltet:
http://www.mintiworld.de/wiki/images/9/96/DMXout.gif
Das Programm soll auf channel 1 und 2 jeweils eine 255 senden und 256
Kanäle senden.
Abundzu erkennt das Gerät(eine LED Matrix) ein DMX Signal kann dies
jedoch anscheinend nicht bearbeitet werden kann, manchmal leuten alle
Lichter manchmal Garkeins.
komisch ist auch, das der TXD Pin im Leerlauf 0.01V Spannung ausgibt,
ist das normal?
Spannung:
DMX- = 3.11V
DMX+ = 1.92V
DI MCU TXD = 3.24V
@Der Bastler (Gast)
> The_Game.asm (2 KB, 0 Downloads) | Codeansicht
Naja. Da sind noch einige Bugs drin. Und die Formatierung ist nichtg
gut, was Bugs LIEBEN!
Strukturierte Programmierung auf Mikrocontrollern>http://www.mintiworld.de/wiki/images/9/96/DMXout.gif
Ist OK.
>Das Programm soll auf channel 1 und 2 jeweils eine 255 senden und 256>Kanäle senden.
Bissel wenig. Aber für den Anfang OK.
>Abundzu erkennt das Gerät(eine LED Matrix) ein DMX Signal kann dies>jedoch anscheinend nicht bearbeitet werden kann, manchmal leuten alle>Lichter manchmal Garkeins.
Was nicht verwunderlich ist.
>komisch ist auch, das der TXD Pin im Leerlauf 0.01V Spannung ausgibt,>ist das normal?
Nein. TXD liegt im Leerlauf auf VCC.
>Spannung:>DMX- = 3.11V>DMX+ = 1.92V>DI MCU TXD = 3.24V
Wie hast du gemessen? Mit dem Multimeter? Das geht nur, wenn keinerlei
Daten gesendet werden. Dann muss DMX+ aber nache VCC und DMX- nahe GND
liegen. Ist bei dir nicht der Fall, also stimmt was nicht!
Hi
>Abundzu erkennt das Gerät(eine LED Matrix) ein DMX Signal kann dies>jedoch anscheinend nicht bearbeitet werden kann, manchmal leuten alle>Lichter manchmal Garkeins.
Wundert mich nicht.
> sbis UCSRA,UDRE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<> rjmp SendDMX> ldi temp, HIGH(B_UBRR_VAL)> out UBRRH, temp> ldi temp, LOW(B_UBRR_VAL)> out UBRRL, temp
Vor der Umschaltung der Baudrate solltest du TXC und nicht UDRE testen.
UDRE sagt nur, das der Sendepuffer ein Byte aufnehmen kann, aber
nicht, das die USART mit der Übertragung fertig ist. Damit kann die
Baudrateumschaltung u.U. noch während der laufenden Übertragung
stattfinden.
MfG Spess
Danke Falk ich werde es mal testen und nochmal messen, die Messungen
wurden während des sendens gemacht.
Nun die Formatierung in Atmelstudio schaut eigentlich ganz anderst aus,
glaubt nicht, dass ich so ein mist gemacht hab:
rjmp SendDMX ;Channel durch UART scheuchen ;Warten bis Buffer
leer ist
@spess53 danke für die Aufklärung das wollte ich auch erreichen bevor
ich die Baudrate umschalt.
Also mit deinem Programm Falk bin ich soweit, dass die Verbindung
nichtmehr abbricht und ein Eckpunkt der Matrix dauerhaft leuchtet kann
nun nicht sagen ob das der Erste oder der Letzte Channel ist.
Atmelstudio zeigt eine Warnung:
1 .cesg .db misalignment - padding zero byte
TXD Zeigt im Leerlauf nun 5V warum war das bei mir nicht der fall?
@Der Bastler (Gast)
>Danke Falk ich werde es mal testen und nochmal messen, die Messungen>wurden während des sendens gemacht.
aha, warum schreibst du dann was von Leerlauf? Was ist denn für dich
Leerlauf?
>Nun die Formatierung in Atmelstudio schaut eigentlich ganz anderst aus,>glaubt nicht, dass ich so ein mist gemacht hab:
Indirekt schon.
http://www.mikrocontroller.net/articles/Strukturierte_Programmierung_auf_Mikrocontrollern#Formatierung_des_Quelltextes
"Tabulatoren als Leerzeichen einfügen lassen: Das können die Editoren
heute allein. Der Vorteil ist, dass der Quelltext danach immer gleich
aussieht, und nicht auf einem anderen Editor mit anderer
Tabulatoreinstellung verschoben aussieht. "
>Also mit deinem Programm Falk bin ich soweit, dass die Verbindung>nichtmehr abbricht und ein Eckpunkt der Matrix dauerhaft leuchtet kann>nun nicht sagen ob das der Erste oder der Letzte Channel ist.>Atmelstudio zeigt eine Warnung:>1 .cesg .db misalignment - padding zero byte
jaja, ist unkritisch
>TXD Zeigt im Leerlauf nun 5V warum war das bei mir nicht der fall?
Was verstehst du unter Leerlauf? Dein Programm läuft immer, also gibt es
keinen Leerlauf.
Leerlauf den Pin zwischen TXD und dem SN75176 entfernt die
Leerlaufspannung am TXD Pin.
während ich die DMX eingänge gemessen habe, als dieser Pin wieder
verbunden war also während des sendens.
Nun nachdem ich das Gerät neustartete erkennt es zwar, dass DMX Signale
anliegen allerdings leuchtet keine der LEDs.
@ Der Bastler (Gast)
>Leerlauf den Pin zwischen TXD und dem SN75176 entfernt die>Leerlaufspannung am TXD Pin.
Auch dann ist dort kein Leerlauf! Das Programm läuft!
>während ich die DMX eingänge gemessen habe, als dieser Pin wieder>verbunden war also während des sendens.
Ebenso!
>Nun nachdem ich das Gerät neustartete erkennt es zwar, dass DMX Signale>anliegen allerdings leuchtet keine der LEDs.
Naja, ein WENIG Eigeninitialive und Mitdenken wäre schon nicht schlecht.
Z.B, indem du die Tabelle mit den DMX_Startwerte mal vergrößerst! Ach
ja, der erste Wert dort muss 0 sein, das ist das DMX-Startbyte. Wenn das
nicht Null ist, können einige Geräte das als ungültigen DMX-Datenstrom
werten und die Datenaufnahme verweigern.
Selbes Ergebnis nix leuchtet und der 1. Wert in der Tabelle ist 0 habe
sie auf weitere Stellen erweitert.
Wo kommen in dem Programm die Werte aus dem Ram ins Spiel?
Ah verstehe, ich brauch ein bisschen.
Sehe ich das richtig du schreibst die Werte aus dem flash in den RAM um
sie dann aus dem Ram in die UART zu schicken?
Genau
Bei festen Daten könnte man auch direkt aus dem Flash lesen und auf den
UART schicken, ist hier eine Geschmacksfrage. Aber meistens will man ja
die DMX-Daten verändern, also doch wieder RAM.
gut das Programm ist recht simpel habe es verstanden wirklich
erfolgreich ist das noch nicht, wenn ich das Signal der Avr abziehe
entstehen manchmal interessante Muster, wenn ich es wieder dran stecke
leuchtet eine Ecke.
Wie könnte ich denn das Signal verfolgen ein Oszi hab ich leider nicht
Sind Störungen von aussen möglich? meine Schaltung ist auf einem
Steckboard allerdings eins von der guten Sorte.
Also ich vermute nun einfach es liegt an meinem Steckboard, dass die
Schaltung nicht funktioniert, werde mal ne Platiene herstellen und das
drauf löten.