Forum: Mikrocontroller und Digitale Elektronik DMX ansteuerung


von Florian (Gast)


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

von Florian (Gast)


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.

von Benjamin U. (utzus)


Lesenswert?

Hast du ein Oszilloskop um den Frame mal auf dem Bus anzuschauen?

von Florian (Gast)


Lesenswert?

Auf dem Bus schaut das Signal recht komisch aus.
ich versuch mal den verlauf zu speichern.

von Benjamin U. (utzus)


Lesenswert?

Hast du Irgendwo PortB Pin0 auf Ausgang gesetzt? also mit DDRB ... ?? 
(sofern du einen AVR verwendest)

>>Also einen Fehler hab ich schon gefunden, nämlich den, dass ich den
>>Timer in der Interrupt-Routine nicht neu geladen habe.
Womit lädst du ihn neu? mit 255??

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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?

von Florian (Gast)


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

von Benjamin U. (utzus)


Lesenswert?

Florian schrieb:
> 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.

Naja, dann wird es wohl am Schaltungsaufbau liegen => Schaltplan posten
und cool wären auch die Osziloskopausdrucke, falls das geht.

von Florian (Gast)


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

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.