sobota, 12 grudnia 2020

Wyświetlacz IPS 1.3" 240x240 ST7789 - uruchomienie.

 Filigranowy wyświetlacz w rozmiarze 1.3" z ultra wysoką rozdzielczością 240x240  jak na tak mały ekranik. Wyświetlacz oparty jest na układzie ST7789. Wykorzystałem go w projekcie testera kabli dla sieci LAN, który zrobiłem na zamówienie mojego Syna. Wyświetlacz jak wyświetlacz robi co do niego należy czyli wyświetla treści i obrazki. I robi to całkiem sprawnie i ładnie. Trochę udaje OLED-a ale matryca jest typu IPS, co polepsza nam kąty widzenia w stosunku do tradycyjnych matryc TFT i lepiej odwzorowuje kolory. Na rynku istnieje wersja wyświetlacza w rozmiarze 1.54" z dodatkowym pinem CS (wybór). Gdybym wcześniej o tym wiedział to bym nabył ten właśnie model wyświetlacza. Wyświetlacz napędzamy napięciem 3.3 V ale za pomocą kilku rezystorów możemy zrobić konwersję z 5V, gdyby taka potrzeba zaistniała. Interfejs komunikacyjny : SPI. W necie bez problemu znajdziemy biblioteki do obsługi wyświetlacza. Ja zrobiłem sobie miks z kilku bibliotek i uruchomiłem je w ramach testów na PIC18F47Q43. Mikrokontroler w obudowie DIP40 obsadziłem na płytce HPC 8-bit mojej produkcji. Praca z nowymi konstrukcjami MCU 8-bit Microchipa to sama przyjemność a rejestry 8-bitowe to miód na oczy :). Brak efektu oczopląsu tak jak na 32-bitach :).

Tu taka luźna dygresja jaka mi się nasunęła podczas zabaw z MCU 8-bit Microchipa , mianowicie, kontrola obsługi warstwy sprzętowej w programie, dla MCU 8-bit jest łatwiejsza niż w ekosystemie 32-bit, gdzie mamy "pierdylion" opcji i podopcji w rejestrach sprzętowych. W MCU 8-bit mamy mniej szans na popełnienie błędu w obsłudze sprzętu.

Jeśli miałbym robić urządzenie z MCU od którego zależałoby życie lub zdrowie na pewno byłby to MCU 8-bitowy

Dygresja o obsłudze sprzętu nie jest tak do końca przypadkowa, ponieważ tutaj tkwi klucz w poprawnym uruchomieniu naszego wyświetlacza. W dostępnych artykułach w necie na temat ST7789 i sterowaniu za pomocą SPI, mało kto wspomina o trybie pracy SPI. W jednym z artykułów podano, że wyświetlacz uruchomimy w trybie 0 lub jak nie działa to w trybie 1. Mój wyświetlacz w tych trybach milczał. Obudził się dopiero w trybie 2

W artykule pokażę jak i czym uruchomiłem wyświetlacz ST7789 oraz jaka była moja metodologia postępowania w przypadku napotkania problemów z uruchomieniem sprzętu. Zobaczymy przy okazji jak szybko i bajecznie prosto można konfigurować MCU 8-bit Microchipa.

Poniżej wykaz sprzętu na jakim pracowałem :

Płytka HPC 8-bit mojej konstrukcji :

Na płytce obsadzimy prawie dowolny MCU 8-bit Microchipa w obudowach DIP40 lub DIP28. Praca z tą płytką była dla mnie dużą przyjemnością , nie dość, że to moja organiczna praca to jeszcze bardzo udana konstrukcja powiem nieskromnie.

PIC18F47Q43 firmy Microchip - bardzo ciekawy MCU z DMA na pokładzie, co jest unikatem w ekosystemie 8-bit. Obudowa DIP40, fajna kobylasta jak ktoś ma problemy ze wzrokiem to doceni ten rozmiar :). 

Wyświetlacz 1.3" IPS 240x240 ST7789 wersja z SPI . Zasilanie 3.3V

Programator MPLAB SNAP
 


Programator SNAP, odkąd go mam, zapomniałem o istnieniu PICkit-ów. Duży komfort pracy, wart każdych pieniędzy. Ja go nabyłem w dobrej promocji, więc moja radość się potęguje.

Analizator stanów logicznych 
 

Analizator to podstawowy osprzęt dla eksplorera mikrokontrolerów. Bez niego jak bez ręki. Koszt symboliczny , nie markowy i taki wystarczy.

Schemat elektryczny testowanego układu na obrazku poniżej :


Układ możemy sobie zestawić na płytce stykowej, nie ma problemu, nie musimy posiadać płytki developerskiej, aczkolwiek na niej działanie jest o wiele bardziej wygodne.

Do oprogamowania naszych gadżetów potrzebujemy MPLABX IDE + doinstalowana wtyczka MCC + kompilator XC8. Czyli standardowy zestaw do programowania MCU 8-bit Microchipa.

Zabawę z uruchomieniem wyświetlacza ST7789 zaczynamy od utworzenia projektu w MPLABX IDE. Po utworzeniu projektu uruchamiamy wtyczkę MCC i przechodzimy do konfiguracji  warstwy sprzętowej naszego MCU. Pierwszym elementem konfiguracji jest ustawienie zegara. Ja wybieram zegar wewnętrzny HFINTOSC z taktowaniem 64 MHz. Widok z MCC z tym ustawieniem poniżej :


Kolejnym krokiem jest dołączenie do projektu modułu SPI1 i skonfigurowanie go jak na obrazku poniżej. Ważne aby wybrać tutaj tryb 2 dla SPI.


Moduł SPI1 dołączamy do projektu "klikając" znak + przy SPI1 w okienku Device Resources. Dodany moduł pojawi nam się w oknie Project Resources . 

Ostatnią czynnością jest ustawienie pinów RA1 i RD0 (do DC i RES wyświetlacza) jako wyjścia . Pamiętajmy o odznaczeniu ptaszka w kolumnie Analog dla tych pinów. Okienko z ustawieniami powinno wyglądać jak poniżej :


Warstwę sprzętową naszego MCU mamy skonfigurowaną. Wszystko było banalnie proste. Ale pamiętajmy, że w tej wygodzie czai się pułapka dla naszego umysłu. Tak jak pilot od TV przyczynia się do skrócenia życia :),  bo taki wpływ na nasze życie ma brak ruchu. Używając wygodnych narzędzi do konfiguracji dowolnego MCU nie rozwijamy warstwy poznawczej naszego umysłu, opóźniamy lub nawet blokujemy progres poznania świata i specyfiki MCU. Oczywiście nie każdy musi wnikać i poznawać głębiej, jednemu wystarczy zatrzymanie się na poziomie Arduino i czerpania z tego satysfakcji a innemu to nie wystarczy. Ja należę do tej drugiej grupy, dlatego mam taki a nie inny pogląd. Niepokoi mnie jednak zjawisko, że ludzie przez wygodę współczesnego życia mają coraz mniejszą wiedzę coraz mniej im się chce i coraz więcej mają wymagań i roszczeń wobec świata.
Czy przypadkiem nie jesteśmy w obliczu jakiegoś schyłku cywilizacyjnego, którego kulminacją będzie np. jakaś ogólnoświatowa wojna ?. 

Generujemy w MCC pliki , które zostaną automatycznie dołączone do naszego projektu. Robimy to "klikając" w zakładkę Generate . Następnie zamykamy wtyczkę MCC , "klikając" jeden raz w niebieską ikonkę na belce narzędziowej.

Ponieważ do komunikacji z wyświetlaczem będziemy używać SPI, dlatego pierwszym krokiem powinno być sprawdzenie czy SPI w naszym MCU działa poprawnie i zgodnie z oczekiwaniem. Wtyczka MCC wygenerowała nam w projekcie pliki do obsługi SPI. Mamy tutaj gotowe funkcje do użycia, wyglądają one jak poniżej :


W praktyce będziemy wykorzystywać tylko te dwie poniższe funkcje :

SPI1_ExchangeByte();
SPI1_ExchangeBlock();

Aby sprawdzić poprawność działania SPI , posłużyłem się krótkim kodem wysyłającym znak 'A' co 50 ms. Jeśli na analizatorze stanów logicznych zobaczymy ten znak to znaczy , że moduł sprzętowy SPI 
działa. Fragment kodu "zakomentowany" w pętli while() :



Tu jeszcze wspomnę o tym aby aktywować SPI wywołując funkcję  SPI1_Open(SPI1_DEFAULT);
Na powyższym fragmencie kodu jest to widoczne. Jeśli wiemy, że SPI działa a wyświetlacz milczy bo np. kupiliśmy u Chińczyka wersję wyświetlacza , który chodzi w trybie 0 lub 1 wtedy uruchamiamy wtyczkę MCC ponownie i w ustawieniach SPI zmieniamy tryb pracy, potem "klikamy" zakładkę Generate i zamykamy wtyczkę MCC.

A co w przypadku kiedy przelecieliśmy przez wszystkie tryby SPI a wyświetlacz nadal milczy ?. Wtedy  wdrażamy plan B czyli bardzo dokładnie sprawdzamy czy wszystkie połączenia są poprawne czy odpowiednie piny są dobrze skonfigurowane i czy sygnały np. DC i RES pojawiają się tam gdzie powinny. Na końcu grzebiemy w programie bo może się zdarzyć , że tam tkwi przyczyna milczenia wyświetlacza. Jeśli wydaje nam się , że wszystko sprawdziliśmy a wyświetlacz nadal milczy to sprawdzamy jeszcze raz :). Nie wiem czemu ale jest tak, że ludzie w pierwszej kolejności jak im coś nie działa to zwalają winę na urządzenie, w tym wypadku byłby to wyświetlacz i podejrzewają , że jest niesprawny. W praktyce jest to ostatnia rzecz jaką można brać pod uwagę.

Teraz trochę o samej bibliotece. Składają się na nią cztery pliki : st7789.h , st7789.c , fonts.h i fonts.c. Kompletny projekt załączę na GitHub. Konfiguracja biblioteki jest banalnie prosta i składa się z dwóch kroków. W pierwszym pokazujemy bibliotece za pomocą definicji , które piny będą używane jako DC i RES. Poniżej miejsce w którym tego dokonujemy w pliku st7789.h 


Drugim krokiem jest pokazanie bibliotece funkcji wysyłającej bajt po SPI . W naszym przypadku jest to funkcja SPI1_ExchangeByte(wygenerowana automatycznie przez MCC w fazie konfiguracji MCU. Poniżej fragment kodu w pliku st7789.c gdzie dokonujemy wpisu :


Spis funkcji bibliotecznych dla wyświetlacza znajdziemy w pliku st7789.h. W linku poniżej artykułu znajdziemy projekt z załączona biblioteką. Projekt ściągamy do MPLABX IDE z GitHub za pomocą komendy Clone (Team-->Remote-->Clone).
Uruchomienie programu spowoduje wyświetlenie żółtego napisu "HELLO WORLD" na czarnym tle, napis będzie "scrolowany" w dół ekranu. Mało ambitnie wiem, ale nie mam czasu na wodotryski , bibliotekę potrzebowałem na szybko wykorzystać w moim testerze kabli LAN. efekt działania poniżej :





Podsumowując, jedynym problemem jaki napotkałem przy uruchomieniu wyświetlacza 1.3" ST7789 było wstrzelenie się w odpowiedni tryb SPI. Można podejrzewać , że u chińczyka nie ma standardu tutaj i równie dobrze kupimy wyświetlacz , który będzie się budził w innym trybie niż u mnie.  MCU 8-bit Microchipa są wygodnie i prosto konfigurowalne a narzędzia przyjazne dla użytkownika.. Jeśli ktoś zaczyna przygodę z MCU to moim zdaniem w 8-bitach jest w stanie lepiej się rozwinąć niż zaczynając przygodę  od 32-bit. Howgh !.
 
Po napisaniu tego artykułu, pobawiłem się trochę wyświetlaczem. Moje wrażenia są bardzo pozytywne. Technologia IPS znacząco poprawia komfort korzystania z wyświetlacza, TFT słabiej tutaj zdaje egzamin. Soczyste kolory, duży kąt widzenia. Treść jest czytelna z dużych odległości. Sterownik ST7789 przyjmuje na klatę szybkie zegary SPI. Duża rozdzielczość 240x240 bardzo pięknie prezentuje obrazy ale jest to też i wada, bo trudno zbuforować w RAM taką rozdzielczość w kolorach przy skończonych zasobach MCU :). Bibliotekę załączoną proszę traktować jako punkt wyjścia do uruchomienia wyświetlacza, wymaga ona jeszcze nakładu pracy aby zrobić z niej coś w pełni użytecznego.
 


Pozdrawiam

PICmajster
picmajster.blog@gmail.com


Linki :

1 komentarz:

  1. Widać, jest jakaś różnica we wtyczce MCC bądź w kompilatorach XC8 vs XC16, bo u mnie na 16 pitach wyświetlacz działa tylko w trybie SPI MODE = 3

    OdpowiedzUsuń