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