Umieszczam ten post w dziale Asemblera, gdyż póki co piszę w ASM.
Chciałbym podpytać Was o pewien aspekt użytkowania led WS2812. Nie oglądałem końcowych poradników Mirka o WS-Ledach, na forum Atnel też nic nie znalazłem, więc nie wiem czy temat był omawiany. Otóż rozchodzi się o takie zjawisko jak RESET CODE, czyli czas, który trzeba odczekać by ponownie odświeżyć WS-y. Z poradnika jak i z noty PDF WS2812 można dowiedzieć się, że ów czas wynosi >50us. System, do którego podpiąłem WS-y, składał się z 8 kanałów po 128 ledów/kanał (w sumie sterowanie 1024 ledami). Oczywistym jest, że aby wysłać paczkę informacji GRB, w moim przypadku trzeba przeznaczyć 30us*128led (ok 4ms/kanał) Tak się złożyło, że mój Systick, czy jak kto woli Heartbit systemu to 1ms, czyli zmuszony jestem zakłócić transfer z bufora do LEDów na rzecz sprzętowego przerwania co 1ms. Oto jak wysyłam bufor do WS2812 (w uproszczeniu):
Start:
cli;wyłączenie przerwań
rcall wyślij_kolor;GRB (24bity)
sei; zezwolenie na przerwanie
Rjmp Start
Czyli po wysłaniu koloru GRB (po ok 30us) zezwalam na wywołanie przerwania np. Systick.
Wg noty mam do 50us na dowolne działania, by ponownie powrócić do kontynuacji transferu, bez resetu transmisji do WS. I tu niespodzianka. Maksymalny czas na jaki mogę przerwać transfer to ok 5,5us, czyli ok 10 raz mniej niż podaje PDF WS2812. Gdy zwiększę czas przerwania >5, 5 us to zaczyna się „choinka” na Ledach, zamiast konkretnych sekwencji. Okazuje się, że nie tylko ja miałem z tym problem.
Software jest ok, ponieważ poszukałem po sieci i znalazłem :
http://wp.josh.com/2014/05/13/ws2812-ne ... know-them/Czy Wy również mieliście taki problem?