Forum: Mikrocontroller und Digitale Elektronik DMX empfang in C


von Hans (Gast)


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

von Gast (Gast)


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.

von Hans (Gast)


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

von Christian Rötzer (Gast)


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.

von Rahul (Gast)


Lesenswert?

Vielleicht solltest du einfach mal deinen Code posten.
Alles andere endet nur im Rumstochern.

von Hans (Gast)


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

von Rahul (Gast)


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...

von Hans (Gast)


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

von Rahul (Gast)


Lesenswert?

Kommen noch mehr DMX-Zustände vor?

von Hans (Gast)


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

von Christian Rötzer (Gast)


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.

von Hans (Gast)


Lesenswert?

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

von Christian Rötzer (Gast)


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
   }

von Hans (Gast)


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

von Christian Rötzer (Gast)


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?

von Hans (Gast)


Lesenswert?

ich sende dir mal mein komplettes programm per email ok?

von Christian Rötzer (Gast)


Lesenswert?

You got mail, too :-)

von Hans (Gast)


Lesenswert?

moin
es geht mittlerweile
ich habs mit einem array gemacht
mfg

von Rahul (Gast)


Lesenswert?

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

von Hans (Gast)


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

von Hans (Gast)


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

von Alex (Gast)


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

von Alexander B. (lpc900)


Angehängte Dateien:

Lesenswert?

Fertig :-)

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.