mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DMX empfang in C


Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
ich bin gerade dabei ein c programm für einen dmx
empfang in c zu schreiben(at89c2051)
5 kanäle kann ich dabei ohne probleme auswerten
und auch anschließend weiterverarbeiten.
ab dem 6 kanal wird anscheinend ein interrupt verschluckt.
die daten werden mit einer switch case anweisung im
interrupt ausgewertet und anschließend abgespeichert.
mfg

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aha schön, und weiter?

Spaß bei Seite.
Tipp: Schreibe deine Empfangenen Bytes in ein Array und werte das Array
in der mainloop aus.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok hab ich schonmal probiert
ich hab ein feld global vordefiniert zb feld[i]
anschließend wird bei jedem interrupt i um eins erhöht.
allerdings steigt er da beim 10 kanal oder höher wieder aus.
mfg

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einer muss es ja fragen: Wenn Du in C programmierst, dann könntest Du
doch einen schnelleren Prozessor verwenden? Z.B. ATmega8, der tut
seinen Job 8 x so schnell. Oder At89C2051X2. Dann wird aus Deinem
Höddehöddehödde ein Wroooooooooooooooom!

Wenn Wikipedia Recht hat, läuft die Datenübertragung mit 250kBit, da
bleiben pro Byte selbst mit Deinem Prozessor@24MHz 88 Befehle zur
Verarbeitung. Im Prinzip sollte das also schon zu schaffen sein. Was
treibst Du nur die ganze Zeit? ;-) Hast Du Quelltext zum guggen? Wie
schnell ist der Prozessor tatsächlich getaktet?

Versuche, statt der Indizierung über [i] einen Zeiger zu verwenden, das
kann Zeit sparen.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht solltest du einfach mal deinen Code posten.
Alles andere endet nur im Rumstochern.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
er hat nur 16MHz

switch (dmx_status)
     {
      case 1:
        if (dmx_byte == 0x00)
                                 {
         dmx_status = 2;
         }
         else
         {
         dmx_status = 0;
         break;
         }
      case 2:                     dmx_count++;
         if (dmx_count == dmx_adresse)
         {
         flagdmx = 1;
               i = 0;
         }
         if (flagdmx == 1)
         {
         feld[i] = dmx_byte;
               i++;
         }
            if (i == 9)
         {
         flagdmx = 0;
         }
                                 break;

so sieht die switch aus der rest geht ja

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
16MHz bei einem 2051? Das ist verdammt wenig für DMX. Die Frequnz wird
doch noch durch 12 geteilt, oder?
Wo befindet sich das switch? In der Main oder in der ISR?
Normalerweise sollte in der ISR nur ein Puffer mit den ankommenden
Daten gefüllt werden.
Bei DMX könnte man noch das Start-Byte detektieren und dann dem Kanal
entsprechend einen Zähler mitlaufen lassen, und nur die interessanten
Bytes speichern...

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das programm geht bis zum fünften kanal perfekt egal welche adresse ich
einstelle)
anschliesend wird in regelmäßigen abständen ein interrupt verschluckt
der switch befindet sich in der interrupt dort werden auch alle
enscheidenten kanäle in das feld gespeichert.
und in der main ausgewertet

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kommen noch mehr DMX-Zustände vor?

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ne es wird zb adresse 55 eingestellt
anschließend zählt das prog absulut richtig bis zum kanal 55
hoch die ersten 5 bytes werden richtig dargestellt anschliesend
wird ein interrupt verschluckt danach gehts wieder mit den nächsten
bytes richtig weiter

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde noch einen weiteren Zustand einführen, nämlich das Hochzählen
bis zur Zieladdresse, das geschieht momentan durch die Hintertür, womit
im Zustand 2 recht viele if's zusammen kommen.

Wenn mir die Prozessorzeit im Interrupt zu knapp wird, dann setze ich
immer ein Debug-Pin auf high beim Eintritt in den Interrupt und auf Low
beim Austritt. Dann sieht man schön, wieviel Zeit da verbraten wird. Du
kannst zusätzlich noch einen Puls auf einem anderen Port ausgeben, wenn
Du flagdmx=1 setzt, das dürfte ein günstiger Triggerzeitpunkt sein. Ein
Oszilloskop setze ich da naürlich schon voraus.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja  ok
aber es spielt keine ob ich zum stadresse 1
oder zb 100 eingebe
es ist immer der gleiche effekt

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist schon klar, aber alle Prüfungen müssen immer im gleichen Zustand
erfolgen. Irgendwie so ähnlich sollte das aussehen:

switch (dmx_status)
{
   case 1:
      if (dmx_byte == 0x00)
      {
         dmx_count = 0;
         dmx_status = 2;
      }
      else
      {
         dmx_status = 0;
         break;
      }
      // Wieso ist hier kein break?
   case 2:
      dmx_count++;
      if (dmx_count == dmx_adresse)
      {
         dmx_count = 0;
         dmx_status = 3;
      }
      break;
   case 3:
      feld[dmx_count++] = dmx_byte;
      if (dmx_count == 9)
         dmx_status = 4;
      break;
   case 4:
      // Habe fertig
   }

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi christian
deine gedankengänge deken sich mit meinen
aber um immerhin 5 kanäle zu richtig zu bekommen
diese gewandelte version.
case 3 und 4 geht nicht da steigt er aus deshalb 2 cases.
wie sollte man es mit zeigern machen ????
mfg

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm. Keine Ahnung, das tut sich nicht viel, weil damit wieder eine neue
Variable dazukommt. Aber: Wieso gehen 4 cases nicht? Was passiert? Gar
nix mehr?

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich sende dir mal mein komplettes programm per email ok?

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
You got mail, too :-)

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin
es geht mittlerweile
ich habs mit einem array gemacht
mfg

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du schreibst, es gibt nur 2 Cases. Was macht Switch, wenn dmx-status = 0
ist?

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es sind schon 3 cases nummeriert von 1 bis 3
wenn der dmx-status = 0 ist soll er in der switch anweisung
gar nix machen er wartet dann auf den Framing Error und setzt
den dmx-status = 1
mfg

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi
das prog funktioniert zwar aber nun möchte ich das feld nun direkt mit
zeigern
beschreiben, bringt das was und wie macht man das am geschicktesten.
ich habs mal so probiert
es läuft dann allerdings schlechter
zeiger=&feld[0];
*zeiger = SBUF;
zeiger++;
mfg

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich bin gerade auf der suche nach einem DMX Quelltext. Vielleicht 
habe ich ja glück du du stellst ihn mir mal zu verrügung das wäre sehr 
nett würde mich sehr über eine antwort freuen und auch sehr über einen 
Quelltext in C

Danke schon mal im vorraus

Gruß Alex

Autor: Alexander B. (lpc900)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Fertig :-)

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.