DMX empfang in C

Gast #334231
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
Gast #334233
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
Gast #334234
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.
Gast #334236
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
Gast #334237
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...
Gast #334238
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
Gast #334240
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
Gast #334241
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.
Gast #334243
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
   }
Gast #334244
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
Gast #334251
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
Gast #1022677
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren