DMX-Receiver 27-Kanal mit ATmega8535

    DMX-Receiver 27-Kanal mit ATmega8535

    Wie bereits angekündigt habe ich mir einen 27-Kanal DMX-Receiver gebaut und die Software vom 12-Kanal darauf angepasst. Die basiert, bis auf die Autoconfig, auf Pesis 30-Kanal DMX-Receiver, für den ich mich an dieser Stelle nochmal bedanken möchte :)

    Features:
    • Ansteuerung von 27 LEDs über Treiberstufe an PortB5-0, PortA0-5, PortC7-0 und PortD7-1 (in der Reihenfolge als LED1-LED27)
    • Automatische Konfiguration der DMX-Adresse durch drücken eines Tasters an PortA7 für eine Sekunde (wird direkt ausgelöst, wenn der Taster beim Reset/Einschalten gedrückt ist). Es wird der erste Kanal mit einem Wert größer/gleich 128 als Startadresse gewählt. Wird der Taster losgelassen, bevor ein Kanal einen entsprechenden Wert erhält wird die automatische Konfiguration abgebrochen.
    • Statusled an PortB7 - Leuchtet im Normalbetrieb, blinkt mit ca. 2Hz bei fehlendem DMX-Signal, blinkt mit ca. 8Hz nach erfolgreicher Addresskonfiguration (bis der Taster losgelassen wird). Da PortB7=SCK kriegt man beim flashen des Controllers ebenfalls eine schöne visuelle Rückmeldung - das mache ich jetzt immer so, wenn möglich ^^


    Natürlich gibts auch was zu gucken, hier ist nen Foto vom Prototypen (ob ne Lochstreifenrasterplatine jetzt so interessant ist muss jeder selbst entscheiden :P

    Interessanter: der Schaltplan. Die ULN2803s können natürlich beliebig durch andere Treiberstufen oder KSQ's ersetzt werden. Ich verweise hier auf Pesis 3-Kanal DMX-Receiver

    Edit: Ups, an IC2, Pin 11 fehlt was ^^
    Und der Quartz ist natürlich 16MHz, wie gesagt, alles vom 12er kopiert.
    Und weiter mit den Fehlern: IC5 ist ein SN75176

    Wie ebenfalls bereits gepostet werde ich in den nächsten Tagen (=am Wochenende) ein Platinenlayout erstellen und eine Sammelbestellung einleiten. Falls ich mich mit dem routen ganz dumm anstelle - hab das noch nie selbst gemacht - kann es auch noch ne Woche länger dauern, also einfach die Augen offenhalten und mal hier oder im Marktplatz gucken ;)
    Das Layout soll sich übrigens auch als 30-Kanal Receiver bestücken lassen, die Software passe ich dafür natürlich entsprechend an.

    Wenn jemand die Leds anders an den µC anschließen möchte: Die Portbelegungen lasse ich mir generieren, ein freies umverteilen ist also kein großer Aufwand. Einfach fragen :)
    Ausserdem hab ich die Software eigentlich, bis auf die letzten Patches) auf einem ATmega32 entwickelt. Auch hier gilt: kein großer Aufwand, einfach fragen. Nur grundlos mache ich mir nicht die Mühe die extra zu posten, selbst wenn es nur 10min dauert ;)


    Freue mich schon, dass ich jetzt endlich mein Ambilight bauen kann =)


    ... fast vergessen, ist doch zu spät ...
    Software (Quellcode und hex+eep), Schaltplan (der aus dem Post), Lochstreifenraster-Layout (S/W, Bestückung, Rückseite)
    Auf Rapidshare, da 429kB
    rapidshare.com/files/302050838…27Channel-Version-1.0.zip

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „jens_n“ ()

    Oh ich muss meine Meinung revidieren, habe zwei kleine Fehler im Plan gefunden.
    Der Reset ist teils falsch angebunden, sollte so aussehen:

    Reset - R - V++ (so vorhanden) zwischen den R und Reset sollte aber noch nen 100n gegen GND

    Geh bei den uC lieber mit zwei 100n(1. Reset, 2.Vcc) als mit einem ran. Sonst kann es während dem Betrieb zu ungewollten Resets kommen.
    Eigene Erfahrung und Stundenlange Fehlersuche.

    Das zweite was mir aufgefallen ist, warum ein 4,3MHz Quarz,
    So kommst du doch garnicht sauber auf 250kHz fürn DMX Bus? Oder!?

    Greetz
    Rate mal wofür ich meine TLC5947s haben will :P
    Natürlich werden die dann auch über DMX angesteuert ^^

    Für nen Ambilight sind neun Kanäle aber zumindest bei meiner aktuellen Monitorgröße (26") genug. Zwei L/R, drei oben, zwei unten (da in der Mitte der Sockel ist).
    (Ich rede übrigens von Bennys Platinen, da brauche ich keine KSQs mehr)
    Falls die Ausleuchtung in den Ecken noch nicht perfekt ist kommen da nochmals jeweils eine von den viereckigen Platinen hin (und an den Empfänger setze ich einfach noch zusätzlich nen 12er-Empfänger - funktioniert halt bei DMX so schön :) )

    Falls ich es schaffen sollte, das Ambilight gewinnbringend zu verkaufen denke ich an die TLCs und rechne das mal durch :thumbsup:
    Bis dahin brauche ich die "nur" für ne große RGB-Matrixwand.

    Edit:
    Der Pullup ist doch schon dazu da, ungewollte Resets zu vermeiden? Hab da noch nie was von gehört / nie Probleme mit gehabt (und es ist ja nichtmal nen Taster dran). Und wenn doch: das ist nen DMX-Receiver, da flackert maximal mal kurz das Licht ^^
    Und der Quartz... Funktioniert gut so :P
    Nein, ich hab hier natürlich nen 16MHz eingebaut, sieht man im Lochraster-Plan auch entsprechend. Der Schaltplan ist heute nur schnell für den Beitrag zusammengeklickt worden, daher auch die Fehler.
    Oh, vllt. können wir uns dann ja mit der Ansteuerung nen bisschen ergänzen? Wird das zufällig nen DMX-RGB-Lounge-Couch-Matrix-Tisch? (was nen Wort :D )
    Falls (eigentlich) nicht könnten wir uns auch gut zusammentun: du packst einfach noch nen DMX-Treiber dran, dann entwickelst du den Standalone-Modus und ich lustige vom Rechner gesteuerte Effekte :led:

    Und siehe Edit vom letzten Post für die anderen Vorschläge - hier war jetzt jedes mal, wenn ich fertig gepostet hatte schon ne Antwort von dir :D
    Ich hab nix gegen die 2ct, mit dem Platz auf dem Layout komme ich vllt. auch noch klar, aber ich würde gerne verstehen, was das (technisch) bringen soll. Am Reset ist nen Pullup, sonst ist da gar nix, und der µC macht mit dem Pin auch nix außer ihn überwachen. Wieso sollte der also auslösen?

    Wenn mir wer das erklären kann, oder bestätigt, dass das gängige Praxis ist (gut, dann wird wohl auch wer das erklären können) bin ich gerne bereit, das in alle weiteren Layouts aufzunehmen :)

    Und dann sag ich auch gute Nacht. "Doofes Forum", immer bleibe ich hängen, und morgen in der Vorlesung bin ich totmüde :sleeping:
    Den Filter-Kondi am Reset-Pin kannst du getrost weglassen, ausser wenn deine Schaltung in einem extrem mit elektromagnetischen Feldern verseuchten Umfeld und mit einer längeren Reset-Leitung (welche als Antenne fungieren könnte) laufen müsste. Praktisch alle aktuellen Mega- und Tiny-AVRs haben sowohl einen internen Pullup als auch einen Spike-Filter am Reset-Pin bzw. in der internen Reset-Schaltung. Da der interne Pullup aber relativ schwach ist (ca. 30 bis 60 kOhm), wird von ATMEL empfohlen, extern einen stärkeren anzuschliessen (4,7 bis 10 kOhm), um in störungsintensiveren Umgebungen ungewollte Resets möglichst auszuschliessen.

    In vielen Fällen wird man sogar auf den externen Pullup verzichten können, wenn der Reset-Pin nicht beschaltet wird bzw. wenn die Reset-Leitung nur kurz ist, allerdings würde ich persönlich einen 10 kOhm Pullup immer anschliessen, wenn ich den Reset-Pin auch beschalten möchte (ISP etc.). Ein externer Filter-Kerko am Reset-Pin ist hingegen wirklich nur in Extremsituationen als Zusatzschutz zum internen Spike-Filter von Nutzen, wenn man im Einsatzumfeld so starke Störfelder hat, dass selbst der interne Spike-Filter nicht alle Einstreuungen genügend dämpfen kann.

    Generell sollte man aber auf eine gut stabilisierte Versorgung achten und einen bezüglich Maximal-Belastung enstsprechend dimensionierten Elko (Low ESR, falls möglich) möglichst auf der Steuer-Platine selbst verwenden. Das hilft dann auf jeden Fall kurzzeitigen Spannungseinbrüchen (und dadurch möglicherweise ausgelösten Resets) vorzubeugen.

    Gruss
    Neni

    Edit: Abblock-Kondis sind übrigens nicht einfach bei jedem mit VCC in Verbindung stehenden Pin vorzusehen, sondern nur an den tatsächlichen Versorgungspins. Die Abblock-Kondis dienen ja dazu, die kurzzeitig (im ns-Bereich) hohen Ströme über die Versorgungspins für die Digital-Blöcke des Chips liefern zu können, ohne dass dabei die Spannung ebenso kurzzeitig unter das zulässige Limit fällt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „synvox“ ()

    Gut, dann kann ich den Kondensator weglassen, nutze den Reset ja nur für den ISP. Vielen Dank für die Erklärung!

    LEDsepp schrieb:

    Eine (zwei) kurze Frage(n) zur Software:
    - ist ein Strobeeffekt vorgesehen/enthalten? Falls nicht, lässt sich das einfach dazu bauen?
    - ist ein Masterdimmer vorgesehen/enthalten? Falls nicht ...?


    Da bei mir eine Steuerung mit externer Software vorliegt ist der Gesamtdimmer nicht notwendig. Kp, wie gut man das nachrüsten kann, wären immerhin 27 Multiplikationen, 256 mal pro Sekunde. Sollte aber nicht so schwer sein, das auszuprobieren.

    Stroboeffekt ist aktuell nicht implementiert, ist aber überhaupt kein Problem. Der (langfristige) Plan ist eh, den neu zu schreiben, sodass mehrere Receiver länger gleich blitzen, aber ich kann dir den alten problemlos wieder einbauen.

    Edit:
    Der ATmega8535 kann den mul-Befehl, also sollte der Gesamtdimmer auch kein Problem sein.
    Gutes Gerät! :thumbup: - und wie man sieht, kann man sowas auch auf Lochraster sehr ordentlich aufbauen!

    zum Reset nur ne "Anekdote" - ich habe mir vor einiger Zeit (da kannte ich mich mit µC noch nicht aus) so nen "Strobo-Pimp-Chip" von Hendrik Hoelscher bestellt - war halt ein Mega8515 mit neuer Firmware für so Stairville- und Botex-Strobos. Da hiess es, man muss den Pin 1 umbiegen, bevor man den einsetzt, sonst geht's nicht.

    jetzt (also schon seit längerem :D) weiß ich auch warum: der Original-µC macht Reset bei "High", also liegt Pin 1 in dem Sockel auf GND, daher darf Pin1 da nicht reingesteckt werden.

    Der hängt jetzt in der Luft, in nem Strobo mit 1.500 Watt-Röhre (also ziemlich starke kurze Spitzenströme im Gerät), die mit 10 kV gezündet wird - also eine durchaus nicht ganz so störfreie Umgebung - und macht auch keine Probleme...

    sobald aber ein Stückchen Leiterbahn oder gar ISP dran ist, würde ich auf jeden Fall den Widerstand nach Vcc hinmachen - den Kondi hätte ich bis jetzt aber auch noch nie gebraucht...

    nighty, jens: dann sind wir schon drei, ich brauche die TLC5947 auch für ne Matrix ;)

    wie habt ihr das vor, mit den 12 Bit...? - diese bereits in der Ansteuer-SW erzeugen und dann pro Kanal 2 Byte übertragen..? - ich werde wohl bei den 8 Bit Input bleiben und dann per Dimmerkurve auf 12 Bit umrechnen, damit die untersten Werte nicht so abgestuft sind.

    da aber eine Dimmerkurve pro Kanal die Farbe verschieben würde, habe ich mir das so gedacht: RGB-Daten kommen rein, werden in HSV umgerechnet. Dann nur die Helligkeit mit der Dimmerkurve behandelt, und das ganze dann auf 12 Bit RGB-Ausgabewerte zurückgerechnet... dann verläuft die Helligkeit logarithmisch mit hoher Auflösung, aber an der Farbe ändert sich nix...

    sollte ja problemlos machbar sein, mehr hat der µC auch nicht zu tun, weil die PWM ja eben extern erzeugt wird...

    EDIT: jens: für den Gesamtdimmer musst Du nicht 256x in der Sekunde Multiplizieren - die Werte ändern sich ja auch nur max. 44x pro Sekunde (schneller geht's mit DMX nicht rein), also muss man die gar nicht öfter umrechnen - bei mir (der 3-Kanal-Dimmer mit Tiny2313) läuft das einfach in der Hauptschleife, rechnet also ständig um, keine Ahnung wie oft der das genau in der Sekunde macht... ;) - bei nem Mega-AVR ist's sowieso kein Problem, der hat ja HW-Multiplikation...
    It's only light - but we like it!

    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!
    8 Bit auf 12 Bit hatte ich auch vor - die HSV-Umrechnung die du da vorschlägst finde ich interessant, aber ob ich die tatsächlich brauche hängt von den Ergebnissen ab, und davon, was ich dann tatsächlich schon in meiner Steuersoftware rausrechnen kann.

    BTW: ich versuche auch für die aktuellen Dimmer "schönere" Stufen für die unteren Helligkeiten zu erzeugen, kann man den Timer beim ATmega noch schneller als 256/s stellen?
    Jens: bei der SW läuft der Timer mit nem Prescaler von 1, zählt also mit 16 MHz - alle 256 Takte wird die ISR aufgerufen, dort zählt dann der PWM-Counter wieder immer bis 256, also ergibt sich 244 Hz PWM-Frequenz...

    Du kannst den Timer auch so konfigurieren, dass er nicht bei nem Overflow, sondern Compare Match nen Interrupt auslöst, ich mache das bei einem Controller (der nur mit 8 MHz läuft, aber trotzdem relativ hohe PWM-Frequenz hat) so, löst alle 100 Takte aus:

    Quellcode

    1. ldi temp0, (1<<WGM01) ; CTC-Mode
    2. out TCCR0A, temp0
    3. ldi temp0, 100 ; alle 100 Takte Timer-Interrupt
    4. out OCR0A, temp0
    5. ldi temp0, (1<<OCIE0A) ; OCIE0A: Interrupt bei Timer0 Compare Match A
    6. out TIMSK, temp0
    7. ldi temp0, 0b00000001 ; Prescaler auf 1, Timer starten
    8. out TCCR0, temp0


    nur: 100 Takte werden Dir für 27 Kanäle SW-PWM nicht reichen - und wesentlich schneller wird's auch nicht... was evtl. gerade noch ginge: 10 Bit-PWM (1.024 Stufen), alle 150 Takte Interrupt - da kommst Du dann mit 16 MHz Quarz auf ne PWM-Frequenz von 104 Hz, naja, *toll* ist das nicht mehr...

    was gehen würde, wäre BCM (Bit Code Modulation) - da mache ich gerade eine mit 12 Bit, die kommt trotzdem auf ca. 300 Hz - relativ unabhängig von der Zahl der Kanäle... bei Interesse mal danach suchen, viele sagen auch BAM (Bit Angle Modulation) dazu, das ist aber ne Herstellerbezeichnung...

    Und: bin nach wie vor daran interessiert, wie das automatische generieren der PWM-Routine funktioniert.. ;)
    It's only light - but we like it!

    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!
    244Hz sieht man ja schon, wenn man die Augen schnell bewegt (noch nicht störend, aber man siehts) - noch langsamer darf es aber wohl nicht werden... BCM gucke ich mir mal an :)

    Und hier die Methode, alles quick&dirty direkt reingehackt ;)
    Das Ergebnis kriegt man am Ende mit sb.ToString(), Ausgabe hab ich mit nem kleinen WPF-Fenster+Textbox realisiert. Der letzte Sprung muss manuell auf PWM_Out (oder so) geändert werden, andere Portbelegungen sind durch Quellcode-ändern zu erreichen ;)

    Quellcode

    1. [...]
    2. List<String> portList = new List<string>();
    3. SortedDictionary<String, int> fromDictionary = new SortedDictionary<String, int>();
    4. SortedDictionary<String, int> toDictionary = new SortedDictionary<String, int>();
    5. portList.Add("OutB");
    6. fromDictionary.Add("OutB", 5);
    7. toDictionary.Add("OutB", 0);
    8. portList.Add("OutA");
    9. fromDictionary.Add("OutA", 0);
    10. toDictionary.Add("OutA", 5);
    11. portList.Add("OutC");
    12. fromDictionary.Add("OutC", 7);
    13. toDictionary.Add("OutC", 0);
    14. portList.Add("OutD");
    15. fromDictionary.Add("OutD", 7);
    16. toDictionary.Add("OutD", 1);
    17. StringBuilder sb = new StringBuilder();
    18. int pwmLoop = 1;
    19. foreach (string port in portList) {
    20. int from = fromDictionary[port];
    21. int to = toDictionary[port];
    22. if (from < to) {
    23. for (int i = from; i <= to; i++) {
    24. pwmLoop++;
    25. sb.AppendLine("\t\tld\t\ttemp1, Y+");
    26. sb.AppendLine("\t\tcp\t\tPWM_Count, temp1");
    27. sb.AppendLine("\t\tbrlo\tPWM_" + pwmLoop);
    28. sb.AppendFormat("\t\tandi\t{0}, ~(1<<{1})", port, i);
    29. sb.AppendLine();
    30. sb.AppendLine();
    31. sb.AppendFormat("PWM_{0}:", pwmLoop);
    32. sb.AppendLine();
    33. sb.AppendLine();
    34. }
    35. }
    36. else {
    37. for (int i = from; i >= to; i--) {
    38. pwmLoop++;
    39. sb.AppendLine("\t\tld\t\ttemp1, Y+");
    40. sb.AppendLine("\t\tcp\t\tPWM_Count, temp1");
    41. sb.AppendLine("\t\tbrlo\tPWM_" + pwmLoop);
    42. sb.AppendFormat("\t\tandi\t{0}, ~(1<<{1})", port, i);
    43. sb.AppendLine();
    44. sb.AppendLine();
    45. sb.AppendFormat("PWM_{0}:", pwmLoop);
    46. sb.AppendLine();
    47. sb.AppendLine();
    48. }
    49. }
    50. }
    51. [...]


    Lässt sich bestimmt noch einiges raus machen, wenn ich nur genug Zeit für meine ganzen Projekte hätte :rolleyes:
    Aber das kennt hier wohl jeder ^^

    Wo hattest du eigentlich nach dem Code gefragt? Muss das überlesen haben...
    Das war hier, ganz unten - wundert mich nicht, dass Du das überlesen hast, da kommen erst mal etliche Zeilen an Benkly gerichtet... ;)

    was ist WPF...? - ich bin halt kein Informatiker, also ich habe ehrlich gesagt keine Ahnung, wo ich dieses Programm dann laufen lassen sollte...?! - ist das Java oder was (nicht lachen, bei Hochsprachen bin ich halt echt der Depp :D)?

    wegen den 244 Hz: ja, das ist komisch - bei meiner indirekten Beleuchtung mit Rebels im Bad sehe ich die 244 Hz gar nicht flimmern, bei ner einzelnen 5-mm-RGB-LED, die zum testen an oben erwähntem 8-MHz-Controller hängt, sehe ich die 300 Hz noch deutlich flimmern (beim bewegen, wenn ich direkt in die LED schaue) - könnte also auch von der Fläche abhängen, wenn es keine scharfen Kanten gibt, dann auch keinen so ausgeprägten Stroboskopeffekt...? - Was hast Du da eigentlich an LEDs dran...?
    It's only light - but we like it!

    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!