DMX ansteuerung

Gast #1976556
Lesenswert?
• ▲
▼
Hallo,
ich versuche einen DMX-Sender zu bauen.
Das Problem ist, dass der Empfänger das Signal nicht richtig erkennt.

Nun meine Frage, ob ich ein Fehler im Denkweg habe, oder ob ich das 
einfach falsch umsetze.

Globale Variablen, bzw. Definitionen
1
#define WAIT_FLAG while(!flag)
2

3
volatile char flag = 1;
4
volatile char tmp = 1;
5
volatile char daten[256];

Hier sind die Timereinstellungen: 250kHz bei 16MHz Takt
1
    TCCR0 = (1<<CS01) | (1<<CS00); // Prescaler 66
2
   TCNT0 = 256-1;                 //1 Zählschritt bis zum Überlauf
3
 
4
    // Interrupt Timer0
5
    TIMSK |= (1<<TOIE0);
6
        sei();

Hier ist der Code für das Frame.
1
  int x, y;
2
  //----------------------------------------------
3
  //---------Start des DMX Sendevorgangs----------
4

5
  tmp = 0;
6
  for(x = 0; x < 22; x++)
7
  {
8
    flag = 0;
9
    WAIT_FLAG;
10
  }
11
  //----------------------------------------------
12

13
  //----------------------------------------------
14
  //------------------DMX-Mark--------------------
15

16
  tmp = 1;
17
  for(x = 0; x < 2; x++)
18
  {
19
    flag = 0;
20
    WAIT_FLAG;
21
  }
22
  //----------------------------------------------
23

24
  //----------------------------------------------
25
  //----------------Startbyte---------------------
26

27
  tmp = 0;
28
  for( x = 0; x < 9; x++)
29
  {
30
    flag = 0;
31
    WAIT_FLAG;
32
  }
33
  tmp = 1;
34
  for( x = 0; x < 2; x++)
35
  {
36
    flag = 0;
37
    WAIT_FLAG;
38
  }
39
  //----------------------------------------------
40

41
  //----------------------------------------------
42
  //-------------------Bytes----------------------
43

44
//  for(x = 0; x < 256; x++);
45
  {
46
    tmp = 0;
47
    flag = 0;
48
    WAIT_FLAG;
49
    for(y = 0; y < 8; y++)
50
    {
51
      tmp = 1;//((daten[x]>>x) & 1);
52
      flag = 0;
53
      WAIT_FLAG;
54
    }
55
    for(y = 0; y < 2; y++)
56
    {
57
      tmp = 1;
58
      flag = 0;
59
      WAIT_FLAG;
60
    }
61
  }
62
  //----------------------------------------------

Und hier die Interrupt Routine:
1
ISR (TIMER0_OVF_vect)
2
{
3

4
  PORTB = (tmp << PB0);
5
  flag = 1;
6

7
}

Vielen Dank,
Florian
Gast #1976594
Lesenswert?
• ▲
▼
Also einen Fehler hab ich schon gefunden, nämlich den, dass ich den 
Timer in der Interrupt-Routine nicht neu geladen habe.

Aber das Gerät erkennt nun ein DMX-Sognal, reagiert jedoch nicht auf die 
Daten, welche ich sende.
Moderator (Firma: Titel) Persönliche Seite #1976611
Lesenswert?
• ▲
▼
Florian schrieb:
> Auf dem Bus schaut das Signal recht komisch aus.
> ich versuch mal den verlauf zu speichern.
Meinst du mit "komisch" einen Jitter? Unterschiedlich lange High- und 
Low-Zeiten?
> Nun meine Frage, ob ich ein Fehler im Denkweg habe
Ja. Solche relativ zeitkritischen Dinge wie eine serielle Übertragung 
macht man nicht gepollt.
Hast du dir mal angesehen wie andere das machen? Warum nimmst du nicht 
so wie alle die den UART deines uC? Welcher ist das überhaupt?
Gast #1976620
Lesenswert?
• ▲
▼
Also Ich hab den Pin auf Ausgang gesetzt, das Signal kommt auch 
anständig am MAX488 an nur dahinter schaut das Signal recht komisch aus.

Ich benutze einen ATMega8 und die USART-Schnittstelle möchte ich für 
eine Übertragung nach USB benutzen und desshalt habe ich die 
Schnittstelle nicht genutzt.

Die lösungen, die ich gefunden hatte, beim Suchen, sind jedoch alle über 
die USART-Schnittstelle gelöst.

Grüße
Flo
Gast #1976637
Lesenswert?
• ▲
▼
Okay... habs jetzt ansatzweise...
Hatte das invertierte und das nicht invertierte Signal am Stecker 
vertauscht.

Jetzt sind glaub ich nurnoch timing Probleme, da ein paar LED's 
leuchten, und der Großteil nicht.

Vielen Dank,
Florian

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.