www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DMX - Empfängerbau mit PIC - erste Schritte


Autor: Stefan Hänsch (dj-duck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich bin rellativ neu hier im Forum und habe grade ein bißchen gestöbert. 
Leider hab ich nicht so wirklich das gefunden, was ich suche.
Ich habe mir ein EasyPic4 von MicroE zugelegt und würde nun gerne mal 
einen DMX-Empfänger auf nem PIC programmieren. Aber ich stehe da leider 
noch ein bisserl wie der Ochs vorm Berge.

Wie implementiere ich den DMX-Empfang am Besten auf dem PIC. Kann ich 
dafür nen Usart nutzen oder muß ich das von Hand mit Timern machen? Bin 
da für jeden Hinweis dankbar! Wenn jemand Beispielquelltexte für mich 
hat, wäre das echt super!!!

Beste Grüße

Autor: Stefan Hänsch (dj-duck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schade ... schade ... schaut ja nicht gut aus für meinen Thread.
Vielleicht wirds ja über den Tag noch was ...

Autor: Uboot- Stocki (uboot-stocki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

was ist denn ein "DMX-Empfänger" ????

Gruß

Andreas

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DMX ist doch im Prinzip nix anderes als RS485.
Also ist UART wohl die beste Wahl :-)

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Stefan Hänsch (dj-duck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Uboot-Stocki
Sorry ich habs vielleicht nicht richtig ausgedrückt. Ich möchte ganz 
gerne das DMX-Protokoll, mit Hilfe von einem PIC-Mikrocontroller 
dekodieren, um dann andere Sachen ansteuern zu können (Dimmer, Servos, 
etc)

@Tracelrec
Die Seite hab ich schon gesehen, leider gehts da mehr um AVRs als um 
PICs und mit denen kenn ich nu leider nicht so aus.

Aber trotzdem erstmal DANKE

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja - es stehen halt wichtige Details dort, gerade was die Beschreibung 
der UART-Nutzung angeht. Das ist sicher auch auf PICs übertragbar (oder 
dur lernst schnell mal AVR ;-) )

Autor: Stefan Hänsch (dj-duck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na ich merke schon hier spalten sich die Geister in PIC und AVR :-) 
Werde mir das auf jeden fall mal durchlesen  und komme dann gerne 
nochmal drauf zurück, wenn ich da fragen hab.

Gibts denn sonst noch irgendwelche Seiten im Netz, die vielleicht direkt 
nen PIC zum Empfangen benutzen?!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Stefan Hänsch (dj-duck)

>Gibts denn sonst noch irgendwelche Seiten im Netz, die vielleicht direkt
>nen PIC zum Empfangen benutzen?!

Ist doch vollkommen eagl. DMX ist simpel.

http://www.soundlight.de/techtips/dmx512/dmx512.htm
http://dworkin-dmx.de/

MfG
Falk

Autor: Stefan Hänsch (dj-duck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm ... die Links sind ja so ganz nett - also wie das Protokoll aufgebaut 
ist weiß ich genau.
Mit fehlt nur noch die zündende Idee zur Implementierung. Brauche 
einfach mal n Beispielquelltext

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Stefan Hänsch (dj-duck)

>Mit fehlt nur noch die zündende Idee zur Implementierung. Brauche
>einfach mal n Beispielquelltext

Im Prinzip so.

RS232 mit UART im Interrupt empfangen.

Wenn Zeichen ==0 und Frame Error (Stop Bit =0) -> Break, Zähler 
rücksetzen
Wenn keine Frame Error -> empfangenes Byte speicher in einem Array
   my_array[zähler]=UART_Data
  Zähler +1

Thats it. Mit den Daten im Array kanst du machen was du willst.

MfG
Falk

Autor: Stefan Hänsch (dj-duck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na damit kann ich schon eher was anfangen!
Das probier ich mal ...
hast du so was schon mal ausprobiert - also eigene Projekte?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Stefan Hänsch (dj-duck)

>hast du so was schon mal ausprobiert - also eigene Projekte?

Bin ich gearde dabei. Ne LED Matrix 9x9 RGB LEDs, voll dimmbar. 
Allerdings nicht mit PIC sondern FPGA. Die Simulation läuft perfekt. In 
ein paar Tagen kommt mein Board und meine Bauteile. Dann wirds ernst ;-)

MFG
Falk

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Stefan:

Wie wäre es hiermit:

http://www.renebiemans.nl/page.php?al=dmx

Gruß Sven

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Sven (Gast)

>http://www.renebiemans.nl/page.php?al=dmx

Uhhhh, ich weiss nicht was gruseliger ist. Das Holländisch oder PIC 
Assembler ;-)

SCNR
Falk

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Falk + Stefan:

Einen habe ich noch:

http://www.davidbuckley.name/ddim16/

Gruß Sven

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ps.: das ist jetzt auch in C ;-)

Autor: Rene Biemans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das tutorial uber DMX an 
http://www.renebiemans.nl/page.php?al=dmx gemacht. Wann er fragen het 
könten Sie vragen erstellen an info[at]renebiemans.nl Ich kann Englisch, 
Niederlandisch und ein klein bitchen Deutch.

GrüBen aus den Niederlanden,
Rene Biemans

Autor: K. B. (kbf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soweit ich weiss gibts auch ne AN von Microchip zu diesem Thema.


MfG
Karsten

Autor: Stefan Hänsch (dj-duck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal vielen Dank für die zahlreichen Antworten... nächstes Wochenende 
werde ich  mich da mal durcharbeiten.

@K.B. weißt du da was genaueres? Da hab ich nämlich bisher noch nichts 
passendes gefunden.

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, das wichtigste hat Falk ja schon geschrieben.

Wenn ein Framing Error detektiert wird, war das das Break. Typisch >= 
88µs. Danach folgt das Mark after Break (>= 8 µs). Dann, sehr wichtig, 
das Startbyte; das muss den Wert 0 haben. Und dann kommen die Daten von 
mindestens einem Kanal bis max. 512 Kanäle. Üblicherweise musst du auf 
deinem Board aber noch ein Mäuseklavier, oder aber besser, 3 
BCD-Schalter haben, die die Startadresse deines Gerätes setzen.

Wichtig: 250000 Baud 8N2 ohne Parity

Fast vergessen: immer das Data Overrun-Flag abfragen. Wenn das gesetzt 
ist hast du ein Datum verpasst. Dann kannst du Kaffe trinken gehen, bis 
der nächste FE-Fehler kommt und dann den Zähler neu aufsetzen.


Ich denke mal die PICs werden eine ähnliche Funktionalität haben wie die 
AVRs.

MW

Autor: K. B. (kbf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So bitteschön:
http://ww1.microchip.com/downloads/en/AppNotes/01076A.pdf

Hab auch nur mit Google gesucht.


MfG
Karsten

Autor: B. Jue (bjue)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist vielleicht auch interessant:
http://www.elv.de/output/controller.aspx?cid=74&de...
Auch mal in die Bauanleitung schauen...

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

anbei mal der Ausschnitt aus meinem DMX-8-Kanal-Lichteffektgerät in 
welchem das DMX Protokoll dekodiert wird (für PICs). Ist eigentlich 
verständlich, wenn man eine Weile drüber nachdenkt. Wenn Interesse 
besteht, kann ich das komplette Programm (mehrere 1000 Prog.Zeilen) und 
den Schaltplan hier posten. Ist allerdings ein recht Umfangreiches 
Projekt gewesen.
;-----------------------------------------------------------------------
;immer wenn ein DMX-Datenbyte über die ser.SS empfangen wurde, lößt der
;USART einen Interupt aus. 
;In dieser Routine wird der DMX Datenstrom verarbeitet und die uns interessierenden
;8 Kanalwerte werden in den RAM kopiert. 
IH_Check_USART
  bcf   PIR1,RCIF      ;UART Interupt Flag löschen
      
IH_Check_HW_Overrun
  btfss   RCSTA,OERR        ;wurde ein HW Überlauf entdeckt?
  goto   IH_Check_9th_bit  ;Nein, nächster Test
    bcf    RCSTA,CREN          ;Ja, UART rücksetzen
    bsf    RCSTA,CREN          ;
  bsf    Data_Error_LED    ;DMX Error LED einschalten
    bsf    Dflag,dmx_error     ;DMX-Error-Flag einschalten

IH_Check_9th_bit
  clrf  IH_Timer_Count    ;löschen des Timer counters
  btfss   RCSTA,RX9D      ;Ist das 9. Daten-Bit=0? (Breaksignal)
  goto   IH_Wait_Break    ;Ja, dann starte den Zustandsautomaten

IH_Check_SW_Overrun        ;nein, also wurden Daten empfangen
  btfss   RCSTA,FERR           ;Wurde ein Framing Error entdeckt?
  goto    IH_Test_Flags    ;Nein, dann zum Test der Flags
  bcf     RCSTA,CREN          ;Ja, resette UART
    bsf     RCSTA,CREN          ;
  bsf    Data_Error_LED    ;DMX Error LED einschalten
  bsf    Dflag,dmx_error    ;DMX-Error-Flag einschalten

IH_Test_Flags
  btfsc   Iflag,Valid_Channel    ;Test ob schon Kanaldaten empfangen wurden
  goto  IH_Valid_Channel    ;Ja, dann nächsten Kanal empfangen
  btfsc  Iflag,Start_Detected  ;Test ob schon das Startbyte empfangen wurde
  goto  IH_Wait_Channel      ;Ja, dann warte auf die Kanaldaten
  btfsc  Iflag,Break_Detected  ;Test ob schon ein Break empfangen wurde
  goto  IH_Wait_Start      ;Ja, dann warte auf das Startbyte

IH_Wait_Break
  clrf  Iflag          ;lösche Iflag
  movfw  RCREG          ;empfangenes Datenbyte nach W
  btfsc  RCSTA,RX9D        ;wurde ein Break empfangen?
  goto  IH_Interrupt_Poll    ;Nein, Break nicht empfangen

  btfsc  STATUS,Z        ;Ja, war das Byte auch 0?
  bsf   Iflag,Break_Detected  ;Ja, dann Flag Break_Detected einschalten
  goto  IH_Interrupt_Poll    ;und auf das nächste Byte warten

IH_Wait_Start
  clrf  IH_Channels_Recieved  ;lösche Zähler für Anzahl empfangener Kanalwerte
  clrf  IH_Channel_Count_L    ;lösche Kanalnummerzähler
  bsf    Iflag,Start_Detected  ;Flag für Start Byte gefunden einschalten 

  movfw  RCREG          ;Ist der Startcode = 0?
  btfss  STATUS,Z        ;
  clrf  Iflag          ;wenn nicht, dann löschen die Flags und warte auf den nächsten DMX-Break
  goto  IH_Interrupt_Poll    ;Ja, dann warten auf das 1. Byte

IH_Wait_Channel            ;auf das erste Byte warten, welches der DMX-Startadresse entspricht 
  movfw  RCREG          ;empfangenes Byte nach IH_Temp sichern
  movwf  IH_Temp
  incf  IH_Channel_Count_L,f  ;inkrementiere channel count

  movfw  IH_Channel_Count_L    ;Vergleiche IH_Channel_count_L mit der 
  xorwf  DMX_Start_Addr_L,w    ;DMX-Start Adresse
  btfss  STATUS,Z        ;wenn ungleich, dann weiter warten
  goto  IH_Interrupt_Poll

  bsf    Iflag,Valid_Channel    ;wenn gleich, dann setze Flag Valid_Channel    
  movfw  IH_Temp
  movwf  MessK0L          ;und speichere empfangenen Wert im ersten Kanal
  incf  IH_Channels_Recieved,f  ;den Counter erhöhen
  goto  IH_Interrupt_Poll

IH_Valid_Channel          ;alle weiteren 7 Bytes werden hier verarbeitet
  movlw  MessK0L          ;Adresse von MessK0L laden
  addwf  IH_Channels_Recieved,w  ;den Offset hinzuaddieren
  movwf  FSR            ;und in FSR speichern
  movfw  RCREG          ;empfangenes Byte in das entsprechende Kanalbyte kopieren   
  movwf  INDF          

  incf  IH_Channels_Recieved,f  ;Counter erhöhen
  btfss  IH_Channels_Recieved,3  ;sind 8 Werte empfangen wurden? 
  goto  IH_Interrupt_Poll    ;Nein, dann auf das nächste Byte warten
    
  clrf  Iflag          ;Ja, dann Flags löschen und auf das nächste DMX-Break warten
  bsf    Dflag,DMX_Data      ;neue DMX-Daten empfangen
  bcf    Data_Error_LED      ;lösche DMX Error LED
  goto   IH_Interrupt_Poll        

;----------------------------------------------------------------------------

Falls noch Fragen sind stehe ich gern zur Verfügung.

Gruß Sven

PS: Ach ja, den DMX-Programmteil fand ich irgendwo im iNet und hab es 
dann auf meine Zwecke angepasst bzw. erweitert.

Autor: Stefan Hänsch (dj-duck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nabend zusammen!

Vielen Dank erstmal allen, die hier gepostet haben. Hab viele 
interessante Ideen bekommen und werde nun versuchen da mal ein bisserl 
was umzusetzen. Hab mir jetzt auch ne Testumgebung gebaut, so dass ich 
direkt testen kann.

Hab da noch mal ne Frage:
Ich will das ganze mit Hilfe des USARTs empfangen. Welche Bautraute muss 
ich da einstellen. Ein Baut ist doch immer ein Symbol, oder? DMX hat 
250K/Bit pro Sekunde - das ist mir klar. Aber wie rechne ich das nun in 
Baut um? Wäre nett, wenn ihr mir da nochmal auf die Sprünge helfen 
könntet.

Danke schon mal im Voraus :-)

Schönen Abend noch!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Stefan Hänsch (dj-duck)

>Ich will das ganze mit Hilfe des USARTs empfangen.

Wie sonst?

> Welche Bautraute muss
>ich da einstellen. Ein Baut ist doch immer ein Symbol, oder?

Baud

> DMX hat 250K/Bit pro Sekunde - das ist mir klar.

= 250kBaud.

MFg
Falk

Autor: Stefan Hänsch (dj-duck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super ... das ging ja mal sehr schnell!!!
Hab da folgende Formel gefunden für nen PIC 16F877A:

Baut-Rate = Fosc / ( 64 * ( x + 1 ))   <-   für den  Low-Speed-Mode
Baut-Rate = Fosc / ( 16 * ( x + 1 ))   <-   für den High-Speed-Mode

Bei nem 8MHz Quarz muss ich also in den HIGH-Speed-Mode wechseln und 
dann das SPBRG = 1 setzen. Ich hoffe das ist korrekt, oder??!

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
;UART initialisieren
  Bank1
    movlw   .3
    movwf   SPBRG    ;Datenrate=250000 Bit/s
    bsf     TXSTA,BRGH  ;Hohe Datenrate
    bcf     TXSTA,SYNC  ;asynchroner Modus
    Bank0
    bsf     RCSTA,RX9  ;Bit9 wird mit ausgewertet
    bsf     RCSTA,CREN  ;keine Pause zwischen den Bytes

Die Formeln hast du ja schon gefunden. Nun musst du nur noch die 
richtigen Werte setzen. Mein PIC läuft mit 16MHz. Hab gerade mal 
nachgerechnet, deine errechneten Werte sind korrekt.

Autor: Stefan Hänsch (dj-duck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also irgendwie bekomme ich nur Framing-Errors und das neunte Dantenbit 
ist auch durchgängig Null ... habt ihr da spontan ne Lösung oder ist 
Euch das vielleicht auch schon mal untergekommen?
Ich glaube irgendwie, daß die Bautrate nicht stimmt, hab aber eigentlich 
alles richtig eingestellt ...

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du eventuell an dem RS485 Treiberchips die beiden Datenleitungen 
vertauscht? Das hatte ich am Anfang auch falsch herum und ständig 
Frameerrors erhalten. Ich hatte in meiner Schaltung den SN75176 
eingesetzt. Die Pins A müssen mit den Pins A der anderen Chips und die 
Pins B mit den Pins B verbunden werden. Sonst fällt mir auch nix weiter 
ein.

Sven

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>und das neunte Dantenbit ist auch durchgängig Null ...

DMX lebt von 2 Stoppbits und nicht von 9 Datenbits.

MW

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Sven Stefan (stepp64)

>Hast du eventuell an dem RS485 Treiberchips die beiden Datenleitungen
>vertauscht? Das hatte ich am Anfang auch falsch herum und ständig
>Frameerrors erhalten. Ich hatte in meiner Schaltung den SN75176

DMX Plus = A
DMX Minus = B

Beitrag "DMX512 Empfänger mit Relaisansteuerung für 20 Kanäle"

MfG
Falk

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.