tlc5947 LED-Treiber ohne ständig uC-Pins zu belegen

Ich arbeite an einem TLC5947-Chip, um 24 RGB-LEDs zu steuern und damit verschiedene Muster zu erstellen. Meine Sorge ist, dass ich dem SIN-, SCLK- und XLAT-Pin des Mikrocontrollers in jeder Schleife Befehle erteilen muss, damit sich mein Muster immer wieder wiederholt.

Mein Mikrocontroller erledigt auch andere Dinge, wie das Sprechen mit Sensoren, das Steuern externer Peripheriegeräte usw.

Wollte wissen, ob es einen Weg/Hack in der Hardware/Software gibt, mit dem ich die Sequenz mit dem LED-Treiber-IC wiederholen kann, während mein Mikrocontroller unbesetzt bleibt?

Mikrocontroller sind billig. Warum nicht einen für die Sequenzierung der LEDs verwenden?
Einfache Antwort: Verwenden Sie TLC59116 anstelle von TLC5947. I2C-Schnittstelle statt seltsamer Schnittstelle für konstanten Datenstrom.
Welcher Arduino ist das? Mit modernen MCUs ist es möglich, sie vollständig im Hintergrund laufen zu lassen, indem SPI mit DMA im Non-Stop-Circular-Modus verwendet wird.
Ich stimme @Majenko zu, ich liebe den TLC59116!!
@ Majenko und KyranF, ich bin ein Fan des TLC59711 (und habe eine Bibliothek dafür geschrieben). Während die Schnittstelle nicht I2C ist, beträgt die Datenübertragungsrate bis zu 10 MHz, und es gibt Adafruit-Boards. :)

Antworten (2)

Der übliche Weg, mit solchen Dingen umzugehen, ist ein periodischer Timer-Interrupt. Angenommen, Ihre Schleife muss sich alle 50 ms wiederholen, einen Hardware-Timer einrichten, um den Prozessor zu unterbrechen, Ihre Anzeige aktualisieren und von der ISR (Interrupt Service Routine) zurückkehren. Wenn Ihr aktueller Codierungsstil das Verschwenden von Millionen von Zyklen in Verzögerungsschleifen beinhaltet, wird das beseitigt. Wahrscheinlich verwenden Sie ein schnelles Hardware-SPI, um mit dem Chip zu kommunizieren, sodass es nicht lange dauert, bis 72 Bit Ein/Aus-Daten ausgegeben werden, vielleicht < 100 us, sodass bei einem 50-ms-Interrupt immer noch 99,8 % Ihrer Prozessorbandbreite verfügbar sind (praktisch 'unbesetzt' aus praktischen Gründen)

Für die "anderen Dinge", die Sie tun, scheint Ihr Prozessor etwas (je nachdem, wie viel Zeit Ihr ISR benötigt) langsamer und etwas ruckeliger in seinem Betrieb zu sein (er geht manchmal ein bisschen weg). Es ist normalerweise nicht allzu schwierig, dafür zu codieren.

+1, um "Zillionen von Zyklen in Verzögerungsschleifen" nicht zu verschwenden, ein allzu häufiges Problem. Die übermäßige Verwendung schlampiger Routinen mit fester Verzögerung kann von all den einfachen Beispielroutinen herrühren, die häufig mit Compilern usw. geliefert werden. Sie können eigenständig funktionieren, verursachen jedoch Probleme, wenn versucht wird, sie mit anderen Funktionen zu integrieren.
@Tut Ich denke auch, dass es die schreckliche Qualität des Beispielcodes ist, der Leuten gegeben wird, die versuchen, ein kleines Stück Funktionalität zu zeigen, also kümmern sie sich nicht darum, angemessene Verzögerungen zu entwerfen oder die richtige Nutzung der Zeit zu zeigen.
Danke für die schnellen Antworten, Jungs, Hardware-Interrupt ist das, was ich als nächstes versucht habe. Keine Verzögerungsroutinen mehr im Code ;)
@Spehro, während Ihre Antwort im Allgemeinen ein guter Rat ist , ist sie weniger gut für den TLC5947, der keine regelmäßigen Eingaben vom Mikrocontroller benötigt, siehe meine Antwort hier.
@UlrichStern Ich habe aus der Frage entnommen, dass das Muster nicht statisch war. Um das Muster mit der Zeit zu ändern (sich über einen längeren Zeitraum zu wiederholen), muss neu geschrieben werden, und damit ist ein Timing verbunden.
@Spehro, ich habe die Frage noch einmal gelesen, und Sie haben vielleicht Recht. Es dauert 12 * 24 = 288 Bit, um den Chip zu programmieren, und die von Ihnen vorgeschlagene Hardware-SPI kann auf einem Arduino Uno mit etwa 4 Mbit / s übertragen (siehe meine Messungen ).

Ich habe den TLC5947 in Betracht gezogen, und sein Datenblatt behauptet, er habe eine "automatische Anzeigewiederholung", sodass die PWM ohne periodische Eingabe vom Mikrocontroller funktionieren sollte. Ich habe auch einen kurzen Blick auf die Arduino-Bibliothek von Adafruit für den TLC5947 geworfen und keine Interrupts usw. gesehen.

Aber am Ende habe ich den TLC5947 nicht verwendet, weil er "Flackerprobleme" hat, und stattdessen den TLC59711 verwendet, für den ich sogar eine Bibliothek geschrieben habe . Einzelheiten zum Flackern finden Sie in meinem Disqus-Beitrag .