Forum: Mikrocontroller und Digitale Elektronik Problem DMX Protokoll auszugeben, Atmega8


von Lampe99 (Gast)


Lesenswert?

Hallo,
ich hänge gerade beim Bau meines DMX Pultes.

Das Pult gib schlicht kein Signal aus, das ein DMX empfänger versteht.
Nun ist natürlich die Frage ob es am Programm oder an der Schaltung 
liegt.
Den schaltplan hatte ich bereits in meinem ersten Thread gepostet.
Beitrag "Einsteiger baucht Starthilfe (Lichtpult, ATmega8)"
(danke an Christoph S. für den Tipp mit Pollin ...)
Zum Programm:
Es sollen einfach 6 Fader sein, die 6 DMX-Kanäle ansteuern.
Beim Code will ich es simpel halten und verzichte daher auf interrupts, 
unterprogramme, und den Stackcounter.
Ein ATmega8 wandelt an seinen 6 ADC´s die Spannung, die obersten 8 Bit 
werden in einem register zwischengespeichert und später an den USART 
ausgegeben.
Um den Reset befehl zu geben stelle ich die Baudrate von 250k auf 9600 
Bits/s herunter und sende ein Nullbyte. Die beiden Stoppbits ergeben 
dabei gleich den Mark nach dem reset.
(nach Hendrik Holscher : 
http://www.hoelscher-hi.de/hendrik/light/ressources.htm )
Ich hab es aber auch mit Warteschleifen probiert in denen ich dem USART 
nix zum senden gegeben habe. (was macht der SN 75176BP eigentlich, wenn 
er keine Daten bekommt? Er interpretiert das doch als logisch Null und 
sendet +12V auf seinem Out A oder ?)
Nach der Übertragung meiner 6 Kanäle sende ich durch eine Schleife 
weitere 100 leere Kanäle, damit ein Durchlauf nicht zu kurz wird.

Es würde mir unglaublich helfen, wenn sich das jemand von euch einmal 
ansehen würde. Ich komme hier alleine nicht mehr weiter.

Vielen Dank !



der Code:
1
;UART
2
 ; Baudrate soll 250kBits betragen
3
 ; damit dauert ein Bit 4 us wie für den DMX Standart vorgesehen
4
 ; UBRR = 8M/(16*250k)-1 = 1
5
 ; UBBR = 0b00000001
6
ldi rTemp, 0b00000001
7
out UBRRL, rTemp
8
ldi rTemp, 0b00000000
9
out UBRRH, rTemp
10
11
sbi UCSRB, TXEN ;Uart auf senden stellen
12
13
ldi rTemp, 1<<URSEL | 1<<USBS | 1<<UCSZ1 | 1<<UCSZ0
14
out UCSRC, rTemp
15
;UCSRC, USBS ; 2 Stopbits einstellen
16
;UCSRC, UCSZ1 UCZ0 ;Bits pro byte des zeichens -> 8Bit
17
18
;ADC
19
20
sbi ADCSRA, ADEN ; ADC einschalten
21
22
sbi ADCSRA, ADPS2 ; einstellen des Teilers auf 125kHz durch Teiler=64
23
sbi ADCSRA, ADPS1 ; Das kontrollregister sollte jetzt also etwa so aussehen
24
                  ; ADCSRA= 0b10000110
25
sbi ADMUX, REFS0 ; interne Vcc als Refenzspannung verwenden
26
sbi ADMUX, ADLAR ; die 8 höchstwertigen bits in ADCH ablegen
27
sbi ADCSRA, ADSC  ;erste AD Wandlung vollziehen, weil dauart ja länger
28
; warten bis ADC fertig ist
29
WaitADC0:
30
31
sbic ADCSRA, ADSC
32
rjmp WaitADC0
Die Wandlung vom Kanal 2 als Beispiel
1
sbi ADMUX, MUX0
2
3
;ADC Wandlung starten
4
5
sbi ADCSRA, ADSC
6
7
; warten bis ADC fertig ist
8
WaitADC2:
9
10
sbic ADCSRA, ADSC
11
rjmp WaitADC2
12
13
;die oberen 8 bit aus dem ADC-Werte Register auslesen
14
;und in das entsprechende Kanalregister kopieren
15
ldi rCH2, ADCH
der reset
1
ldi rTemp, 0b00110011 ; 51
2
out UBRRL, rTemp      ; bei 9600 Baud dauert ein Bit 104,2 us
3
4
ldi rTemp, 0x00
5
out UDR, rTemp
6
7
WaitReset:
8
9
sbis UCSRA, UDRE
10
rjmp WaitReset
11
12
ldi rTemp, 0b00000001 ;Baudrate auf 250k zurücksetzen
13
out UBRRL, rTemp
einen Kanal ausgeben
1
out UDR, rCH1
2
3
WaitCH1:
4
5
sbis UCSRA, UDRE
6
rjmp WaitCH1
100 leere Kanäle zum schluss
1
ldi rCounter, 100
2
ldi rTemp, 0
3
4
EndLoop:
5
6
out UDR, rTemp
7
Endloopsub:
8
sbis UCSRA, UDRE
9
rjmp EndLoopsub
10
11
dec rCounter
12
brne EndLoop

von Alex (Gast)


Lesenswert?

Habe den Code kurz überflogen - es scheint als ob du nirgendwo den TXD 
Pin als Ausgang setzt, dann kann es auch nix senden.

Falls es nicht hilft:
Sind die A und B Richtig angeschlossen? (nicht vertauscht).
Hast du die Möglichkeit das Signal irgendwo anzuschauen? (Logic 
Analyzer, Oszi)

von Lampe99 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich hatte die letzten Tage etwas mehr zu tun, deshalb erst jetzt die 
Antwort.

zunächst zu Alex antwort:

"Habe den Code kurz überflogen - es scheint als ob du nirgendwo den TXD
Pin als Ausgang setzt, dann kann es auch nix senden."
habe
sbi UCSRB, TXEN
im Code geschrieben. das reicht doch oder ?

Ich hatte heute die Möglichkeit das ding mal an einen Oszi 
anzuschließen.
besonders aufschlussreich war das ganze aber leider nicht, dafür kenn 
ich mich mit den dingern noch nicht gut genug aus.
Anbei habe ich ein Bild des Signals das mein Pult ausspuckt. Immerhin 
ist so etwas wie eine Signalstruktur zu erkennen.
Ich konnte die 100 leeren Kanäle die nach meinen 6 AD gewandelten 
Kanälen kommen sehen. Bei den einzelnen Worten stehen die Stoppbits im 
richtigen Verhältniss zu den Datenbits und dem Startbit. Also 36 us zu 8 
us. D.h. die Baudrate stimmt (vermutlich) auch.
Eine Sache wunderte mich allerdings: auf dem Bild ist oben ein dicker 
balken zu sehen bei X=0. Dieser stellt wohl meinen Reset dar. allerdings 
befindet er sich auf dem gleichen Spannungsniveau wie die Stoppbits. Die 
sind allerdings logisch 1 während der reset ein NullByte ist.
Das sollte eigentlich nicht sein.
Zuhause habe ich die 100 leeren Kanäle mal auf 255 gesetzt, leider auch 
kein Licht...
Also ich vermute das:
- etwas mit dem reset nicht stimmt (habe es jetzt auch mit 64k Baud 
probiert, auch nix)
- Die Spannungspegel evtl. gar nicht stimmen (hab ich wirklich den 
richtigen bustreiber? sollte ich es mal mit nem anderen probieren. Sind 
die Widerstände am Ausgang sinnvoll oder sinnfrei ?)
- die Kondensatoren am Quarz haben ne recht hohe toleranz, kann das zu 
problemen führen ?

Ein Hoffnungsschimmer: beim Gerät das ich damit ansteuern will(ein 1 
Kanal Handdimmer von Botex namens UP-1) blinkt es jetzt da wo DMX 
steht...

ich wäre euch für ein paar Hypothesen was es denn sein könnte äusserst 
dankbar.
vielleicht kann mir jemand einen Link zu einem Quellcode in Assembler 
geben mit dem es funktioniert oder einen blick auf den Schaltplan 
werfen, ob da was nicht in Ordnung ist bzw. ob sich was vereinfachen 
lässt.

vielen Dank

von Lampe99 (Gast)


Lesenswert?

hat keiner einen Tipp ?
push

von DerBiba (Gast)


Lesenswert?

Hallo Lampe99,

ich bin auch gerad dabei mir so ein Lichtpult zu bauen. Mein Schaltplan 
ist fertig und ich warte jetzt auf die Bauteile. Wollte in der Zeit 
schon mal anfangen zu programmieren. Da ich beim programieren von 
Mikrocontrollern noch nicht so viel Erfahrung habe, hab ich nach 
Beispiele gesuchen und bin hier gelandet.

Kann es vielleicht daran liegen das du die interne Referenzspannung 
nimmst, die ja nur 2,56V beträgt, die analogen Eingänge aber ohne 
Probleme über 2,56V kommen?

Ich wollt das ganze in C schreiben, hast du (oder einer der anderen die 
das hier lesen) einen Tipp für mich?

Schöne Grüße
Der Biba

von Achim M. (minifloat)


Lesenswert?

Im Ersten Post wurde bereits ein Link zu http://www.hoelscher-hi.de 
angegeben, wo man sich Application Notes zu DMX-Senden/-Empfang als pdf 
ansehen kann.
Dabei sind auch Codebeispiele bzw. funktionstüchtige Snippets in "C", 
aus denen man sich locker eine kleine lib schnitzen könnte.

mfg mf

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.