Port WaveForms SDK na Pascal
UART - Digital I/O i obsługa protokołów

część 3

podstawowe informacje o urządzeniu i sterowanie zasilaczem
cykliczna akwizycja danych i histereza triggera
UART - Digital I/O i obsługa protokołów
I2C - Digital I/O i obsługa protokołów
SPI - Digital I/O i obsługa protokołów (mostek Wheatstone'a)
SPI - Digital I/O i obsługa protokołów (pomiar Iadj w LM317)
Digital I/O - ROM Mode, przerzutnik RS i dekoder do rosyjskiej VFD
Digital I/O - bezpośredni dostęp, wyświetlacz HDSP-2111 i termometr MCP9700
Analog OUT - woltomierz True RMS z przetwarzaniem sygnału

☘☘☘
tryptyk protokolarny

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.

 digitaluart1.lpr
// 9.6kHz
FDwfDigitalUartRateSet( hAd2, double( 9600 ) );
//DIO_0 jako TxD
FDwfDigitalUartTxSet( hAd2, 0 );
// 8 bit danych
FDwfDigitalUartBitsSet( hAd2, 8);
// 0-None, 1-Odd, 2-Even
FDwfDigitalUartParitySet( hAd2, 0);
// 1 stop
FDwfDigitalUartStopSet( hAd2, double( 1 ) );

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:

 digitaluart1.lpr
// reset, cursor off
FDwfDigitalUartTx( hAd2, PChar( #$1B#$49#$16 ), 3 );

 digitaluart1.lpr
txStr := 'to jest test';
FDwfDigitalUartTx( hAd2, PChar( txStr ), length( txStr ) );

Łą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ę:

 /boot/config.txt
enable_uart = 1

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:

 digitaluart2.lpr
FDwfDigitalUartRx (hAd2, rxBuffer, 0 (* !! enable *) , @rcv, @par );

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:

 digitaluart2.lpr
repeat
     FDwfDigitalUartRx (hAd2, rxBuffer, 1024, @rcv, @par );
     rxBuffer [ rcv ] := char(0);
     if rcv > 0 then
     begin
          write ( rxBuffer );
     end;
until false;

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

Natasza Biecek 2004-2019/~, e-mail