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

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