Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką

p.kaczmarek2 27 Dec 2021 14:04 1545 0
Termopasty
  • PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Witajcie moi drodzy.
    Tutaj opiszę mój projekt płytki startowej pod 32-bitowy mikrokontroler PIC32MZ2048* w obudowie TQFP144 oferującej m. in. uproszczony klon programatora PICKIT2 na pokładzie (wspiera PIC32MZ poprzez pic32prog). Umieszczę tu również kilka przykładowych kodów dla tego PICa. Moja płytka oferuje znacznie więcej niż Arduino (sprzętowe USB, kilka portów UART, I2C, SPI) oraz nie wymaga żadnych zewnętrznych układów do pracy (zakładamy zworki, podłączamy przewód USB i możemy wgrywać wsad).
    UWAGA: jak sama data na płytce wskazuje, projekt robiłem ponad 3 lata temu. Sama płytka mogłaby być zrobiona lepiej, po 3 latach wyraźnie to widzę, ale i tak umieszczam ją tu informacyjnie.

    Co znajduje się na płytce?
    Na płytce umieściłem niezbędne elementy do uruchomienia PIC32MZ2048* w obudowie TQFP144. Dodatkowo wzbogaciłem ją o to, z czego korzystałbym normalnie ucząc się tego PICa, tak aby poznawanie tego mikrokontrolera przebiegało wygodnie i sprawnie.
    Na płytce znajduje się:
    - PIC32MZ2048* w obudowie TQFP wraz z potrzebnymi do jego uruchomienia elementami, przyciskiem RESET
    - prosty programator PIC (uproszczony do minimum PICKIT2 bez układu przetwornicy VPP, pamięci, itp)
    - konwerter USB-UART oparty o MCP2221 z dodatkowymi pinami IO (można użyć np. do resetowania PICa)
    - złącze na kartę SD
    - trzy przyciski z rezystorami pull-up
    - cztery diody LED wraz z rezystorami
    - dwie pamięci EEPROM 24LCS52SN na I2C (lub podobne)
    - termometr na I2C TC74A0 lub podobny
    - wyprowadzenie wszystkich pinów na goldpiny
    Dodatkowo płytka posiada nóżki oraz opcjonalną szufladkę na kabelki stykowe.

    Projekt płytki
    Przyznam, że projekt powstał dość dawno, nie odzwierciedla moich bieżących umiejętności robienia PCB i gdybym miał robić go od zera to wyglądałby inaczej.
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Projekt bazował na prostej płytce minimalnej pod PIC32MZ o nazwie 'PIC32MZ Bare Bones". Ja ją przerobiłem i ulepszyłem, bo ona nie miała nawet normalnego złącza ICSP. Pierwowzór możecie zobaczyć tutaj:
    https://github.com/xioTechnologies/PIC32MZ-Bare-Bones

    Lutowanie płytki
    Użyta lutownica grotowa (i koniecznie nowy, czysty grot):
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Złącze micro USB:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Lutowanie elementów na spodzie płytki (kondensatory odsprzęgające):
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    PIC w TQFP144 (PIC32MZ2048EFH144):
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Tego topnika jest zdecydowanie za dużo, ale lutowane to było... wiadomo kiedy.

    Jeden z pierwszych testów z PICKIT3:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Konwerter USB na UART przylutowany:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    PIC18LF2550 z sekcji mini-programatora musi być raz zaprogramowany, trzeba wgrać mu wsad PICKIT2 - PK2V023200.hex. Wymaga to przylutowania kabelków do jego pinów PGD, PGC i MCLR (ale nie tych z ICSP na goldpinach którymi on steruje, tylko jego własnych pinów):
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Lutowanie tranzystorów włączających VPP (układ mini-programatora):
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    W jednej z wersji płytki do modułu programatora (PICKIT2 klon dla PIC32prog) użyłem N-MOSFETów 2N7002 zamiast BC847 (tranzystor NPN; BC547 w wersji SMD) i mimo to wszystko działało dalej sprawnie.
    Kilka wersji w trakcie lutowania:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką

    Mini-programator z płytki - bazowy koncept
    Na mojej płytce PIC32MZ znajduje się uproszczony klon programatora PICKIT2, zrobiony wedle mojego własnego pomysłu.
    Początkowo wydawało mi się, że programowanie PIC32MZ z prostego klonu PICKIT2 nie jest proste, gdyż PIC32MZ wymaga poziomów logicznych 0-3.3V na liniach PGD i PGC, a PIC18F2550 (serce PICKIT2) pracuje na 5V.
    Ale po jakimś czasie wpadłem na pomysł, jak to rozwiązać.
    Mój klon programatora zrealizowany jest na PIC18LF2550, czyli na układzie zdolnym do pracy na poziomie 3.3V. Z tego 3.3V też go zasilam, dzięki czemu na liniach PGD/PGC mam poziomy 3.3V a nie 5V. Upraszcza to znacznie układ, chociaż uniemożliwia programowanie mu wielu innych starszych rodzin PIC, które akurat tutaj są zbędne.
    Dodatkowo też (oczywiście) usunąłem przetwornicę step up generującą VPP, które dla starszych PICów bywało wymagane na poziomie 12V czy tam 13V. Tutaj jest ono zbędne.
    VPP mam na sztywno na poziomie 5V z USB, to starcza dla wszystkich układów jakie znam a jednocześnie nie jest w stanie niczego uszkodzić (sprawdzałem). VPP oczywiście wciąż muszę być w stanie przełączać między trzema stanami (zwarte na mase, podane 5V, stan nieoznaczony) więc dalej dwa tranzystory do tego układu są potrzebne.
    Podsumowując, mój mini-programator PIC32 to PIC18LF2550 + dwa tranzystory (do załączania VPP) i też rzecz jasna LDO 3.3V, tylko tyle.
    To jest chyba najprostszy klon PICKIT2 jaki widziałem.
    Na PIC18LF2550 działa normalnie wsad PICKIT2, nie ma z tym problemów.
    Zdjęcie poniżej przedstawia wyprowadzenia/zworki programatora i ICSP PIC32MZ z płytki:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką

    Mini-programator z płytki - w roli programatora dla zewnętrznych PICów
    Programator dostępny na płytce może programować też inne układy PIC. Wspiera wszystko to co PICKIT2 (i pic32prog) za wyjątkiem PICów które wymagają VPP innego niż 5V. Czyli zasadniczo odpadają te starsze mikrokontrolery, rodziny takie jak PIC16F, PIC18F, itp. Wciąż można programować większość dsPIC, PIC33, PIC32, itp.
    W celu sprawdzenia możliwości programowania wziąłem moją starą płytkę-moduł Ethernet z PIC18F66J60, zlutowany na niej był tylko minimalny układ wymagany pod ten mikrokontroler:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Podłączyłem go z pomocą 5 przewodów ICSP bez zbędnych kombinacji. VDD tutaj wynosi tutaj w przypadku obu płytek 3.3V.
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Samą płytkę podłączyłem do komputera dwoma przewodami USB (jeden od zasilania-ten biały, drugi od programatora-ten szary).

    Po włączeniu programu PICKIT2 od razu wykryty został PIC:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    W ten sposób można na nim wykonywać wszystkie operacje, kasować jego wsad:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    I przede wszystkim - wgrywać wsad (tutaj akurat wgrałem prosty blink):
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Wgrany wsad oczywiście przechodzi weryfikację:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Czyli całość to pełnoprawny programator (dla PICów o VDD=3.3V i VPP=5V).


    Mini-programator z płytki - programowanie PIC32MZ
    Teraz przedstawię programowanie PIC32MZ z pokładu. Zakładamy zworki:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Do tego potrzebny już jest pic32prog, czyli alternatywny software PICKIT2 na komputer (firmware na PICKIT2 zostaje bez zmian).
    https://github.com/sergev/pic32prog
    Normalny PICKIT2 na komputer nie wspiera rodziny PIC32MZ.
    Na repozytorium jest plik binarny dla Windowsa, nie musimy kompilować sami, ale tu zaczynają się schody.
    W ostatniej wersji z repo pic32prog jest popsuty, po jego uruchomieniu po prostu zawiesza się ze złą wartością statusu:
    Quote:

    Programmer for Microchip PIC32 microcontrollers, Version 2.0.220
    Copyright: (C) 2011-2015 Serge Vakulenko
    Adapter: PICkit2 Version 2.32.0
    PICkit2: invalid status = 000a

    No target found.

    Jest to problem który pojawił się jakoś po 2017, bo z tego co pamiętam, to wcześniej bez problemu programowałem PIC32MZ. Troszkę czasu spędziłem na testowaniu i diagnozie co może być nie tak, aż wreszcie określiłem, że winowajcą jest zamiana biblioteki obsługującej HID. HID to skrót od Human Interface Devices, czyli protokół operujący na bazie USB, nie wymaga specjalistycznych sterowników.
    Stara biblioteka HID rezyduje w jednym pliku (hid-windows.c) i operuje na funkcjach z nagłówków hidsdi.h or hidclass.h, które mamy z Windows Driver Kit:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Nowa biblioteka hidapi jest znacznie bogatsza i nie korzysta wcale z hidsdi.h ani z hidclass.h:
    https://github.com/libusb/hidapi
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Niestety w przypadku PICKIT2 ma ona problemy z komunikacją (próbowałem zarówno wersji z ich repozytorium, jak i najnowszej z repozytorium hidapi).
    Zmusiło mnie to do przeportowania nowszej wersji pic32prog na starszą obsługę HID wraz z przygotowaniem dla niej systemu kompilacji na Windows 10 (oryginalnie było niby na mingw, ale zdecydowałem się, że użyję Visual Studio):
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Oczywiście w kilku miejscach musiałem uzupełniać braki w bibliotekach. Przykładowo, brakowało mi getopt, gdyż był one dostępny na Mingw32 którego używał autor biblioteki, ale w moim Visual Studio go nie było. Potrzebny jest on do parsowania argumentów z linii komend (argc, argv):
    Code: c
    Log in, to see the code

    Na szczęście, mamy 2021 rok (prawie 2022) i gotowych zamienników w sieci jest pełno. Zdecydowałem się użyć:
    https://github.com/Chunde/getopt-for-windows
    i to wystarczyło.
    Ostatecznie, samo rozpoznanie podłączonego PICa uruchamiamy samym wywołaniem programu pic32prog.exe:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Natomiast wgrywanie wsadu wymaga podania jeszcze ścieżki do pliku hex:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Boot memory pozornie wykrywa błąd, ale podejrzewam, że to kwestia softu pic32prog (przy PICKIT3 i MP IPE tego nie ma), a po wgraniu program działa.

    Jak działa pic32prog w połączeniu z PICKIT2?
    Kwestia działania pic32prog jest o tyle ciekawa, że nie wymaga on aktualizacji firmware na PICKIT2 a mimo to dodaje wsparcie kolejnych układów. Dodatkowo nie wymaga on instalowania żadnych sterowników. Ten akapit przeznaczę na krótkie wyjaśnienie jego działania.
    Zasadniczo to komunikacja odbywa się na dwóch warstwach.
    Warstwa HID:
    Komunikacja HID odbywa się poprzez wymianę pakietów na USB. Można powiedzieć, że to taki nieco bardziej wysokopoziomowy UART. Pakietów HID używałem już tutaj: https://www.elektroda.pl/rtvforum/topic3663489.html
    Są też specjalne "hid devices" określane przez deskryptor USB które system wspiera bez instalowania sterowników (np. klawiatura, myszka), ale w tym przypadku z tego nie korzystamy. O tym z kolei pisałem w tym temacie (z przykładem użycia do utworzenia game pada):
    https://www.elektroda.pl/rtvforum/topic3648029.html
    Wracając, w hidapi.h mamy następujące funkcje:
    Code: c
    Log in, to see the code

    Całość rysuje się bardzo prosto. Najpierw uruchamiamy bibliotekę (hid_init), potem otwieramy urządzenie po jego PID/VID (hid_open). Możemy również pobrać informacje o nim poprzez hid_enumerate (też po VID/PID). Następnie możemy do niego wysyłać i odbierać pakiety poprzez hid_write i hid_read. Jest też możliwość ustawienia blokowanie, czyli określenia czy próba odczytu danych z urządzenia blokuje wykonanie kodu dopóki urządzenie nam czegoś nie wyśle, czy też po prostu zwraca 0 (w domyśle, że spróbujemy odczytać dane ponownie później). Reszta to mniej istotne funkcje pomocnicze.
    Oczywiście tej biblioteki można użyć też do własnych projektów!
    Warstwa protokołu PICKIT2:
    Protokół PICKIT2 (jego "język skryptowy") rezyduje na HID niczym HTTP rezyduje na TCP.
    Opiera się on na komendach, które przyjmują argumenty.
    Przykładowe komendy:
    Code: c
    Log in, to see the code

    W omawianym pic32prog do wysyłania tych komend istnieje funkcja pomocnicza:
    Code: c
    Log in, to see the code

    Jak widać, wszystko sprowadza się do hid_write. Funkcja pickit_send zasadniczo pozwala używać nam "va", "variable arguments", czyli różnej ilości argumentów, które po kolei dodawane są do bufora. To tylko ułatwienie dla programisty. Tak samo działa np. "printf" czy tam "sprintf".
    Poprzez pickit_send można wysłać każdą komendę, przykładowo:
    Code: c
    Log in, to see the code

    To było odłączenie/podłączenie VDD. A teraz operacja na pinie RESET (MCLR) i ustawienie szybkości skryptu:
    Code: c
    Log in, to see the code

    Programowanie słowa do pamięci Flash PICa wygląda tak:
    Code: c
    Log in, to see the code

    Jak widać każda operacja jest skryptowana po stronie komputera, PICKIT2 tylko wykonuje polecenia. Jest to bardzo wygodne i daje możliwość wsparcia naprawdę wielu różnych układów.
    Dla zainteresowanych:
    https://github.com/sergev/pic32prog/blob/master/adapter-pickit2.c
    Można by się jeszcze zastanowić, czemu w takim razie PICKIT2 nie wspiera rodziny MZ natywnie (pic32prog to soft open source, nie od Microchipa) i czemu powstał PICKIT3 i 4? Nie wiem, ale się domyślam...

    Wydruk 3D - nóżka
    Kolejnym pomysłem na usprawnienie mojej płytki było dodrukowanie jej nóżki. Można by to zrobić bez wydruku 3D, ale drukarkę 3D mam pod ręką, a resztki filamentu na małe wydruki mam wręcz za darmo. Dodatkowo taka nóżka może być zaprojektowana specjalnie pod płytkę. Zdecydowałem się dopasować ją do zaookrąglonego rogu PCB:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Zaprojektowałem więc w Blenderze element:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Otwór na śrubkę wycinany jest za pomocą Boolean:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Przewiduję miejsce na nakrętkę M3, która dopasowuje się do elementu (też Booleanem wycięte):
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Po zamontowanie:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Wyższa wersja:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Zamontowana:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką

    Wydruk 3D - szufladka
    Wersja podstawki z szufladką jest skutkiem ewolucji czterech wysokich nóżek. Po prostu połączyłem je razem i dodałem prowadnice, a potem szufladkę. Główną motywacją tego była możliwość przechowywania drobnych elementów i kabelków stykowych, które są niezbędne do pracy z tą płytką (chociażby do podpięcia LEDów do migania do pinów PICa, przypominam, nic nie jest podłączone na sztywno):
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Tu pomagał mi modifier Mirror (lustro) oraz znów Boolean (wycinanie otworu):
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Trochę niefortunnie wyszło, że w tym 2017/2018 jak projektowałem tą płytkę to nie zadbałem by była kwadratem, ale raczej dużo to nie zmienia.
    Szufladka:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Zamontowane i demonstracja działania:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Pierwszą poprawką jaką zrobiłem po sprawdzeniu szufladki to dodanie jej "sufitu", by przewód nie blokował się o kant podstawy:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką

    Hello World i konfiguracja oscylatora
    Pora zacząć od najprostszego programu - miganie diodą LED z dodatkowym wydrukiem tekstu na UART. Początkowo planowałem użyć tu MP Lab X, ale temat jest już dość długi, więc bez zbędnych komplikacji odpalimy najprostsze demko w darmowej wersji Mikro C PRO for PIC32.
    PIC32MZ korzysta z PPS (Peripheral Pin Select), co pozwala w miarę dowolnie mapować różne funkcje na różne piny, będzie to potrzebne do wyboru wyjścia TX od UART.
    Code: c
    Log in, to see the code

    Od strony sprzętowej, potrzeba dwóch kabelków - jeden do MCP2221 (wybrany pin TX od PIC do RX od MCP2221), a drugi do diody LED (po to są na płytce wyprowadzone by wygodnie się testowało).
    Trzeba też skonfigurować oscylator, tutaj wewnętrzny 8MHz (ustawienia z Configuration maja znaczenie, jak wpisze się tam 10MHz zamiast 8MHz to odbieramy krzaczki).
    Program działa, widać, że odbieramy tekst w RealTerm:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką



    Skan I2C
    Jednym z przydatniejszych programów do testowania tej płytki jest skaner I2C. Skaner I2C wykrywa urządzenia podłączone na magistrali I2C i drukuje ich adresy na UART. Oczywiście musimy sami zdecydować z którego I2C skorzystamy (trochę ich ten PIC ma) oraz ręcznie podłączyć kabelkami SDA i SCL do peryferiów.
    UWAGA: I2C nie zadziała jak zapomnimy o rezystorach pull-up z płytki, a skaner będzie wykrywać każdy adres.
    Code: c
    Log in, to see the code

    Rezultat:
    PIC32MZ płytka uruchomieniowa USB z programatorem i szufladką
    Adresy I2C urządzeń możemy poznać też z ich not katalogowych, przy uwzględnieniu bieżącej konfiguracji pinów A0, A1, A2 itp (zwarcie ich do masy lub zasilania zmienia dany bit adresu).

    Błędy na płytce
    Płytka była robiona kilka lat temu więc ma jeszcze więcej błędów niż moje nowsze projekty.
    - te złącza micro USB to jedno wielkie nieporozumienie, bardzo słabo się trzymają, całkiem o tym zapomniałem przy projektowaniu. Co gorsza, ich pady są na masie (bo muszą być) a od strony wierzchniej PCB jest zasilanie, więc wylewka masy nie "trzyma" złącza
    - można by zoptymalizować ścieżki i zmieścić więcej elementów
    - niektóre elementy są w THT a powinny być powierzchniowo, ale to wynika m. in. z tego że kiedyś miałem tylko TC1264 w TO220 i pod to projektowałem...

    Co można by ulepszyć?
    Poza oczywistymi błędami są też rzeczy które można by usprawnić.
    - na PCB można by dać złącze hosta USB (w bieżącej wersji trzeba je podłączać do wyprowadzonych pinów). Ale w sumie są te złącza OTG od telefonów co z jednej strony mają wtyk micro USB a z drugiej żeńskie gniazdo zwykłe, można takie wykorzystać
    - w bieżącej wersji na PCB są aż trzy złącza USB (konwerter USB-UART, moduł programatora, USB od PICa). Można by spróbować użyć jakiegoś układu scalonego pełniącego rolę rozdzielacza USB (huba) i zredukować ilość złącz USB do jednego (ew. dodatkowo złącze hosta USB)
    - można by zrobić dla tej płytki "czapeczkę" z np. modułem Phy Ethernet komunikującym się z tym PICiem po RMII, ew. można użyć jakoś gotowego modułu z układem LAN* (LAN8720?) i mu tylko przygotować złącze tak by go tylko wpinać w PCB

    Podsumowanie
    Nie mogę powiedzieć, że w pełni ukończyłem ten projekt, bo chociażby trochę jeszcze elementów do przylutowania jest, nie testowałem też np. innych konfiguracji oscylatora niż wewnętrzny, również nie testowałem zegarkowego 32.768kHz, ale i tak uważam, że na tym etapie mogę go wrzucić na DIY.
    Płytka okazała się być bardzo praktyczna, mimo popełnionych na niej błędów. Programator na pokładzie to rewelacja, tak samo jak konwerter USB na UART. Szufladka również pomaga, chociaż przydałoby się jeszcze zrobić całe pudełko na płytke by mieć jak ją transportować wygodnie.
    Na PIC32MZ zrealizowałem znacznie więcej programów, ale umieszczę je innym razem. Z ciekawości zamierzam też na nim uruchomić LUA, jak coś z tego wyjdzie to opiszę rezultaty na forum.

    Załączam źródła Eagle płytki, model Blendera nóżek/szufladki (przed finalnymi poprawkami!), przykładowe projekty MikroC oraz sportowany do Visual Studio (częściowo) PIC32prog (oryginalnie wymagał on MinGW):

    Cool? Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    p.kaczmarek2
    Level 26  
    Offline 
  • Termopasty