Zealota napisał(a):
Wracając do tematu nie rozumiem na czym ma polegać ta akceleracja.
Dane można wysyłać taktując SPI zegarem 8MHz. Sterując bezpośrednio LED zegar to 800kHz. Wysłanie danych do 640 LED zajmie 19ms - 1/(800000/24/640). Używając SPI 1,9ms - 1/(8e6/24/640) więc 10 razy mniej czasu. Gdy użyjemy palety 16-bit 1,2ms - 1/(8e6/16/640), 8-bit 0,64ms - 1/(8e6/8/640). Bezpośrednio WS2812 nie przyjmą danych 8 czy 16 bit, tylko i wyłącznie 24-bit. Akcelerator konwertuje dane z 8/16 bit na 24. Dane do samych led będą więc wysyłane tyle i muszą ale mikrokontroler wysyłając do akceleratora może to zrobić szybciej a także i wolniej.
Przerwy w transmisji danych do akceleratora w niczym nie przeszkadzają gdyby takie przerwy zrobić podczas transmisji danych do LED efekt jest znany.
Zealota napisał(a):
Obejście zajęcia pamięci to mogę zrozumieć. Kodujemy kolory w buforze pamięci RAM na 16 bitach (nie na 32, gdzie 32-24=8 bitów jest pustych).
Nic nie jest puste. Konwersja z 16 na 24-bit wygląda podobnie jak z 16 na 18 w LCD. W przypadku 8-bit gdy wybieram kolor np 1, to jest mu przypisane RGB(255,0,0), kolor 2 to np RGB(0,255,0) itd według "bezpiecznej palety" 218 barw
https://pl.wikipedia.org/wiki/Kolory_w_InternecieZealota napisał(a):
Musimy pamiętać, że i tak musimy posłać szeregowo 24 bity - brakujące bity zerujemy tak, by pojedynczy stan PWM miał nieznaczące zera, niestety tracimy na zakresie jasności.
Jak już napisałem nic się nie traci. W przypadku 16-bit dane transkodowane sa z R5G6B5 na R8G8B8 przy czym nie jest tak, ze najmłodsze bity sa zerowane. Tak jak w przypadku transkodowania w LCD z 16 na 18-bit, tak i tu, stan najmłodszych bitów danych wyjściowych jest zależny od stanu najstarszych bitów wejściowych.
W przypadku trybu 8-bit 218 barw powstał problem regulacji jasności, którego nie ma w 24 czy 16 bit. Jak kolor czerwony ma przypisane RGB(255,0,0) to ma i konie. Dlatego wprowadziłem możliwość regulacji jasności (32 poziomy), podobnie w trybie 8-bit R3G3B2. Tu działa także mechanizm jak w LCD. Na przykładzie barwy niebieskiej gdzie sa tylko 2 bity na kolor.
bity wejściowe 00 to wyjściowe 00000000
01 -> 01010101
10 -> 10101010
11 - > 11111111
Kolejna zaleta, to że w czasie transmisji danych do akceleratora działają przerwania a nawet można zrealizować ją na przerwaniach. To na AVR jest możliwe, ale jak pisałem, nie łatwe i ma sporo ograniczeń.
Podsumowując:- Dane mogą być wysyłane szybciej (SPI 8MHz) niż gdyby bezpośrednio sterować LED.
- Kolory można kodować także w 16 bit co zmniejsza czas transmisji o 33% jak i o tyle zapotrzebowanie na RAM.
- Możliwe kodowanie 8-bit co zmniejsza czas transmisji o 66% jak i o tyle zapotrzebowanie na RAM.
- Bezproblemowo działają przerwania.
- Transmisja może być realizowana na przerwaniach.
Teraz kończę akcelerator graficznych LCD. Przyspieszenie wynika z:
- Transmisji 8 a nawet 4-bit.
- Kodowania współrzędnych jednym a nie dwoma bajtami (dla LCD do 255x255).
- Komend CLS, LINE, STRING coś jak w FT801.
Łatwo oszacować przyspieszenie. Kodowanie 8-bit to w przypadku wysyłania treści obrazka dwa razy mniej danych. Gdy użyjemy 4-bit (16 barw) to wysłanie rysunku np ikony daje przyspieszenie 4 krotne.
Przy stawianiu pojedynczych pikseli, klasycznie wygląda to tak:
CMD, X, Y, COLOR, łącznie 7 bajtów (CMD jeden, pozostałe po dwa)
Do akceleratora:
także CMD, X, Y, COLOR ale wszystkie dane 8-bit co daje 4 bajty. Przyspieszenie ok 43%.
W przypadku wysyłania stringu czy linii przyspieszenie jest rzędu setek a nawet tysięcy razy.
------------------------ [ Dodano po: 33 minutach ]Taki akcelerator można by zbudować na AVR ale:
- W czasie transmisji danych do LED przez akcelerator nie może odbierać danych z mikrokontrolera sterującego. W konsekwencji trzeba zapewnić mechanizm czekania mikrokontrolera aż akcelerator będzie gotów. W praktyce max odświeżanie spada więc 2 razy. W ARM problemu nie ma dane wysyłane są do LED a CPU przyjmuje kolejną ramkę do wyświetlenia.
- AVR nie przyjmie danych po SPI taktowanym 8MHz. Nie próbowałem, ale prawdopodobnie max to 1MHz co daje 128 cykli maszynowych pomiędzy bajtami. Ile rozkazów? Można szacować jakieś 90. Szału nie ma a trzeba jeszcze wejść/wyjść z przerwania, odłożyć/zdjąć dane na/z stos. Można kombinować w pętli głównej. Przy 2MHz pomiędzy bajtami są tylko 64 cykle (ok 45 rozkazów), 4MHz 32 cykle (22 rozkazy) 8MHz 16 cykli (11 rozkazów).