Und wieder mal eine Matrix...

  • Hallo Freunde der gepflegten Leuchtakrobatik,


    ich habe im Startpost ein neues Update der µC Software hochgeladen.


    Neu ist das beim Start des µCs die angeschlossenen Pixel gezählt werden und ein Standaloneprogramm wurde implementiert.


    Das Standaloneprogramm besteht aus einem blauen Px welches einmal die Matrix durchläuft und dann wieder von vorne beginnt, daher war es wichtig, dass die Pixel zu Beginn gezählt werden. Nicht dass das Pixel je nach Größe der Matrix am Ende "rausläuft" und irgendwann plötzlich wieder erscheint.


    Wäre nett wenn jemand mit Ahnung mal über den Quellcode schauen könnte. Grobe Fehler schließe ich mal aus - weil funktioniert ja - aber irgendwas gibts ja immer zu verbessern ;)


    Gruß
    Dennis

  • Interessante Idee, die Pixel automatisch zählen zu lassen :thumbup:


    sehe ich das richtig, Du führst den Output des letzten Pixels an einen Pin, schiebst dann Bits durch, und wenn hinten eins raus kommt, gibt's nen Interrupt, dort hältst Du den aktuellen Stand des Zählers in der Ausgabe-Routine fest?


    Das würde ich dann auch so im Text erwähnen, auch welcher Pin, das ist ja nicht so einfach für jedermann ersichtlich, wenn nun jemand diese Verbindung nicht macht, funktioniert das nicht...


    auch im Code könnte man das besser dokumentieren, ich kenne den ja (weil er meinem sehr ähnlich ist ;)), aber wenn jemand das Projekt zum ersten mal sieht, dann ist das nicht so leicht nachzuvollziehen, was da passiert...


    ich würde das daher in den jeweiligen Routinen deutlich kennzeichnen - Du machst den "Header" ja auch so wie ich:


    Code
    ; ================================================================================================
    ; Pixel- Zählroutine
    ; ================================================================================================
    ;
    ; benutzte Register      : temp0, temp1, XH, XL
    ; gem. benutzte Register :
    ; reservierte Register   :
    ;
    ; ------------------------------------------------------------------------------------------------


    Da wäre eben die Zeile "gem. benutzte Register :" für sowas gedacht, also hier z.B. "YH, YL, enthält den aktuellen Zählerstand der Ausgaberoutine", dann wüsste man eher, was da passiert - ich habe auch paar so Routinen, die "voneinander abhängig sind", da ist das dann noch mal extra im Vorspann beschrieben "diese Routine gehört mit jener zusammen, so&so arbeiten die zusammen"...


    Auch weil sich "Pixel-Zählroutine" so anhört, als würde diese Routine alleine die Pixel zählen - das macht sie aber nur, wenn auch Pixel ausgegeben werden...


    ansonsten noch:


    Code
    ldi		XH, 7									; X = max. mögliche Px * 3
    		ldi		XL, 236


    ist schlechter Stil, die beiden Zahlen sagen einem so erst mal nix, warum das 7 und 236 ist - Diese Zahl hast Du ja schon in ner Konstante ("Px_Anzahl"), also kannst Du die hier auch verwenden:


    Code
    ldi		XH, high (Px_Anzahl*3)								; X = max. mögliche Px * 3
    		ldi		XL, low (Px_Anzahl*3)


    dann weiß man erstens sofort, was hier passiert, und zweitens muss man - wenn jemand das auf nen anderen µC umbaut, mit mehr oder weniger möglichen Pixeln - nur einmal in der "Definitions.inc" ändern, und nicht in mehreren Routinen diese zwei Zahlen...


    das nur so als Tipps, wolltest Du ja... ;)


    P.S.: Es ist immer netter, wenn man das komplette AVR-Studio-Projekt in nen ZIP-Ordner packt, dann muss derjenige, der weiter dran schnitzen will (oder das auch nur assemblieren will, .hex ist ja nicht dabei) nicht neues Projekt anlegen und die Dateien "importieren"...

    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!

    Einmal editiert, zuletzt von Pesi ()

  • Tag auch,
    also es ist so, dass man den Data_Out Pin des letzten WS2812 Pixels mit dem µC verbinden muss (genauer mit INT1).
    Beim Start/ Reset des Controllers wird nun zu Beginn der externe INT1 aktiviert und damit begonnen Nullen an die Pixel zu senden. Dabei wird erstmal von der maximal möglichen Pixelanzahl ausgegangen (675 Pixel). Pixel Nummer 1 "nimmt" sich die ersten 24 Bit und reicht den Rest weiter, Pixel Nummer 2 "nimmt" sich Bit 25-48 und gibt alle weiteren Bits weiter, usw. Hat nun auch das letzte Pixel seine 24Bit erhalten, so gibt es bei Emfang weiterer Bits diese Daten an den INT1 Pin des µCs weiter, wodurch ein Interrupt ausgelöst wird. In der ISR wird nun mit Hilfe eines Zählers, der während der Ausgabe mitläuft, die Anzahl der angeschlossenen Pixel berechnet.


    Stellt man die Verbindung zwischen letztem Pixel und µC nicht her so speichert das Programm die maximale Pixelanzahl, was aber auf die Ausgabe von Glediator- Daten keine Auswirkung hat, da dann mit der per TPM- Protokoll gesendeten Framegröße gearbeitet wird. Allerdings funktioniert das Standaloneprogramm dann nicht mehr wie es soll. Soll heißen bei beispielsweise real 80 angeschlossenen Pixeln wandert ein Leuchtpunkt vom ersten bis zum letzten Pixel aber anstatt nach dem letzten Pixel wieder von vorne zu beginnen durchläuft der Punkt auch noch die weiteren 595 virtuellen Pixel bevor er wieder am Anfang erscheint.


    Soviel dazu.


    Und vielen Dank Pesi, sowas ist genau das was ich mir vorgestellt habe. Habe anhand dessen nochmal den Quellcode etwas aufgeräumt und abgesehen davon, dass ich es jetzt für "ordentlicher/ sauberer" halte, habe ich auch noch einen groben Fehler entdeckt. Und zwar war es so, dass ich beim Ausrechnen der maximal möglichen Pixelanzahl von gesamten SRAM minus der reservierten Bytes für den Framesize ect. ausgegangen bin. Was ich aber total vergessen hatte war auch noch den Stack mit zu berücksichtigen. Letztendlich ändert das aber nicht allzuviel, ich musste nur die maximale Pixelzahl von 676 Pixeln auf 675 reduzieren.


    Die aktualisierte Software (Diesmal mit allen Dateien ;) ) befindet sich wie immer im Startpost.


    PS: Ein Video dazu folgt demnächst. Nächste Woche sollte ich nochmal 20 Platinen erhalten mit denen sich die Matrixgröße auf dann 160 Px verdoppelt.


    Gruß
    Dennis

  • Hallo Leute,


    ich habe am Wochenende mal wieder etwas
    Zeit gefunden um an meinen Platinen weiterzuarbeiten.


    Ersteinmal habe ich das Layout der
    Basisplatinen überarbeitet um unter anderem Hinweise und Tipps, die
    hier genannt worden sind, zu beherzigen. (Danke dafür)


    Schaltplan und Layout sehen nun
    folgendermaßen aus:




    Hier in aller Kürze die Änderungen:

    • Standard - LED – Beschaltung aus
      Datenblatt übernommen


    • Statt Leitungen für die
      Stromversorgung VCC als Polygon auf Oberseite sowie GND- Polygon auf
      Unterseite eingefügt


    • Anschluss auf Rückseite zur
      Spannungsversorgung ODER für Stützkondensator


    • Stift- bzw. Buchsenleiste oben
      und unten von 2 auf 4 Pol erweitert


    • 3 Lötbrücken eingefügt, um auf
      Jumper und fliegende Verkabelung z.T. verzichten zu können

    Zudem habe ich mich mit der µC-
    Platine beschäftigt. Zuerst hatte ich vor diese separat zu
    erstellen, also eine eigene Platine, die am Ende z.B. hinter der
    Matrix angebracht werden kann. Da aber u.a. eines der Ziele dieses
    Projektes sein soll mich näher mit dem Löten von SMDs
    auseinanderzusetzen und auf der Basisplatine noch reichlich Platz
    war, habe ich den µC kurzerhand auf die Rückseite ebendieser
    verfrachtet. Als dann immer noch reichlich Platz übrig war, wurde
    der USB/UART- Wandler (FT232) ebenfalls direkt integriert.






    Insgesamt bin ich mit den Platinen nun
    soweit zufrieden. Einziger Wermutstropfen ist, dass man auf den
    Basisplatinen je nach Position in der Matrix Lötbrücken einfügen
    muss. Dies hält sich aber in Grenzen beispielsweise müsste man bei
    einer 32x16 Matrix, die folglich aus 16x8 Platinen besteht, nur 16
    Brücken einfügen.


    Soweit so gut, unschlüssig bin ich mir
    nach wie vor noch bei der Dimensionierung des Stützkondensators C5
    auf der Basisplatine. Ich plane alle 3 Platinen die Spannung neu
    einzuspeisen, d.h. Ein Einspeisepunkt „versorgt“ jeweils 9
    Platinen was theoretisch unter Volllast (Weiß) 2,16A entsprechen
    würde ( Im „normalen“ Betrieb z.B. Plasma- Animation ca. 2/3
    davon). Ich gehe doch richtig davon aus, dass es am Besten wäre auf
    den umliegenden 8 Platinen jeweils einen Kondensator zu platzieren?


    2Bl schrieb ganz zu Anfang mal was von
    ca. 10µF. Würde das immer noch für o.g. Szenario gelten?


    Über Ratschläge und Tipps bzgl.
    Layout und Kondensatorproblemchen würde ich mich sehr freuen.


    Danke und viele Grüße
    Dennis

  • Hi DRS


    Das sieht ja mal sehr gut aus!


    Was mir aber beim drüber gucken aufgefallen ist, ne Kleinigkeit, dass du keinen SMD Quarz benutzt.
    Warum?


    Das wäre ein HC49UP (eagle) in SMD den du mit einplanen könntest und schon 2 Löcher weniger ;)


    Beste Grüße und weiter so


    Denis

  • Hi dres,


    schon schick. Dein "Einziger Wermutstropfen" kann man auch noch lösen, indem man die DIN, DOUT Pins entweder nicht mit bestückt oder nach dem auflöten wegschneidet, an stellen wo man sie nicht braucht... Dann ist fast alles wie bei meinem System :D Aber hat sich bewährt, kann ich nur empfehlen ;)


    Kondensatoren kann man nicht so pauschal sagen... viel hilft viel, aber geht auch ins Geld... ich hab für 6 LEDs 10 uF (cermet) und bin damit bisher gut gefahren!


    Sehr gut finde ich deine Idee mit dem Masterpixel... einfach, einfach :thumbup:


    Grüße


    Basti

  • Hello,
    ein SMD Quarz ist mir erst gar nicht in den Sinn gekommen, habe aber gerade mal bei Reichelt geguckt und festgestellt, dass der billigste 16MHz Quarz 5mal teurer ist als das Pedant in THT. Zudem weiß ich aufgrund der Produktfotos gar nicht, ob ich den überhaupt per Hand gelötet bekomme. Also nicht wegen der Größe sondern weil die Pads auf der Unterseite liegen und ich nicht erkennen kann inwieweit man da von der Seite rankommt.


    Counterfeiter
    Ja, nee genau das wollte/ will ich mit den Lötpads umgehen ;) Im Moment sehe ich die Platinen immernoch mehr als Bauklötze, die man ständig neu zusammenstecken kann um zu gucken, wie es dann wirkt. Das ist dann denke ich einfacher/ angenehmer eben mal ne Lötbrücke zu trennen/ verbinden als im Zweifelsfall Stiftleisten aus- oder einzulöten.



    P.s. Mir ist aufgefallen, dass ich euch noch ein Video vom Empfangs-Timeoutprogramm schuldig bin. Die mit LEDs bestückten Platinen liegen zwar seit fast einem Monat hier rum, allerdings sind mir Stiftleisten und Kondensatoren ausgegangen und es hat sich noch nicht genug weiteres Zeug angesammelt, dass sich eine Bestellug lohnen würde... Aber sofern hier keine gigantischen Designfehler gefunden werden, sollte die Platinen und Bautteilbestellung am Wochenende rausgehen.

  • Soweit so gut, unschlüssig bin ich mir
    nach wie vor noch bei der Dimensionierung des Stützkondensators C5
    auf der Basisplatine.

    C5 würde ich als normalen Abblockkondensator drin lassen. Ein Stützkondensator wäre dann noch zusätzlich zu setzen.

  • Moin,
    erstmal danke für die Antwort Kanwas, allerdings verstehe ich sie nicht so ganz...
    Ich bin eigentlich immer davon ausgegangen das Abblock- und Stützkondensator Synonyme sind.
    Und was soll in diesem Zusammenhang "normal" bedeuten?


    Ich will hier ja wirklich niemanden vor den Kopf stoßen oder undankbar klingen aber es bringt mir nicht viel wenn ihr mir sagt, WAS ihr machen würdet, viel hilfreicher wäre es doch zu erfahren WARUM ihr es so machen würdet.


    Hier nochmal meine Gedanken zu der Thematik:
    Jede LED hat ihren eigenen 100n Kerko ( wie auch im DB empfohlen wird), welcher Stromimpulse ausgleicht und so hilft die Spannung im Rest der Schaltung zu stabilisieren (C1- C4). Diese können ihre Energie sehr schnell auf- bzw. wieder abgeben. Zusätzlich habe ich nun auf Anraten noch einen weiteren Kondensator pro Platine vorgesehen (C5). Meine Idee wäre, dafür einen Elko mit etwas größerer Kapazität zu verwenden. Diese können, im Vergleich zum Kerko, ihre Energie langsamer auf-/ und abnehmen, könnten daher quasi als Puffer dienen. Bauformbedingt besitzen sie aber auch einen induktiven Anteil, wäre also zu klären, ob sie am Ende nicht sogar mehr schaden als helfen würden.


    Gruß
    Dennis

  • Ich unterscheide schon ob es ein Stütz- oder Abblockkondensator ist.


    Ein Abblockkondensator kommt i.d.R. an jeden Spannungsversorgungspin eines ICs und soll dort halt Störungen und Spannungsschwankungen eliminieren. Hier kommen dann Hauptsächlich schnelle Keramikkondensatoren zum Einsatz im nF Kapazitätsbereich.
    Stützkondensatoren haben für mich eine Speicherfunktion. Die werden eingesetzt wenn ich eine Spannung z.B. bei Laständerung konstant halten möchte. Z.B. als Kondensator im NT oder wie hier auf der einzelnen Platine. Hier kommen dann Elektrolytkondensatoren im µF Kapazitätsbereich zum Einsatz

  • Moin,
    danke Kanwas für die Erläuterung. Ganz verkehrt lag ich mit meinem Erklärungsversuch im vorangegangenen Post ja nicht.
    Habe mich nun für einen 10µF SMD Elko als Stützkondensator pro Platine entschieden.


    Am Wochenende bestelle ich dann ein paar Platinen, mal schauen, ob ich sie noch vor Neujahr verschickt werden.