DMX mit AVR empfangen - wer hats schon gemacht?

Gast #67452
Lesenswert?

Hallo, bitte verweist mich nicht auf Google oder die Forensuche, die
habe ich schon bemüht..
Ich möchte gerne mit nem AVR (momentan Mega16) DMX empfangen.

Programmiersprache:C (Codevision)

Hardware: STK 500, SN 75176

Sagt mir mal ob ich auf dem richtigen Weg bin:

-Uart auf 250kbaud eingestellt (UBRRL = (CPU_Takt  16  baud) - 1;)
-1 Start Bit, 8 Daten Bit, 2 Stop Bit (UCSRC = (1<<7) | (1<<3) | (1<<1)
| (1<<0);)
-RX Interrupt an, Receiver an (UCSRB = (1<<7) | (1<<4);)
-Globale Interrupt an (#asm("sei");)

Soweit die initialisierung.

Dann muss ich ja auf nen Break warten, (Frame Error)
wie mache ich das am besten? in meiner Interruptroutine (wenn FE
gesetzt, dann channel =0, da ja das nächste Byte ohne Frame error Kanal
0 (Start) is? oder besser in meinem Hauptprogramm while (FE gesetzt)
channel =0;?

Das erste Wort lese ich doch einfach mit value = UDR ein, oder? und
zähle meinen channel hoch, bis zum nächsten FE, da setze ich channel
wieder auf 0..

Wo ist der Fehler??

Danke, sven
Gast #67455
Lesenswert?

genaugenommen muß das Byte nach dem Frameerror Null sein, sonst sind die
nachfolgenden Daten keine Kanaldaten. Andere Werte kennzeichnen z.B.
Dimmerkurfen oder irgendwelche Konfigurationsdaten, das ist aber von
Hersteller zu Hersteller unterschiedlich implementiert. Schau mal bei
www.soundlight.de vorbei, dort gibts auch die DMX-Spezifikationen.

grüsse leo9
Gast #67456
Lesenswert?

ja. soundlight kenne ich ebenfalls.

Aber den Uart vielleicht nicht genau genug. jedenfalls funktioniert
mein Code nicht.

mir würde es ja schon reichen den Break zu detektieren. Wo prüfe ich am
besten auf einen Frame Error?

In der Interruptroutine (wird einer während MARK / Reset ausgelöst?
oder polle ich das FE bit im Hauptprogramm und gebe wenn gesetzt den
IRQ frei??
Gast #67457
Lesenswert?

Ich würde alles in der IR-Routine machen, inkl. FE-Erkennung.

Wenn FE, dann Kanal-Nr NULL setzen.

Wenn Kanal-Nr = NULL, dann muss empfangenes Byte auch NULL sein,
ansonsten sind die Daten ungültig -> verwerfen bis zum nächsten FE.

Wenn Kanal-Nr >= Empfangs-Kanal, dann Empfangsdaten in einem
Empfangs-Array speichern. Auf diese Daten kann dann das HP zugreifen.

Sinnvoll ist es, bei gültigen Daten eine LED und dazu einen Timer zu
setzen. Die LED zeigt den DMX-Empfang an, wenn der Timer abgelaufen ist
oder ungültige Daten empfangen werden, wird die LED wieder gelöscht.
Sehr hilfreich bereits während der Entwicklung und auch später beim
Betrieb!

Stefan
Gast #67459
Lesenswert?

Ja, vor ein paar Jährchen ... allerdings auf einem 80517 (8031-Clon), in
Assembler. Wird Dir als AVR-C-Programmer garantiert nicht weiterhelfen,
aber wenn Du willst kannst Du das Assemblerzeugs mal haben.

Stefan

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren