Hallo, ich habe eine DMX-Empfangsroutine Programmiert und habe damit folgendes Problem: Es verschieben sich die emfangenen Bytes z.B. Byte 510 = 127 Byte 511 = 100 wenn ich jetzt das Byte 510 auf einen Port lege kriege ich ab und zu Das 511. byte Das Problem tritt auch auf wenn ich dabei bin einen wert zu ändern. Woran könnte das liegen? Danke
> Woran könnte das liegen?
Daran, dass du Bytes verlierst?
Ich tippe einfach mal blind auf einen Fehler in Zeile 42 ;-)
Poste doch den Code zu deinem Problem,
dann wird aus dem Raten vielleicht ein Rat.
ich hatte mal noch einen für ne Soft PWM aber den habe ich auch schon deaktiviert und das Problem besteht immernoch
Prüfe doch zusätzlich das DataOverrun Bit ab. Falls dieses "1" wird, wird der RXC Interrupt nicht schnell genug bedient.
Ok danke das werde ich mal versuchen Die Routine müsste ja sonst so stimmen oder?
@Stefan Gerber (gerberstefan)
>Die Routine müsste ja sonst so stimmen oder?
Nein, die Reihenfolge des Lesens von UDR1 und UCSR1A ist falsch! Erst
Status lesen, dann Daten, siehe Datenblatt.
1 | // Erst Status, dann Daten lesen
|
2 | USART_State = UCSR1A; |
3 | RX_Byte = UDR1; |
Ausserdem sind noch weiter eUngereihmtheiten nud Fehler drin > UCSR1A &= ~(1<<FE); // Framing error zurücksetzen Kannst du gar nicht >// Break oder Framing Error?? >if (DMX_State == DMX_BREAK) > { das hat so nicht hin, dass muss in einen else Zweig der obigen if Abfrage. Ein Beispiel das funktioniert gibts hier. Beitrag "DMX512 Empfänger mit Relaisansteuerung für 20 Kanäle" MFG Falk
So jetzt sieht das ganze so aus: // DMX Empfang interrupt [USART1_RXC] void usart1_rx_isr(void) { // Variablen unsigned char USART_State; unsigned char RX_Byte; // Datenzuweisung USART_State = UCSR1A; RX_Byte = UDR1; // Framing error aka Break erkannt? if (USART_State &(1<<FE)) { if (RX_Byte == 0) { DMX_Data_Count = 0; // Zähler auf erstes Byte } else { DMX_Data_Count ++; // Inkrement DMX Zähler } } else { // Daten lesen DMX_Data[DMX_Data_Count]= RX_Byte; // DMX Werte Speichern DMX_Data_Count ++; // Inkrement DMX Zähler } } und es funktioniert :) Danke euch
Was mir allerdings noch aufgefallen ist, ist wenn ich den Interrupt meiner Soft PWM wieder aktiviere tritt das gleich Problem wieder auf. Hat jemand sowas schon mal DMX empfang und Soft PWM auf einem controller ralisiert? Hier wird wahrscheinlich durch den Interrupt der Soft PWM das Empfangen unterbrochen. Wenn ich allerdings während der Zeit des Empfanges die Interrupts deaktiviere bekomme ich ja nur müll auf der Soft PWM
Ich setze häufig das FE-Flag zurück, da sonst öfters der Simulator das Bit nicht automatisch zurückgesetzt hat. Kann sein, dass sich dies inzwischen erledigt hat - es hat aber auch nie geschadet... Eine ausreichend präzise PWM parallel zur DMX-FSM ist problemlos möglich - ich mache da ganz andere Dinge nebenbei... Überlege Dir nur, wann Du das PWM-Array zu refreshen hast. Die Prüfung des Breaks auf Null ist an sich eine gute Idee und wurde von mir vor ein paar Jahren auch zeitweilig implementiert. Leider kamen danach häufig Beschwerden, dass die FSM mit einigen Dongles nicht mehr stabil oder überhaupt nicht arbeiten würde... Viel Erfolg, Hendrik
BTW: @Falk: Beim Überfliegen Deiner Version entdecke ich keine Auswertung des Startbytes. Dies sollte seit DMX512A nicht mehr zulässig sein. Bei Bedarf kannst Du Dich gern meine Lib nutzen - wenn Du noch eine us rauskitzeln kannst oder sie hübscher machen kannst, wäre ich Dir stets dankbar :-) Alles Gute, Hendrik
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.