Port WaveForms SDK na Pascal UART - Digital I/O i obsługa protokołów część 3 |
|
||||||||||||
W materiałach marketingowo-propagandowych dotyczących Analog Discovery 2 spotykamy wzniosłej natury ochy i achy nad jego kluczowymi funkcjonalnościami: oscyloskopem, generatorem przebiegów i analizatorem stanów logicznych. Jest to zrozumiałe, dzięki tym składnikom urządzonko jest poręczne i przydatne w warsztatowej codzienności. Owa codzienność natomiast bywa nierzadko bardzo złośliwa i często dalsze prace blokuje nam niby drobny problem ‘niemania’ – a to konwertera USB/RS232 w TTL, a to układziku, w którym na szybko i na boku można przetestować wyświetlacz z SPI czy przetwornik z magistralą I2C. Co ciekawe, zdarza się to (mi przynajmniej) w chwilach, gdy po nocy sklepy wszelkie zamknięte, a wydzwanianie do znajomych jest z uwagi na porę doby jakby nieco ryzykowne. Oczywiście, można poradzić sobie doraźną rzeźbą z udziałem Arduino czy innego Nucleo, ale pod warunkiem, że mamy to akurat pod ręką i niezagospodarowane. No i jednak wnosimy dodatkowy element ryzyka, jakby już mało było kłopotów. Tu z pomocą przychodzi nam ulubione AD2 z dodatkowymi funkcjami obsługi transmisji szeregowej UART, SPI oraz I2C, które to są dostępne w cyfrowej części naszego magicznego pudełeczka. Do faktu, że analizator stanów logicznych jest na tyle cwany aby zapewnić ładną wizualizację wspomnianych protokołów to już jesteśmy przyzwyczajeni, pokazywałam z resztą w kilku postach jego ekrany. Warto zatem wiedzieć, że AD2 potrafi też aktywnie uczestniczyć w transmisji jako nadzorca-inicjator, a nie tylko pasywnie gapić się na biegające tam i nazat zera i jedynki. Obsługa programowa przy pomocy garstki funkcji API nie jest wcale taka skomplikowana, zapoznanie się z tymi zagadnieniami otwiera drogę do robienia na kolanie potrzebnych ad-hoc testowych układów do weryfikacji elementów z magistralą szeregową lub badania czy jakiś nowo nabyty modułek jest sprawny i można się z nim skomunikować. Temat ten nieco obszerny jest, zatem część trzecia wieczorynki niczym przysłowiowy włos zostanie podzielona, ale na części trzy: SPI, I2C oraz UART, od którego zaraz zaczniemy, no to jazda... ❦ pisz do mnie nieustannie Zanim zabierzemy się za klecenie programu w Pascalu zerknijmy na okna WaveForms, dowiemy się co AD2 ma do zaoferowania w temacie obsługi asynchronicznej komunikacji szeregowej. Aby nie było nudo, rozmawiać będziemy ze znakowym modułem VFD typu CU406SCPB-T20A, którego skrótową dokumentację można pobrać z lokalizacji: ➮ CU406SCPB-T20A-05.pdf Podłączenie jest dziecinnie proste – moduł zasilamy z +5V@400mA, zasilanie powinno być dość sztywne, ponieważ przetwornica lampy podczas rozruchu pobiera większy prąd, takoż żarnik (filament) zanim się nagrzeje, ewentualnie ograniczniki prądowe mogą uniemożliwić poprawny start logiki wyświetlacza i będzie nam trudno się z nim porozumieć. Wejście szeregowe modułu SIN łączymy z DIO_0 naszego Analog Discovery 2 i to w zasadzie wszystko. Instalację-wystawkę przedstawiają fotografie: Natomiast na filmiku poniżej mamy pokazane bardziej na żywo jak wygląda komunikacja z VFD: Dziękujemy aplikacji WaveForms, teraz zaczniemy szkicować własne rozwiązanie i aby było szybciej – pierwszy z gotowców dostępny jest już na github: ➮ https://github.com/bienata/AnalogDiscovery2/tree/master/digitaluart1 Kluczowe wywołania, inicjujące transmisję szeregową przedstawia listing poniżej i jak widać – jest to typowy zestaw funkcji konfigurujących UART – ustawianie prędkości transmisji, parzystość, bity stopu. Cenna niezmiernie jest możliwość wyboru cyfrowej końcówki I/O naszego AD2, zarówno do nadawania jak i odbioru. To pozwala raz podłączyć całość instalacji do na przykład dwóch urządzeń, a potem programowo decydować, z którą parą pinów oddelegowanych jako RxD/TxD aktualnie pracujemy.
Wysyłanie znaczków do portu odbywa się przy pomocy jednej funkcji. Można przyjąć, że pracuje ona synchronicznie, to znaczy zwróci sterowanie do naszego programu z chwilą zakończenia transmisji zadanej paczki danych. Wywołanie jest trywialne:
Łącząc to w całość, możemy stworzyć sobie na przykład tymczasowy zegarek VFD, przy okazji mamy okazję poćwiczyć polecenia, które obsługuje nasz wyświetlacz VFD, oto filmik: ❦ szybkie czytanie ze zrozumieniem Odbiór znaków z UART jest oczywiście dostępny w aplikacji WaveForms, w celu demonstracji posłużę się Zerową Malinką, której plik /boot/config.txt wzbogaciłam o jedną ekstra linijkę:
I aby pokazać dowolność w wyborze pinów I/O – Malina z AD została spięta według następującego schematu poglądowego: ![]() owocując plątaniną jak na fotografii poniżej: Taka instalacja sprzętowo-programowa da nam możliwość zaobserwowania w polu tekstowym WaveForms procesu rozruchu malinowego Raspbiana, którego standardowe wyjście jest przekierowane na port szeregowy /dev/ttyS0 pracujący z szybkością 115.2kbaud. Ponieważ mamy zapięte zarówno TxD jak i RxD, komunikacja jest dwustronna, możemy zatem na upartego zalogować się do konsoli i wydawać polecenia w powłoce. Komfort takiej pracy jest wprawdzie mizerny, ale warto umieć i taka partyzantkę odstawić w sytuacji zupełnie kryzysowej. W naturze wygląda to mniej więcej tak: No i zauważmy – nawet z szybkością 115kbaud magiczna puderniczka AD2 wyrabia się doskonale, transmisja jest w miarę stabilna (no...powiedzmy) i do celów np. diagnostycznych raczej wystarczy. Programowe odczytywanie znaczków z emulowanego przez AD2 UART-a jest także dość proste, ale trzeba mieć na uwadze dwie sprawy. Po pierwsze, chęć na transmisję przychodzącą trzeba jawnie wyrazić wywołując funkcję FDwfDigitalUartRx z zerowym rozmiarem buforka odbiorczego, o tak:
Po drugie, SDK nie zapewnia wsparcia dla notyfikacji o dostępnych w buforze odbiorczym danych (event-ów), musimy zatem na pełnych obrotach sprawdzać czy coś czasem nie przyszło i to z bufora wyjmować, inaczej ryzykujemy utratą spójności odbieranego strumienia danych. W praktyce sprowadza się to do nieskończonej pętli odpytującej AD2 i przekazującej dane tekstowe do dalszej obróbki:
Cały programik do podglądu procesu bootowania Maliny przez port szeregowy znajdziemy tu: ➮ https://github.com/bienata/AnalogDiscovery2/tree/master/digitaluart2 I oto końcowy filmik, a tylko w formie komentarza – otwarte ssh z boku służy mi do programowego `przewrócenia` Malinki, nie chciałam się bawić zasilaniem bez potrzeby, stąd osobna sesja na boczku. Tak tylko mogłam wydać polecenie Linuxowi, wplecenie tego w proste pascalowe demko zbyt by go zamotało. ❦ w podsumowaniu odcinka Jak widzieliśmy, przy pomocy SDK nasze AD2 może z powodzeniem pełnić rolę całkiem praktycznego programowalnego konwertera do RS232/TTL. Ważną cechą jest możliwość dowolnego wyboru pinów cyfrowych do komunikacji, to daje wielką elastyczność podczas prac (nawet w moich demkach i VFD i PI były w pewnym momencie zapięte do AD2 razem: DIO_0, DIO_2+DIO_3). Zestaw funkcji do obsługi UART jakich dostarcza WaveForms SDK jest dość spójny, nie ma tam nieintuicyjnych udziwnień i proszę mi wierzyć - jak raz samodzielnie nabazgra się choćby najprostszy programik, dalej idzie błyskiem. Inna moim zdaniem wielka zaleta takiego konwertera z udziałem AD2 jest taka, że można własny programik komunikacyjny uruchamiać w trybie pracy krokowej, pod debuggerem. Ale nie aby go odpluskwiać, ale po to aby mieć pełną kontrolę nad tym co i kiedy jest wysyłane kabelkiem przez tak emulowany RS232 do zdalnego urządzenia. #slowanawiatr, grudzień 2018 |
![]() |
![]() |
![]() |