sobota, 16 listopada 2019

PIC32MM i printf() - prosty wyrzut strumienia danych po UART.

Często zdarza się , że potrzebujemy monitorować pracę programu i wyświetlać komunikaty lub mieć podgląd na jakieś dane , szczególnie na etapie testowania funkcjonalności programu. Jednym z mediów do wyświetlania danych/komunikatów jest wyświetlacz , ale co w przypadku kiedy chcemy na przykład wyświetlić więcej komunikatów niż pomieści nam wyświetlacz ?. Wtedy przychodzi nam z pomocą UART i funkcja printf() ze standardowej biblioteki języka C. Ta para powoduje , że możemy w bardzo prosty sposób zobrazować komunikaty/dane w oknie monitora PC, nie pisząc nawet ani kawałka kodu konfiguracyjnego. W artykule pokażę jak skorzystać z funkcji printf() w programie , przekierować do niej strumień danych z UART i  wyświetlić to na monitorze.


Moja baza sprzętowa :

- płytka firmy Microchip PIC32MM USB Curiosity Development Board z PIC32MM0256GPM064 na pokładzie.





- konwerter UART -> USB na popularnym chipsecie firmy Silicon Labs CP2102.


- kabelki :)

Moja baza programistyczna :

- MPLABX-IDE ver 5.25 + kompilator XC32 ver 2.30 + plugins MCC


Aby za bardzo nie przynudzać bierzemy się do roboty. Najpierw tworzymy sobie nowy projekt w MPLABX-IDE o nazwie np pic32mmPrintf. Jak tworzyć projekt pokazywałem już w wielu artykułach (zajrzeć sobie do tutoriali o PIC32MM) , więc zakładam , że projekt mamy  utworzony i stan wyjściowy wygląda jak na poniższym obrazku :



Po utworzeniu pustego projektu na tym etapie jeszcze nie kompilujemy programu bo go zasadniczo nie mamy. Teraz pora aby nasz program wypełnić treścią za pomocą MCC. Czyli uruchamiamy plugin MCC do bezstresowej konfiguracji naszego mikrokontrolera. Zawsze będę powtarzał jak mantrę , że MCC Microchipa to najlepsze narzędzie tego typu na rynku, które generuje wysokiej jakości i dobrze opisany kod konfiguracyjny. Jeśli ktoś uważa inaczej to jest w błędzie :). Uruchamiamy zatem MCC klikając jeden raz w "policyjną" ikonkę MCC. Po chwili wyskoczy okienko w którym nic nie wpisujemy tylko wybieramy Save . Otwiera się okno główne MCC w którym konfigurujemy zakładkę System Module jak poniżej :



Zwracam uwagę na ustawienie ICD : Emulator Pin Placement, z naszą płytką programator poprawnie rozmawia na ustawieniu PGEC2/PGED2, standardowe ustawienie jest natomiast z numerkiem 1.

W komunikatach na dole otrzymamy wykrzyknik z informacją , że ustawiony jest niestandardowy zegar dla USB, olewamy to .

Teraz dołączymy do projektu moduł UART1 na pinach RX - RA6 i TX - RC12. W tym celu po lewej w okienku Device Recources rozwijamy UART i wybieramy opcję jak zaznaczono na obrazku poniżej , klikamy kilka razy lub plusik :


W efekcie moduł UART1 wskoczy nam do naszego projektu co widać w okienku Project Resources, na środku wyświetli się okienko do konfiguracji naszego UART-a.


W okienku ptaszkujemy opcję Redirect Printf to UART. Efekt jak poniżej :


Teraz zajmiemy się przyporządkowaniem pinów do modułu UART. W tym celu wybieramy w dolnym okienku zakładkę Pin Manager Grid View, efekt jak poniżej :


Widzimy, że moduł UART1 sam sobie skonfigurował piny RX na RA6 i TX na RC12. Więc w sumie jesteśmy zwolnieni z tej "ciężkiej" pracy. Kończymy działania w MCC, wybieramy zakładkę Generate w okienku Project Resources. MCC generuje nam projekt z uwzględnieniem naszych ustawień.
Zamykamy MCC klikając jeden raz w ikonkę MCC na górnej belce narzędziowej. Przełączamy widok na Projects i wchodzimy w katalog Sources Files gdzie znajdziemy utworzony przez MCC plik main.c. Efekt jak phttps://www.microchip.com/oniżej :


Zawartość w pliku main.c zmieniamy jak poniżej i kompilujemy program, ikonką "młoteczka":



Co robi nasz program ? Za pomocą funkcji printf() wysyłamy w genialnie prosty sposób komunikaty do UART1 . Pętla for() realizuje nam prymityw delaya. Czas sprawdzić czy to działa. Podłączamy konwerter UART -> USB do naszej płytki Curiosity i do PC. Potrzebujemy trzy kabelki dla GND, +3.3V,  TX (RC12). Ja podłączam wszystko w gnieździe mikroBUS B na płytce Microchipa . Płytkę Curiosity podłączamy kablem USB do PC a konkretnie gniazdo USB1.

Płytka Curiosity Microchip   -->  konwerter UART/USB
GND                                                    GND
+3.3V                                                  +3.3V
TX (RC12)                                           RX

Zauważmy, że nie korzystam z RX po stronie płytki Microchipa , bo nastawiam się tylko na wysyłanie komunikatów na ekran, nie będę nic odbierał po stronie MCU.
Sprawdzam na wszelki wypadek w LINUX czy wykrywany jest konwerter UART/USB w tym celu uruchamiam konsolę i wpisuję komendę lsusb , u mnie wygląda to jak poniżej :


Widzimy w powyższym spisie coś takiego jak  CP210x UART Bridge , to nasz konwerter poprawnie wykryty przez system Linux. Czyli od strony PC wszystko gra, czas sprawdzić czy tak samo gra od drugiej strony konwertera czyli czy nasza płytka Curiosity wyśle komunikaty , którymi posłużyłem się w programie.

Ale najpierw musimy zaopatrzyć się w jakiś program typu Terminal na PC. Najbardziej popularny to Putty  Uruchamiamy zatem Putty i ustawiamy jak na poniższym obrazku (tylko przyjrzeć się dokładnie co zmienione w stosunku do ustawienia po uruchomieniu):


Przed wybraniem opcji Open , musimy skompilować i wgrać nasz program do MCU robimy to w MPLABX-IDE nie w Putty :) . Po wgraniu programu "klikamy" Open w Putty i jeśli nic nie pochrzaniliśmy po drodze to zobaczymy obrazek jak poniżej :


Wszystko działa doskonale. Zauważmy, że  w ogóle nie użyliśmy funkcji UART-owych tylko posługujemy się jedną uniwersalną funkcją standardową języka C printf() aby wysłać dane po UART. Możemy sobie to wykorzystać również jako prosty debugger w programie, który obrazuje nam na monitorze stan zmiennych etc.


Pozdrawiam
picmajster.blog@gmail.com





Brak komentarzy:

Prześlij komentarz