Test obciążenia CPU
Na rysunku 11 zostały pokazane pomiary czasów realizacji funkcji w trakcie działania pętli main. Przebiegi obrazują następujące funkcje:
- żółty – linia danych WS2812,
- błękitny – przerwanie TX UART obsługujące SPI,
- fioletowy – linia UART DMX512 (bajt $FF),
- niebieski – pętla main.
Widać tam bardzo silne obciążenie CPU (dochodzą jeszcze przerwania od timera0, ADC, których nie pokazano na oscylogramie), w pętli głównej wykonuje się po 12 czasem tylko 2 rozkazy pomiędzy przerwaniami. Wydaje się, że taki program nie ma prawa działać ale program główny „nadrabia” w dwu przypadkach:
- pomiędzy transmisjami do LED występuje przerwa 50 ms,
- sygnał DMX ma stosunkowo długą przerwę po wysłaniu ramki DMX.
Niestety w praktyce okazało się, że taki mechanizm czasami powoduje gubienie danych DMX. Problemu nie byłoby, gdyby UART mikrokontrolera miał np. 16 a nie 2 bajty FIFO. Na szczęście przewidziałem miejsce na zewnętrzny UART. Oczywiście możliwa jest próba dopracowania procedur obsługi DMX przez UART mikrokontrolera ponieważ linia DMX jest do niego doprowadzona. W kodzie źródłowym znajdują się linie #define DMX_IN i #define DMX_OUT umożliwiające wyłączenie zewnętrznego UART.
USB
Konwersję komunikacji USB zapewnia układ FT221. Jego zaletą jest szybka komunikacja po SPI oraz dostęp do pamięci konfiguracji. Możliwości układów były już opisywane na łamach EP (pierwszy odcinek kursu w EP 7/2017). Układ FT221 nie wymaga konwersji poziomów na liniach. Rezystory o wartości 0 Ω zastosowano w innym celu. Przy komunikacji z FT221 przez programowe SPI montujemy tylko rezystor 0 Ω pomiędzy pinami 8 i 9 drabinki RP1. Jeśli zaszłaby potrzeba komunikacji równoległej, należy zamontować wszystkie rezystory, a podczas komunikacji z układem odłączać klucze 4053 odczytujące stan joystick-ów (sygnał SEL), co z kolei spowoduje konieczność modyfikacji odczytu stanów joystick-ów i prawdopodobnie przeniesienie tej funkcjonalności z przerwań do pętli głównej.
Z układem można komunikować się, także przez sprzętowe SPI. W tym celu używa się bramki trój-stanowej realizującej funkcję bramki OC (U7C). Poza modyfikacją programu należy zamontować zworę JP3. Trzeba pamiętać, że SPI jest używane do komunikacji z kontrolerem UART, który może wykorzystywać mechanizm przerwań. Trzeba o tym pamiętać i zastosować mechanizm semaforów. Z tego właśnie powodu zdecydowano się na programowe SPI.
Dane DMX przychodzące przez RS485/422 mają większy priorytet niż DMX przez USB. Jeśli więc dane będą przychodzić po RS, informacja po USB będzie ignorowana.
Joystick-i
Aby zademonstrować możliwości diod, płytkę wyposażono w dwa joystick-i analogowe z przyciskiem. Można je odłączyć ustawiając linie SEL w stanie wysokim co zdezaktywuje klucze 4053. Jeśli opcja sterowania kluczami nie jest potrzebna, można zewrzeć piny 3-4 JP4, a port PD4 wykorzystać w innym celu. Przy braku transmisji DMX uruchamia się jedna z wybranych gier. Opcje tę można wyłączyć konfigurując urządzenie przez USB.
Praca jako konwerter USB-DMX
Urządzenie może pracować jako konwerter USB-DMX. Zdekodowany sygnał, poza sterowaniem diodami WS2812, dostępny jest na złączu J9. Niestety FT221 nie potrafi wykryć sygnału BREAK synchronizującego początek ramki DMX. Z tego powodu realizowane jest to programowo na zasadzie wykrycia długiego sygnału MARK. W konsekwencji, praca w tym trybie nie jest gwarantowana z każdym programem. Prototyp bez większych problemów działał z DMX512 Light Control ale współpraca z USB2DMX512DEMO napisanego w Delphi była niemożliwa. Dane na wyjście DMX są transmitowane zarówno w trybie konwerter DMX (odbiór danych z USB) jak i gdy są odbierane z RS485/422.