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


von Stefan H. (dj-duck)


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

von Stefan H. (dj-duck)


Lesenswert?

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

von Uboot- S. (uboot-stocki)


Lesenswert?

Hi,

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

Gruß

Andreas

von Hannes (Gast)


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?


von Stefan H. (dj-duck)


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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


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 ;-) )

von Stefan H. (dj-duck)


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?!

von Falk B. (falk)


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

von Stefan H. (dj-duck)


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

von Falk B. (falk)


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

von Stefan H. (dj-duck)


Lesenswert?

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

von Falk B. (falk)


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

von Sven (Gast)


Lesenswert?

@Stefan:

Wie wäre es hiermit:

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

Gruß Sven

von Falk B. (falk)


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

von Sven (Gast)


Lesenswert?

@ Falk + Stefan:

Einen habe ich noch:

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

Gruß Sven

von Sven (Gast)


Lesenswert?

ps.: das ist jetzt auch in C ;-)

von Rene Biemans (Gast)


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

von K. B. (kbf)


Lesenswert?

Soweit ich weiss gibts auch ne AN von Microchip zu diesem Thema.


MfG
Karsten

von Stefan H. (dj-duck)


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.

von Michael Wilhelm (Gast)


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

von K. B. (kbf)


Lesenswert?

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

Hab auch nur mit Google gesucht.


MfG
Karsten

von B. J. (bjue)


Lesenswert?

Ist vielleicht auch interessant:
http://www.elv.de/output/controller.aspx?cid=74&detail=10&detail2=9474
Auch mal in die Bauanleitung schauen...

von Sven S. (stepp64) Benutzerseite


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.
1
;-----------------------------------------------------------------------
2
;immer wenn ein DMX-Datenbyte über die ser.SS empfangen wurde, lößt der
3
;USART einen Interupt aus. 
4
;In dieser Routine wird der DMX Datenstrom verarbeitet und die uns interessierenden
5
;8 Kanalwerte werden in den RAM kopiert. 
6
IH_Check_USART
7
  bcf   PIR1,RCIF      ;UART Interupt Flag löschen
8
      
9
IH_Check_HW_Overrun
10
  btfss   RCSTA,OERR        ;wurde ein HW Überlauf entdeckt?
11
  goto   IH_Check_9th_bit  ;Nein, nächster Test
12
    bcf    RCSTA,CREN          ;Ja, UART rücksetzen
13
    bsf    RCSTA,CREN          ;
14
  bsf    Data_Error_LED    ;DMX Error LED einschalten
15
    bsf    Dflag,dmx_error     ;DMX-Error-Flag einschalten
16
17
IH_Check_9th_bit
18
  clrf  IH_Timer_Count    ;löschen des Timer counters
19
  btfss   RCSTA,RX9D      ;Ist das 9. Daten-Bit=0? (Breaksignal)
20
  goto   IH_Wait_Break    ;Ja, dann starte den Zustandsautomaten
21
22
IH_Check_SW_Overrun        ;nein, also wurden Daten empfangen
23
  btfss   RCSTA,FERR           ;Wurde ein Framing Error entdeckt?
24
  goto    IH_Test_Flags    ;Nein, dann zum Test der Flags
25
  bcf     RCSTA,CREN          ;Ja, resette UART
26
    bsf     RCSTA,CREN          ;
27
  bsf    Data_Error_LED    ;DMX Error LED einschalten
28
  bsf    Dflag,dmx_error    ;DMX-Error-Flag einschalten
29
30
IH_Test_Flags
31
  btfsc   Iflag,Valid_Channel    ;Test ob schon Kanaldaten empfangen wurden
32
  goto  IH_Valid_Channel    ;Ja, dann nächsten Kanal empfangen
33
  btfsc  Iflag,Start_Detected  ;Test ob schon das Startbyte empfangen wurde
34
  goto  IH_Wait_Channel      ;Ja, dann warte auf die Kanaldaten
35
  btfsc  Iflag,Break_Detected  ;Test ob schon ein Break empfangen wurde
36
  goto  IH_Wait_Start      ;Ja, dann warte auf das Startbyte
37
38
IH_Wait_Break
39
  clrf  Iflag          ;lösche Iflag
40
  movfw  RCREG          ;empfangenes Datenbyte nach W
41
  btfsc  RCSTA,RX9D        ;wurde ein Break empfangen?
42
  goto  IH_Interrupt_Poll    ;Nein, Break nicht empfangen
43
44
  btfsc  STATUS,Z        ;Ja, war das Byte auch 0?
45
  bsf   Iflag,Break_Detected  ;Ja, dann Flag Break_Detected einschalten
46
  goto  IH_Interrupt_Poll    ;und auf das nächste Byte warten
47
48
IH_Wait_Start
49
  clrf  IH_Channels_Recieved  ;lösche Zähler für Anzahl empfangener Kanalwerte
50
  clrf  IH_Channel_Count_L    ;lösche Kanalnummerzähler
51
  bsf    Iflag,Start_Detected  ;Flag für Start Byte gefunden einschalten 
52
53
  movfw  RCREG          ;Ist der Startcode = 0?
54
  btfss  STATUS,Z        ;
55
  clrf  Iflag          ;wenn nicht, dann löschen die Flags und warte auf den nächsten DMX-Break
56
  goto  IH_Interrupt_Poll    ;Ja, dann warten auf das 1. Byte
57
58
IH_Wait_Channel            ;auf das erste Byte warten, welches der DMX-Startadresse entspricht 
59
  movfw  RCREG          ;empfangenes Byte nach IH_Temp sichern
60
  movwf  IH_Temp
61
  incf  IH_Channel_Count_L,f  ;inkrementiere channel count
62
63
  movfw  IH_Channel_Count_L    ;Vergleiche IH_Channel_count_L mit der 
64
  xorwf  DMX_Start_Addr_L,w    ;DMX-Start Adresse
65
  btfss  STATUS,Z        ;wenn ungleich, dann weiter warten
66
  goto  IH_Interrupt_Poll
67
68
  bsf    Iflag,Valid_Channel    ;wenn gleich, dann setze Flag Valid_Channel    
69
  movfw  IH_Temp
70
  movwf  MessK0L          ;und speichere empfangenen Wert im ersten Kanal
71
  incf  IH_Channels_Recieved,f  ;den Counter erhöhen
72
  goto  IH_Interrupt_Poll
73
74
IH_Valid_Channel          ;alle weiteren 7 Bytes werden hier verarbeitet
75
  movlw  MessK0L          ;Adresse von MessK0L laden
76
  addwf  IH_Channels_Recieved,w  ;den Offset hinzuaddieren
77
  movwf  FSR            ;und in FSR speichern
78
  movfw  RCREG          ;empfangenes Byte in das entsprechende Kanalbyte kopieren   
79
  movwf  INDF          
80
81
  incf  IH_Channels_Recieved,f  ;Counter erhöhen
82
  btfss  IH_Channels_Recieved,3  ;sind 8 Werte empfangen wurden? 
83
  goto  IH_Interrupt_Poll    ;Nein, dann auf das nächste Byte warten
84
    
85
  clrf  Iflag          ;Ja, dann Flags löschen und auf das nächste DMX-Break warten
86
  bsf    Dflag,DMX_Data      ;neue DMX-Daten empfangen
87
  bcf    Data_Error_LED      ;lösche DMX Error LED
88
  goto   IH_Interrupt_Poll        
89
90
;----------------------------------------------------------------------------

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.

von Stefan H. (dj-duck)


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!

von Falk B. (falk)


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

von Stefan H. (dj-duck)


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??!

von Sven S. (stepp64) Benutzerseite


Lesenswert?

1
;UART initialisieren
2
  Bank1
3
    movlw   .3
4
    movwf   SPBRG    ;Datenrate=250000 Bit/s
5
    bsf     TXSTA,BRGH  ;Hohe Datenrate
6
    bcf     TXSTA,SYNC  ;asynchroner Modus
7
    Bank0
8
    bsf     RCSTA,RX9  ;Bit9 wird mit ausgewertet
9
    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.

von Stefan H. (dj-duck)


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

von Sven S. (stepp64) Benutzerseite


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

von Michael Wilhelm (Gast)


Lesenswert?

>und das neunte Dantenbit ist auch durchgängig Null ...

DMX lebt von 2 Stoppbits und nicht von 9 Datenbits.

MW

von Falk B. (falk)


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

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.