Forum: Mikrocontroller und Digitale Elektronik Probleme beim senden eines DMX Signals


von Florian (Gast)


Lesenswert?

Hallo,

ich versuche ein DMX-Signal zu erzeugen.
Da ich es mit dem Timer nicht geschafft habe, versuche ich es nun mit 
der USART-Schnittstelle des ATMega8.
Nun ist mein Problem, dass es nicht wirklich Funktioniert.

Laut einigen Beiträgen in verschiedenen Foren reicht es, wenn ich für 
das Break-Signal die Baudrate auf 62500 Baud stelle.

Nun funktioniert diese Methode entweder bei mir nicht, oder ich mache 
irgendetwas falsch.

Hier mein Code:
1
#define F_CPU = 16000000
2
3
#include <avr/io.h>
4
5
void initBaud(int load)
6
{  
7
  UCSRB = (1<<TXEN);  
8
  UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
9
  UBRRH = 0;
10
  UBRRL = load;
11
12
}
13
14
int main()
15
{
16
  unsigned char daten[256];
17
  int x;
18
19
  for(x = 0; x < 256; x++)
20
    daten[x] = 255;
21
22
23
  while(1)
24
  {
25
    initBaud(15); //baudrate: 62500
26
    UDR = 0;
27
    while(!(UCSRA & (1<<UDRE)));
28
    initBaud(3); //baudrate: 250k
29
    UDR = 0;
30
    while(!(UCSRA & (1<<UDRE)));
31
    for(x = 0; x < 256; x++)
32
    {
33
      UDR = daten[x];
34
      while(!(UCSRA & (1<<UDRE)));
35
    }
36
  }  
37
}

Wäre nett, falls mit jemand helfen könnte.

Vielen Dank
Florian

von Christoph S. (mixer) Benutzerseite


Lesenswert?

Hallo,

kommt irgendwas über den UART raus oder garnix? Oszi?
Schaltung korrekt?

Dachte eigentlich den FE erreicht man damit, dass man den UART Pin eine 
bestimmte Zeit lange direkt schaltet, aber mit der SW für Sender habe 
ich mich noch nicht genau befasst!

Gruss

von Florian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

danke schon einmal für die Antwort, daran hatte ich noch garnicht 
gedacht, ich werds mal versuchen manuell zu schalten.

Als Anhang habe ich noch einen Abschnitt vom Signal angeähngt, welcher 
mir ein wenig merkwürdig vorkommt.

von manateemoo (Gast)


Lesenswert?

du wartest nach dem Senden des Breaks auf UDRE bevor du die baudrate 
wieder auf 250kBaud umschaltest.
Du musst aber noch zusätzlich warten bis das byte wirklich raus ist 
(TXC)

von Florian (Gast)


Angehängte Dateien:

Lesenswert?

Also...
Das Gerät reagiert leider immernoch nicht auf das Signal.
Jedoch schonmal vielen Dank, denn durch die Abfrage von TXC der Fehler 
mit dem langen High-Signal weg.

Ich hänge die neuen Signale einfach mal an.

Reset ist ungefähr 144µs
Dann das Mark ca. 32µs

Danke nocheinmal.

von Florian (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist meine Schaltung. Die habe ich ganz vergessen zu posten.

von manateemoo (Gast)


Lesenswert?

Beim XLR sind pin 2 und 3 vertauscht.

von Florian (Gast)


Lesenswert?

Ja, das hab ich bei der Verkabelung schon geändert, hatte ich nur 
vergessen anzugeben :/
Außerdem habe ich anstatt den MAX485 einen SN75179 verwendet.

von Christoph S. (mixer) Benutzerseite


Lesenswert?

Resetbeschaltung??

von Florian (Gast)


Lesenswert?

Die habe ich weggelassen, da ich Sie vergessen habe.
Aber der Reset findet ja momentan scheinbar trotzdem statt, da die 
zeitlichen Details ja scheinbar stimmen.

von spess53 (Gast)


Lesenswert?

Hi

>    UDR = 0;
>    while(!(UCSRA & (1<<UDRE)));
>    initBaud(3); //baudrate: 250k

Typischer Fehler. Mit der Prüfung von UDRE wartest du nicht die 
Übertragung eines Bytes ab, sondern nur die Verfügbarkeit des 
TX-Puffers.

Ersetze UDRE durch TXC.

MfG Spess

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.