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
aha schön, und weiter? Spaß bei Seite. Tipp: Schreibe deine Empfangenen Bytes in ein Array und werte das Array in der mainloop aus.
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
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.
Vielleicht solltest du einfach mal deinen Code posten. Alles andere endet nur im Rumstochern.
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
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...
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
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
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.
naja ok aber es spielt keine ob ich zum stadresse 1 oder zb 100 eingebe es ist immer der gleiche effekt
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 }
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
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?
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.