www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme beim DMX Empfang


Autor: Stefan Gerber (gerberstefan)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Gerber (gerberstefan)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hatte eigentlich den code schon angehängt
merkwürdig :)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du noch andere Interrupts laufen?

Autor: Stefan Gerber (gerberstefan)
Datum:

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

Autor: Mikki Merten (mmerten)
Datum:

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

Autor: Stefan Gerber (gerberstefan)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.
// Erst Status, dann Daten lesen
USART_State = UCSR1A;
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

Autor: Stefan Gerber (gerberstefan)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Gerber (gerberstefan)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Henne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Henne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.