[AD2][Pascal] UART - Digital I/O i obsługa protokołów | WaveForms SDK w Pascal | cz.3-A

Tutaj umieszczamy tematy związane z językami programowania niepasującymi do innych działów.
Regulamin forum
Temat prosimy poprzedzić nazwą języka umieszczonego w nawiasach kwadratowych np. [Pascal].
Awatar użytkownika
tasza
Geek
Geek
Posty: 1082
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

[AD2][Pascal] UART - Digital I/O i obsługa protokołów | WaveForms SDK w Pascal | cz.3-A

Postautor: tasza » piątek 14 gru 2018, 20:33

♬ ☘ Moja muzyka do kodowania ♬ ♬ ♬ ☘
https://youtu.be/Xmr6iscmd1g
♫ ♩ ♪ Powerwolf ⚡ ☘ ⚡ Fire & Forgive ♪ ♩ ♫




Tryptyk Protokolarny


część pierwsza - UART



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:

:arrow: http://www.qscomp.cz/Pdf/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:

00_IMG_4745.JPG
01_IMG_4751.JPG


Natomiast na filmiku poniżej mamy pokazane bardziej na żywo jak wygląda komunikacja z VFD:

https://youtu.be/qmr4cmVZX3Y

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:

:arrow: https://github.com/bienata/AnalogDiscov ... gitaluart1

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 pisze:

Kod: Zaznacz cały

// 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 pisze:

Kod: Zaznacz cały

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

digitaluart1.lpr pisze:

Kod: Zaznacz cały

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:

https://youtu.be/VIXmKtnrZWA

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 pisze:

Kod: Zaznacz cały

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:

02_pizero-ad2.png


owocując plątaniną jak na fotografii poniżej:

03_IMG_4753.JPG


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:

https://youtu.be/xba83-hHq3Y

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 pisze:

Kod: Zaznacz cały

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 pisze:

Kod: Zaznacz cały

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:

:arrow: https://github.com/bienata/AnalogDiscov ... gitaluart2

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.

https://youtu.be/MxFyL6-_sEk

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
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Wróć do „Inne języki programowania”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 5 gości