PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DMX senden.



Merlin321
15.03.2010, 20:14
Guten Abend zusammen,
Ich weiß, dass dieses Thema mit Sicherheit schon mindestens 200.000 mal besprochen wurde, aber die Forensuche bringt mir nie wirklich das, was ich brauche, oder zu viel, um es mal durchzuschauen :(
Deshalb ein 200.001. mal:
Ich möchte DMX-512 Signale senden. Einige Recherchen ergaben bereits, dass das durch den UART des AVR-Controllers von Haus aus ganz gut möglich sein sollen. Ich bin nun allerdings weitestgehend absoluter neuling in diesen Sachen, was mir das ganze wahrscheinlich unnötig erschwert. Ich finde leider auch nie irgendwelche Code-Beispiele (im Suchen selbiger bin ich auch 'ne Niete :(). Mir geht es erst einmal um die Theorie, das dann in der Praxis aufzubauen, ätzen etc. kommt deutlich später, nicht nur aus Gründen finanzieller Naturen.
Nun die Frage: Habt ihr bereits Erfahrungen mit dem Senden von DMX-Signalen, und könnt mir vielleicht ausschnittsweise Codebeispiele für dieses geben? Z.B. auch zum Senden des "Breaks", was ja eigentlich ein Fehler in der Seriellen übertragung angibt, und demzufolge scheinbar nicht so super zu senden möglich ist.

mit vielem Dank im Vorraus,

Merlin

PS.: Zu erwähnen sei vielleicht: Ich Programmiere ausschließlich C, habe dort auch einige Erfahrung. BASCOM müsste ich lesen können, habs aber bisher nicht probiert.

wkrug
16.03.2010, 07:15
Ich hab das so gelöst:

// Daten senden
void send_data (void)
{
// Resetimpuls Start
if(tx_counter==0&&(UCSRA & DATA_REGISTER_EMPTY)>0)
{
UCSRB&=0b11110111; /* Sender ausschalten */
PORTD.1=0;
delay_us(90);
PORTD.1=1;
UCSRB|=0b00001000;
putchar(0);
if(uc_sendmode==0)
{
putchar(uc_red);
putchar(uc_green);
putchar(uc_blue);
putchar(uc_dmxsendvalue[3]);
putchar(uc_dmxsendvalue[4]);
putchar(uc_dmxsendvalue[5]);
putchar(uc_dmxsendvalue[6]);
};
if(uc_sendmode==1)
{
putchar(uc_dmxsendvalue[0]);
putchar(uc_red);
putchar(uc_green);
putchar(uc_blue);
putchar(uc_dmxsendvalue[4]);
putchar(uc_dmxsendvalue[5]);
putchar(uc_dmxsendvalue[6]);
};

};
}
Der USART wir dabei abgeschaltet und ein festes Potetial auf des Port des USART für mehr als 88µs gegeben.
Danach wird der USART wieder aktiviert und die Werte gesendet.

Der Rest der Sendung läuft dann bei mir über eine fertige .lib ab, die den TxD Interrupt nutzt.
Man könnte auch eine normale Senderoutine verwenden, aber das hat mir nicht gefallen.

Eine andere Möglichkeit der BREAK Erzeugung wäre die Übertragungsgeschwindigkeit des USART auf einen niedrigen Wert ( z.B. 2400 Baud ) einzustellen und das Byte 0x00 zu senden.
Auch das würde ein Break Signal bewirken.
Vor dem Senden der DMX Kanaldaten muss natürlich der USART wieder auf 250kBaud hochgestellt werden.

Beides wird praktiziert und funktioniert.

Merlin321
16.03.2010, 16:46
Hey,
Vielen Dank schon einmal dafür! Das hilft mir!


Der Rest der Sendung läuft dann bei mir über eine fertige .lib ab, die den TxD Interrupt nutzt.

Was sendest du denn noch?! Ich sehe da nichts, was noch gesendet werden müsste, oder?

Merlin

wkrug
17.03.2010, 18:00
Die putchar(x) füllt ja nur einen Puffer.
Die Routine arbeitet dann diesen Puffer ab und sendet Ihn über die serielle Schnittstelle.
Das hab ich mit der .lib gemeint.

Im Prinzip ist sowas bei jedem Compiler ohnehin enthalten.