Hallo zusammen, ich möchte eine WS2812b-Kette mit einem ATSAMC21G18A ansteuern. Um eine hohe Framerate zu erzielen und das darzustellende Bild der LEDs zwischen den Frames berechnen zu können, soll die Ausgabe an die LEDs möglichst stark „in Hardware“ passieren. Mein Ansatz (ein ähnlicher Ansatz wurde hier im Forum schon mal mit einem ATTiny neuerer Generation angestellt): - Serialisierung des Puffers mit einem SERCOM SPI Master (nur MOSI und XCK) - TCC 0 PWM Kanal 0 generiert immer das „0“ Timing - TCC 0 PWM Kanal 1 generiert immer das „1“ Timing - CCL LUT0 Inputs: PWM0, PWM1, MOSI - CCL LUT0 Output: (MOSI und PWM1) oder (nicht MOSI und PWM0) Die einzelnen Komponenten verhalten sich wie gewollt, allerdings muss der TCC nun noch synchron zum Bit Timing des SPI laufen. Ich würde gerne den TCC im Oneshot Mode laufen lassen und über eine Flanke des SERCOM XCK triggern. Nur soweit ich sehe, ist SERCOM nicht in der Lage, Events zu generieren. Ich habe das XCK Signal aus einem Pin heraus, in einen anderen Pin verbunden, dort einen EXTINT für generiert, der ein Event sendet, das den Timer triggert. Das funktioniert im Prinzip, hat aber eine zu hohe Latenz. So verliere ich am Anfang der Sequenz ein bit. Es ist mein erstes Projekt auf der ATSAM Plattform. Sehe ich da irgendeinen Trick nicht? Meine letzte Idee wäre nur, den Puffer in Software in eine Sequenz aus Duty Cycles umzurechnen und diese Sequenz per DMA in den Timer zu schieben. Ähnelt der Methode, den SPI schneller laufen zu lassen und aus je drei SPI bits ein WS2812 bit zu generieren: Bei beiden Ansätzen muss ich im Speicher einen Puffer mit Hilfsdaten ablegen. Schöner wäre es natürlich, wenn ich nur RGB Werte ablege und die Hardware kümmert sich um das Verschicken. Ich verwende Atmel Studio 7 und ASF, falls das relevant ist. Gruß Thomas
Falls mal jemand eine Lösung sucht: SPI als Slave mit DMA laufen lassen. SCK mit dem Timer generieren und (leider außenrum über Pins, weil keine interne Verbindung mit Events möglich ist) verbinden. So kann man sich mit dem Timer die serialisierten Bits raustakten. Führt zu einer WS2812 Ansteuerung komplett in Hardware. Verwendet ein SERCOM, drei CCL LUTs, drei TCCs, 1-2 DMA-Kanäle und eine handvoll Events. Keine Interrupts, keine CPU Verwendung. Man schreibt in ein Array und das wird mit 50 Hz auf den LEDs ausgegeben. Gruß Thomas
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.