DMX ansteuerung

Gast #1976556
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
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.
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??
Moderator (Firma: Titel) Persönliche Seite
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
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
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

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.