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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.