DMX Board geht nicht :/

OP #3192680
Lesenswert?

Hallo allerseits,
ich hab noch recht neu im Elektronikgebiet und habe versucht einfach 
ganz simpel eine Schaltung nachzubauen.

Ich benutze eine ATMega8 und wollte folgende DMX Schaltung nachbauen: 
http://www.ulrichradig.de/home/index.php/avr/atmega8-experimentierboard/avr---dmx

Den ATmega habe ich wie in 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment unter 
"Spannungsversorgung" beschrieben beschaltet. Die Leitung die in der DMX 
Schaltung zu TXD gehen soll liegt am PD1 des ATmega, was laut Datenblatt 
TXD ist.

Der Quelltext ist größtenteils von  Ulrich Radigs Seite übernommen,  der 
ist allerdings auf den ATmega88 ausgelegt.
Ich habe ein paar Änderungen vorgenommen sodass er auf dem Atmega8 
läuft. (zb UBBR0 zu UBBR umgekannt usw). Ausserdem habe ich eine  LED an 
PC5 angeschlossen um zu checken ob sich da überhaupt was tut.

So, die LED blinkt im Sekundentakt, so wie sie soll. Allerdings tut sich 
DMX mäßig nix.

Könnte es vll an der unterschiedliche Taktrate der Prozessoren liegen? 
Dadurch wird für den USART eine anderer Wert bereichnet , da dieser auf 
dem Prozessortakt basiert.

Im Anhang habe ich noch ein Bild meiner Schaltung, vll ist darauf auch 
ein Fehler ersichtlich, obwohl ich das eigentlich gründlich gecheckt 
habe. Links ist die Stromquelle in Form einer 9v Blockbatterie. Rechts 
sind die Ausgänge zu DMX. Schwarz ist GND, Grün +, Rot -.

Danke schonmal für eure Hilfe.

1
#include <avr/interrupt.h>
2
#include <avr/io.h>
3
#include <stdio.h>
4

5
#define F_CPU 1000000
6
#include <util/delay.h>
7

8
#define DMX_BAUD 250000
9
#define DMX_BAUD_BREAK 80000
10

11
volatile unsigned char dmx_buffer[512];
12

13
//############################################################################
14
//DMX Senderoutine
15
ISR (USART_TX_vect)
16
//############################################################################
17
{
18
  static unsigned int  dmx_channel_tx_count = 0;
19
  static unsigned char dmx_tx_state = 0;
20
  unsigned int ubrr;
21
  
22
  switch (dmx_tx_state)
23
  {
24
    case (0):
25
      ubrr   = (F_CPU / (DMX_BAUD_BREAK * 16L) - 1);
26
      
27
      UBRRH = (unsigned char)(ubrr>>8);
28
      UBRRL = (unsigned char)ubrr;
29
      
30
      UDR = 0; //RESET Frame
31
      dmx_tx_state = 1;
32
      break;
33

34
    case (1):
35
      ubrr    = (F_CPU / (DMX_BAUD * 16L) - 1);
36
      UBRRH = (unsigned char)(ubrr>>8);
37
      UBRRL = (unsigned char)ubrr;
38
      UDR = 0; //Start Byte
39
      dmx_tx_state = 2;
40
      break;
41

42
    case (2):
43
      _delay_us(10);
44
      //Ausgabe des Zeichens
45
      UDR = dmx_buffer[dmx_channel_tx_count];
46
      dmx_channel_tx_count++;
47
      
48
      if(dmx_channel_tx_count == 512)
49
      {
50
        dmx_channel_tx_count = 0;
51
        dmx_tx_state = 0;
52
      }
53
      break;
54
  }
55
}
56

57
//############################################################################
58
//Hauptprogramm
59
int main (void) 
60
//############################################################################
61
{  
62
  //Init usart DMX-BUS
63
  unsigned int ubrr = (F_CPU / (DMX_BAUD * 16L) - 1);
64
  
65
  UBRRH = (unsigned char)(ubrr>>8);
66
  UBRRL = (unsigned char)ubrr;
67
  
68
  DDRD |= (1<<PD1); //Output TXD Pin ATmega88
69
  UCSRB|=(1<<TXEN)|(1<<TXCIE); // TXEN0 Transmitter enable / TXCIE0 TX complete interrupt enable 
70
  UCSRC|=(1<<USBS); //USBS0 2 Stop bits  
71
  sei();//Globale Interrupts Enable
72
  UDR = 0;//Start DMX
73
  
74
  DDRC  |= (1<<PC5);
75
  //Endlosschleife
76
  while(1)
77
  {  dmx_buffer[24]=255;
78
    dmx_buffer[25]=255;
79
    dmx_buffer[26]=255;
80
    dmx_buffer[27]=255;
81
    PORTC |=(1<<PC5);
82
    _delay_ms(1000);
83
    dmx_buffer[24]=0;
84
    dmx_buffer[25]=0;
85
    dmx_buffer[26]=0;
86
    dmx_buffer[27]=0;
87
    PORTC &=~(1<<PC5);
88
    _delay_ms(1000);
89
    
90
  }
91
}
Angehängte Dateien:
Gast #3192705
Lesenswert?

Die Software habe ich mir jetzt nicht angeschaut, aber die Hardware.
Ohne Kondensator zwischen VCC und GND und ohne externen Quarz(inklusive 
passenden Kondensatoren) bekommst Du keine Übertragungsrate von 250kB/s 
hin. Der interne Oszillator ist dafür viiiiel zu ungenau.
Womit wird die Schaltung eigentlich angesteuert?
#3192729
Lesenswert?

@ Thomas T. (thomas_t39)

>    20130605_200323.jpg
>    2,9 MB, 9 Downloads

HD ist zwar zeitgemäß, aber für so ein Bild reichen locker 500kB. Siehe 
Bildformate.

>Ich benutze eine ATMega8 und wollte folgende DMX Schaltung nachbauen:
>http://www.ulrichradig.de/home/index.php/avr/atmeg...

Es fehlen die Entkoppelkondensatoren NAH an den ICs.

http://www.mikrocontroller.net/articles/Kondensator#Entkoppelkondensator

>http://www.mikrocontroller.net/articles/AVR-Tutori... unter
>"Spannungsversorgung" beschrieben beschaltet.

Nö, siehe oben.

>Ich habe ein paar Änderungen vorgenommen sodass er auf dem Atmega8
>läuft. (zb UBBR0 zu UBBR umgekannt usw). Ausserdem habe ich eine  LED an
>PC5 angeschlossen um zu checken ob sich da überhaupt was tut.

DMX mit 1 MHz Takt? Eher nicht. Man braucht mindestens 4 MHz für den 
UART. Und die sollten von einem Quarz kommen.
Gast #3192745
Lesenswert?

Im Datenblatt des ATmega88 (ab S.195) sind mögliche Übertragungsraten 
des Controllers in Abhängigkeit der Taktfrequenz angegeben. Du benötigst 
eine Übertragungsrate von 250kBit/s. Jetzt musst Du schauen bei welcher 
Taktfrequenz der Fehler möglichst 0% beträgt (...ja, ich weiß, dass 
andere Frequenzen auch möglich sind...). In deinem Fall wären dass 
mindestens 2MHz. Aber wenn Du irgendwann "mehr" mit der Schaltung machen 
möchtest, würde ich eine höhere Frequenz empfehlen. Nimm einfach 16MHz, 
dann wirst Du nicht unglücklich ( ich denke nicht, dass Dich der minimal 
höhere Stromverbrauch des Contollers interessiert).

Ich meinte eher, was steuerst Du damit an?
Gast #3192767
Lesenswert?

Mit Oszillatoren habe ich noch nie gearbeitet. Daher würde ich Dir eher 
das hier empfehlen:
http://www.reichelt.de/Quarze/16-0000-HC49U-S/3/index.html?;ACTION=3;LA=2;ARTICLE=32852;GROUPID=3173;artnr=16%2C0000-HC49U-S

und dazu zwei mal:
http://www.reichelt.de/Quarze/16-0000-HC49U-S/3/index.html?;ACTION=3;LA=2;ARTICLE=32852;GROUPID=3173;artnr=16%2C0000-HC49U-S

Das ganze dann wie aus Seite 32 verschalten (möglichst nah am 
Controller).
Und zwischen VCC und Ground des Controllers auch noch einen 100nF 
Kondensator.
OP #3193605
Lesenswert?

Noch eine Frage zu den Koppelkondensatoren.

die 75176 BP hat ja 3 VCC und einen GND anschluss. Versteh ich das 
richtig. dass ich in dem Fall 3 Koppelkondesatoren brauch? Also einer 
zwischen den jeweiligen VCC's und dem gemeinsamen GND?

Und wie siehts beim ATmega aus. Braucht der ebenfalls einen?

Gruß
#3193622
Lesenswert?

@ Thomas T. (thomas_t39)

>die 75176 BP hat ja 3 VCC und einen GND anschluss.

Bitte? Meiner hat nur 1x VCC an in 8 und GND an Pin 5. Der Rest sind 
Signale.

>Und wie siehts beim ATmega aus. Braucht der ebenfalls einen?

Was verstehst du an dem Satz nicht?

"Jeder Digitalschaltkreis benötigt einen 100nF Keramikkondensator nah 
(kleiner 20mm) an den Anschlüssen von VCC und GND."
Gast #3193635
Lesenswert?

Thomas T. schrieb:
> die 75176 BP hat ja 3 VCC und einen GND anschluss.

Nein. Lies mal das Datenblatt. 
http://www.produktinfo.conrad.com/datenblaetter/150000-174999/152828-da-01-en-SN_75176_BP.pdf
Wo siehst du da 3 Vcc? Ich sehe da ein VCC und ein GND. Dazwischen 
gehören so nah wie möglich (!) 100nF. Ab 2cm Distanz kannst du ihn auch 
weglassen den Kondensator.

Thomas T. schrieb:
> Versteh ich das
> richtig. dass ich in dem Fall 3 Koppelkondesatoren brauch?

Nein. Einen.

Thomas T. schrieb:
> Also einer
> zwischen den jeweiligen VCC's und dem gemeinsamen GND?

Ja richtig. Nur gibt es nur ein Vcc GND Pärchen hier.

Thomas T. schrieb:
> Und wie siehts beim ATmega aus. Braucht der ebenfalls einen?

Der braucht ihn noch viel mehr als der Schnittstellentreiber. Für den 
wurde der Kondensator auch vorgeschlagen.

Merke: An JEDES (absolut jedes) Vcc-GND-Pärchen gehört mindestens ein 
Kondensator mit 100nF (=0.1µF) ran. Immer. Bei kritischerern 
Bauelementen (Highspeed, etc. und nein das hier ist kein Highspeed) 
gehören zusätzlich parallel dazu 10nF.
Moderator (Firma: Titel) Persönliche Seite #3193713
Lesenswert?

Falk Brunner schrieb:
> Willst du das Universum in eine endlose Rekursionsschleife stürzen? 8-0
Mir gefällt deshalb die englische Originalausgabe vom K&R so gut: dort 
steht auf den Seite 46, 79 und 152 was zum Thema Rekursion. Und auf der 
Seite 245 findet sich im Stichwortverzeichnis der Eintrag:
recursion 46, 79, 152, 245


(Seitenzahlen hier nur beispielhaft)
OP #3196930
Lesenswert?

Sooo kann es sein dass ich meinen AVR geschrottet habe? Ich hab wohl was 
falsches an den Fuse Bits gemacht.

Mit diesem Tool: 
http://www.frank-zhao.com/fusecalc/fusecalc.php?chip=atmega8
Wollte ich alle 4 CKSEL bits auf 4 setzen um den Quarz zu aktivieren. 
Hab die Fuses ausgelesen HIGH = 0xD9 LOW = 0xE1, in das programm 
eingetragen. Bei allen vier CKSEL einen Haken gemacht und dann das 
resultiernde HIGH = 0xD9 LOW = 0xE0, wieder in den AVR geschrieben. 
Seitdem kommt. Bei meinem AVR 6 Studio "Unable to enter programming 
mode" sobald ich etwas vom AVR auslesen will.
Als Board benutze ich das Ding: 
http://shop.embedded-projects.net/index.php?module=artikel&action=artikel&id=108

Ist da noch was zu retten?

Gruß
OP #3196962
Lesenswert?

Die einzige Änderung die ich gemacht habe ist dass ich einen Haken bei 
CKSEL3 gemacht habe, der rest blieb unverändert. Deshalb seh ich nicht 
wo das problem ist.
Das Programmierboard hat ebenfalls einen Externen Quarz wenn ich das 
richtig sehe, deshalb sollte es doch gehen oder nicht?
OP #3197048
Lesenswert?

So nächstes Problem. Ich habe jetzt auf den Atmega88 umgestellt.

Laut diesem Code sollte die LED auf dem Testboard jede Sekunde blinken. 
(Im Code ist F_CPU mit 16.000.000 definiert, da auf meinem Board auf dem 
der AVR laufen soll der 16mhz Quarz ist. Auf dem Testboard ist 
allerdings nur ein 8 mhz Quarz d.h. die LED müsste halb so schnell sein 
richtig?)

Die Fuses sind: LOW: 0x6F HIGH: 0xDF EXTENDED: 0xF9

Ich habe mir diesen Quarz gekauft: 
http://www.reichelt.de/Quarze/16-0000-HC49U-S/3/index.html?;ACTION=3;LA=2;ARTICLE=32852;GROUPID=3173;artnr=16%2C0000-HC49U-S

Ich habe die Fuses so gesetzt, dass der Quarz als Low power crystal 
oscillator gesehen wird, allerdings gibt es laut Datenblatt noch "Full 
swing crystal oscillator " und "Low frequency crystal oscillator". Wie 
erkenne ich was genau der Quarz ist?

Momenten ist die LED ca 20 sek lang an, dann wieder 20 Sek aus.

Hier noch der Code.
1
#include <avr/interrupt.h>
2
#include <avr/io.h>
3
#include <stdio.h>
4

5
#define F_CPU 16000000
6
#include <util/delay.h>
7

8
#define DMX_BAUD 250000
9
#define DMX_BAUD_BREAK 80000
10

11
volatile unsigned char dmx_buffer[512];
12

13
//############################################################################
14
//DMX Senderoutine
15
ISR (USART_TX_vect)
16
//############################################################################
17
{
18
  static unsigned int  dmx_channel_tx_count = 0;
19
  static unsigned char dmx_tx_state = 0;
20
  
21
  switch (dmx_tx_state)
22
  {
23
    case (0):
24
    UBRR0   = (F_CPU / (DMX_BAUD_BREAK * 16L) - 1);
25
    UDR0 = 0; //RESET Frame
26
    dmx_tx_state = 1;
27
    break;
28

29
    case (1):
30
    UBRR0   = (F_CPU / (DMX_BAUD * 16L) - 1);
31
    UDR0 = 0; //Start Byte
32
    dmx_tx_state = 2;
33
    break;
34

35
    case (2):
36
    _delay_us(10);
37
    //Ausgabe des Zeichens
38
    UDR0 = dmx_buffer[dmx_channel_tx_count];
39
    dmx_channel_tx_count++;
40
    
41
    if(dmx_channel_tx_count == 512)
42
    {
43
      dmx_channel_tx_count = 0;
44
      dmx_tx_state = 0;
45
    }
46
    break;
47
  }
48
}
49

50
//############################################################################
51
//Hauptprogramm
52
int main (void)
53
//############################################################################
54
{
55
  //Init usart DMX-BUS
56
  UBRR0   = (F_CPU / (DMX_BAUD * 16L) - 1);
57
  DDRD |= (1<<PD1); //Output TXD Pin ATmega88
58
  UCSR0B|=(1<<TXEN0)|(1<<TXCIE0); // TXEN0 Transmitter enable / TXCIE0 TX complete interrupt enable
59
  UCSR0C|=(1<<USBS0); //USBS0 2 Stop bits
60
  sei();//Globale Interrupts Enable
61
  UDR0 = 0;//Start DMX
62
  
63
  DDRC  |= (1<<PC5);
64
  //Endlosschleife
65
  while(1)
66
  {  dmx_buffer[24]=255;
67
    dmx_buffer[25]=255;
68
    dmx_buffer[26]=255;
69
    dmx_buffer[27]=255;
70
    PORTC |=(1<<PC5);
71
    _delay_ms(1000);
72
    dmx_buffer[24]=0;
73
    dmx_buffer[25]=0;
74
    dmx_buffer[26]=0;
75
    dmx_buffer[27]=0;
76
    PORTC &=~(1<<PC5);
77
    _delay_ms(1000);
78
    
79
  }
80
}

Gruß
#3197061
Lesenswert?

@ Thomas T. (thomas_t39)

>Die Fuses sind: LOW: 0x6F HIGH: 0xDF EXTENDED: 0xF9

>Ich habe mir diesen Quarz gekauft:
>http://www.reichelt.de/Quarze/16-0000-HC49U-S/3/in...

Ist OK.

>Ich habe die Fuses so gesetzt, dass der Quarz als Low power crystal
>oscillator gesehen wird,

Bei 16 MHz? Eher nicht.

> allerdings gibt es laut Datenblatt noch "Full
>swing crystal oscillator " und "Low frequency crystal oscillator". Wie
>erkenne ich was genau der Quarz ist?

Grob an der Frequenz. Nimm "Full swing".

>Momenten ist die LED ca 20 sek lang an, dann wieder 20 Sek aus.

Du hast ja auch die DIV 8 Fuse aktiviert, da kommen nur 2 MHz bei der 
CPU an.

Also Low Fuse auf 0xF7, dann sollte es gehen.
(Firma: matzetronics) #3197542
Lesenswert?

Thomas T. schrieb:
> Das DMX Signal kommt teilweise an.
> Allerdings sehr unzuverlässig. Woran kann das liegen ? an den Timings
> vielleicht?

Deine DMX Quelle ist zuverlässig und mit anderer Peripherie gestestet? 
Was benutzt du als Verbindungskabel? Deine

> Ich
> verdrahte das neu damit es etwas übersichlicher wird.
Verdrahtung ist jetzt übersichtlicher?
Denke auch dran, das Ulrich den 120 Ohm Abschlusswiderstand 
eingezeichnet hat, der nur am Anfang und Ende der Kette sein sollte. 
Mehr als 2 Terminatoren sollte die DMX Leitung nicht haben.
OP #3198783
Lesenswert?

Ob die Quelle zuverlässig ist versuche ich ja gerade rauszufinden. Dass 
das Gerät welches DMX empfängt funktioniert weiss ich ganz sicher, daran 
liegts also nicht.

Den 120 Ohm Widerstand hab ich jetzt rausgenommen, allerdings ändert 
sich am Ergebnis nichts.

Die Kontakte von dem jeweiligen Draht halte ich an die DMX Buchse. Hab 
leider keinen Lötkolben hier um das direkt einzustecken.

Selbst Ohne Z Diode und den dazugehörigen Widerständen wird es nicht 
besser.
#3198854
Lesenswert?

@Thomas T. (thomas_t39)

>Die Kontakte von dem jeweiligen Draht halte ich an die DMX Buchse. Hab
>leider keinen Lötkolben hier um das direkt einzustecken.

AUA!!!! Verschone uns mit dieser Frickelei! Mach es gescheit oder lass 
es bleiben!

Mann O Mann, dass man ein wackeliges Steckbrett DERARTIG steigern kann?
(Firma: matzetronics) #3198874
Lesenswert?

Mach jetzt nochmal bitte ein Foto deines derzeitigen Versuchsaufbaues. 
Im ersten Beitrag sind da sehr merkwürdige Sachen, wie z.B. der GND auf 
Pin 8 verbunden mit Pin23 (PC0), Pin20 (AVcc) hängt in der Luft und am 
gesamten MC sehe ich keinen Entkoppelkondensator.

Falk Brunner schrieb:
>>Die Kontakte von dem jeweiligen Draht halte ich an die DMX Buchse. Hab
>>leider keinen Lötkolben hier um das direkt einzustecken.
>
> AUA!!!! Verschone uns mit dieser Frickelei! Mach es gescheit oder lass
> es bleiben!

Allerdings. Wie willst du denn da was messen, wenn du schon damit 
beschäftigt bist, die Drähte in der Buchse festzuhalten? Selbst der 
billigste Baumarkt Lötkolben und der passende DMX Stecker tun da einen 
unersetzlichen Job.
#3200028
Lesenswert?

Nein, der Quarz und die Delay-Funktionen sind deutlich genauer. Entweder 
sind deine Fuses falsch eingestellt und dein AVR läuft in Wirklichkeit 
mit dem internen RC-Oszillator, der hat auch 8 MHz, aber UNGENAU! Oder 
du hast die Optimierung im Compiler nicht aktiviert, dann funktionieren 
die _delay_ms() auch nicht genau.
OP #3200156
Lesenswert?

Mein Quarz hat 16 Mhz. Das ist im Programm bei F_CPU auch definiert.

Die Fuses sind so eingestellt wie es oben beschrieben wurde.

Wie müsste die Optimerung denn sein? Momentan habe ichs auf "O1".

Vll erklärt das warum DMX nicht funktioniert hatte. Die Timings sind 
möglicherweise durch die Verzögerung ausserhalb der Spezifikation.
OP #3200215
Lesenswert?

Der Quellcode hat sich geändert. Ich habe ihn ein Stückchen weiter oben 
gepostet.

Inzwischen benutze ich auch einen Atmega88 anstatt des Atmega8.

Ich habe leider kein Oszilloskop hier. Ich habe in 12 Sekunden ging die 
LED 5 mal an und 5 mal aus. Kann natürlich nicht sagen ob es exakt 1,2 
Sekunden sind, aber definitiv keine genaue Sekunde.

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