mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DMX ansteuerung


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#define WAIT_FLAG while(!flag)

volatile char flag = 1;
volatile char tmp = 1;
volatile char daten[256];

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

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

  tmp = 0;
  for(x = 0; x < 22; x++)
  {
    flag = 0;
    WAIT_FLAG;
  }
  //----------------------------------------------

  //----------------------------------------------
  //------------------DMX-Mark--------------------

  tmp = 1;
  for(x = 0; x < 2; x++)
  {
    flag = 0;
    WAIT_FLAG;
  }
  //----------------------------------------------

  //----------------------------------------------
  //----------------Startbyte---------------------

  tmp = 0;
  for( x = 0; x < 9; x++)
  {
    flag = 0;
    WAIT_FLAG;
  }
  tmp = 1;
  for( x = 0; x < 2; x++)
  {
    flag = 0;
    WAIT_FLAG;
  }
  //----------------------------------------------

  //----------------------------------------------
  //-------------------Bytes----------------------

//  for(x = 0; x < 256; x++);
  {
    tmp = 0;
    flag = 0;
    WAIT_FLAG;
    for(y = 0; y < 8; y++)
    {
      tmp = 1;//((daten[x]>>x) & 1);
      flag = 0;
      WAIT_FLAG;
    }
    for(y = 0; y < 2; y++)
    {
      tmp = 1;
      flag = 0;
      WAIT_FLAG;
    }
  }
  //----------------------------------------------

Und hier die Interrupt Routine:
ISR (TIMER0_OVF_vect)
{

  PORTB = (tmp << PB0);
  flag = 1;

}

Vielen Dank,
Florian

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benjamin Utz (utzus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du ein Oszilloskop um den Frame mal auf dem Bus anzuschauen?

Autor: Florian (Gast)
Datum:

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

Autor: Benjamin Utz (utzus)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benjamin Utz (utzus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.