Forum: Mikrocontroller und Digitale Elektronik Probleme beim DMX Empfang


von Stefan G. (gerberstefan)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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.

von Stefan G. (gerberstefan)


Angehängte Dateien:

Lesenswert?

hatte eigentlich den code schon angehängt
merkwürdig :)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Hast du noch andere Interrupts laufen?

von Stefan G. (gerberstefan)


Lesenswert?

ich hatte mal noch einen für ne Soft PWM aber den habe ich auch schon 
deaktiviert und das Problem besteht immernoch

von Mikki M. (mmerten)


Lesenswert?

Prüfe doch zusätzlich das DataOverrun Bit ab. Falls dieses "1" wird, 
wird der RXC Interrupt nicht schnell genug bedient.

von Stefan G. (gerberstefan)


Lesenswert?

Ok danke das werde ich mal versuchen
Die Routine müsste ja sonst so stimmen oder?

von Falk B. (falk)


Lesenswert?

@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

von Stefan G. (gerberstefan)


Lesenswert?

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

von Stefan G. (gerberstefan)


Lesenswert?

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

von Henne (Gast)


Lesenswert?

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

von Henne (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.