Probleme beim DMX Empfang

OP #1190337
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
#1190956
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
OP #1191374
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
OP #1191892
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
Gast #1192134
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
Gast #1192147
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

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