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
Das 1. Byte eines DMX-Frame ist der Startcode (im Regelfall 0 für Dimmerdaten) ab dem 2. Byte folgen die eigentlichen Daten max. 512 Byte
genau, das habe ich verstanden. eventuell könnte man das erste Byte als Verpolungstest nutzen? Aber ist der Rest ok. Ich wäre froh wenn ich das 1. Byte richtig empfanken könnte..
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
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??
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
Danke Stefan, das hilft mir weiter. hast du sowas schonmal umgesetzt? oder jemand anders, der mir zumindest mal seine UART initialisierung zeigt..
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
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.