Akcelerator WS2812 dla Arduio, AVR, PIC

Miejsce dobre do dyskusji nad własnymi projektami - pochwal się wszystkim co samodzielnie stworzyłeś.
ODPOWIEDZ
es2
-
Posty: 70
Rejestracja: 13 mar 2018, 9:47

Akcelerator WS2812 dla Arduio, AVR, PIC

Post autor: es2 » 04 lis 2019, 12:21

Diody WS281x pozwalają na uzyskanie zaskakująco ciekawych efektów świetlnych. Do komunikacji wystarcza jeden pin mikrokontrolera. niestety, przy sterowaniu większej ilości LED pojawiają się problemy. Wysłanie danych do jednej diody zajmuje 30us-niedużo. Do 10LED 300us, do 100 LED 3ms,do 1000LED 30ms. Pawie wszystkie funkcje obsługi LED zawieszają przerwania na czas transmisji danych do diod. Czy jest to problem? To zależy, gdy np chcemy odbierać dane z UART przy niewielkiej prędkości 9600, w 30ms przesłane może być ok 30 znaków i tyle można stracić (przerwania są zawieszone). Przy 115200, w tylko 300us (czas transmisji do 10 LED) można zgubić ok 3 znaków (AVR ma 2 bajtowe FIFO), przy 100LED ok 30.
Co z tym zrobić? Można użyć UART do wysyłania danych do LED ale sa pewne ograniczenia. CPU musi być taktowany co najmniej 18MHz więc wiele AVRmega odpada. Obciążenie CPU będzie na poziomie 80..90% w czasie transmisji do LED. Inne przerwania nie mogą blokować przerwań od UART obsługującego LED na zbyt długo, problemem są więc przerwania od innych UART (najczęściej konieczne wstawki ASM) i wejść INT wyzwalanych poziomem. Ponadto, modyfikacja przerwań od UART, w przypadku platformy Arduino, może być dużym wyzwaniem.
Czy naprawdę nie ma wyjścia z sytuacji?
Jest - akcelerator WS2812. Zachowuje się jak swego rodzaju karta graficzna. Dane można wysyłać do niej po SPI lub I2C (istnieje opcja UART i USB). Nie dość, że w czasie transmisji danych do akceleratora działają przerwania, to sama transmisja do akceleratora może być zrealizowana na przerwaniach! Co więcej, wysyłając dane taktując SPI zegarem 4MHz można je wysłać w czasie ok 4 razy krótszym niż trwa transmisja danych do LED. Decydując się na paletę barw 8-bit, czas ten jest 12 razy krótszy! przy palecie 16-bit czas jest 6 razy krótszy a przeważnie różnicy pomiędzy 24 a 16 bit nie widać.

O akceleratorze można będzie przeczytać (mam nadzieję) w najbliższych wydaniach EdW. W załączniku ekran z analizatora pokazujący wysłanie danych dla 100LED.
SPI 4MHz 100 LED 1ms.gif
(117.04 KiB) Pobrany 30 razy
Ze względu na specyfikę AVR, zmiana zegara z 4 na 8 MHz nie daje przyrostu szybkości wysyłania danych o 100%
SPI 8MHz 100 LED 745us.gif
(99.1 KiB) Pobrany 19 razy
Rozsądny wydaje się zegar 2MHz
SPI 2MHz 100 LED 1_67ms.gif
(114.45 KiB) Pobrany 17 razy
który jak się okazuje, nie jest 2 razy wolniejszy od 4MHz.
Z czego wynika fakt niespodziewanie wolnej transmisji przy taktowaniu SPI zegarem 8MHz?
Wszystko wyjaśnia rysunek
SPI 8MHz.gif
(134.75 KiB) Pobrany 8 razy
Jak widać przerwy pomiędzy przesyłanymi bajtami potrafią być dłuższe niż czas transmisji bajtu. Powodem długich przerw jest konieczność zaadresowania i pobrania kolejnego bajtu danych co zajmuje kilkanaście rozkazów a CPU w czasie transmisji bajtu jest w stanie wykonać 16 cykli zegarowych co przekłada się średnio na ok 12 rozkazów.

Optymalne wydaje się taktowanie 2MHz ale ja osobiście używałem trybu I2C. Głównym powodem jest to, że wystarczą 2 linie uC. Teoretycznie, w przypadku SPI potrzeba tylko 3 linii (SS, SCK, MOSI) więc niewiele więcej (MISO nie jest wymagane, nie trzeba czytać danych z akceleratora) ale w przypadkuAVR nie ma możliwości, aby nieużywane linie interfejsów (UART - tryb1 kierunek, podobnie SPI) używać w roli GPIO. Taka linia musi pełnić funkcję alternatywną.Czyste marnotractwo, to kolejny powód aby zrezygnować z przestarzałych, drogich, AVR na rzecz nowoczesnych,szybkich, co ważne tanich ARM.

Zachęcam do zapoznania się z tematem https://forum.elportal.pl/viewtopic.php?f=62&t=14998. Nawet na AVR (w przykładzie, kultowe ArduinoUNO) można uzyskać zaskakujące efekty https://www.youtube.com/watch?v=HsY9-6l ... ex=12&t=0s za połowę cenyFT80x. Niedługo także na takim https://www.youtube.com/playlist?list=P ... 86bcULhy33 wyświetlaczy, AVR będzie mógł "szaleć". Co prawda uC tani nie będzie (ok 40zł) ale to i tak tanej niż wyświetlacz ze sterownikiem FT80x,który kosztuje 130..150zł (wyś z IL9486 ok 50zł + uC akceleratora ok 40zł).

ODPOWIEDZ