Forum: Mikrocontroller und Digitale Elektronik Atmel AT SAM C21: Timer und SERCOM synchronisieren?


von Thomas S. (schlot)


Lesenswert?

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

von Thomas S. (schlot)


Lesenswert?

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
Noch kein Account? Hier anmelden.