MPLAB Harmony - biblioteka graficzna

MPLAB Harmony - biblioteka graficzna
Pobierz PDF Download icon

W pierwszej części artykułu opisującego zestaw bibliotek MPLAB Harmony pokazałem przykład z migającą diodą LED uruchomiony na module ewaluacyjnym PIC32 USB Starter Kit II. Wykonywanie na zaawansowanym 32 bitowym mikrokontrolerze tylko tak nieskomplikowanego działania w praktyce nie ma zastosowania. Zestaw narzędzi w postaci środowiska MPLABX IDE, kompilatora MPLAC XC32 i bibliotek MPLAB Harmony jest przeznaczony do tworzenia o wiele bardziej zaawansowanych aplikacji. Jednym z bardziej wymagających pod względem programowym i niezbędnych zasobów w jest implementacja interfejsu dotykowego z graficznym, kolorowym wyświetlaczem LCD.

Firma Microchip dostarcza bezpłatną bibliotekę graficzną przeznaczoną dla mikrokontrolerów z rodzin PIC32 i PIC24.

Aby ułatwić projektowanie ekranów interfejsu, do pakietu MPLAB X IDE dostarczono wtyczkę Graphic Display Designer X (GDDX), która umożliwia umieszczanie na projektowanych ekranach graficznych obiektów (widżetów), definiowanie interakcji pomiędzy tymi elementami i generowanie kodu wynikowego dla tworzonego projektu.

Biblioteka i wtyczka GDDX są przez Microchipa stale rozwijane. Początkowo - do wersji 2.0 GDDX - nie było możliwości integracji z pakietem Harmony. Wraz z pojawieniem się Harmony powstała nowa wersja GDDX 2.0 i kolejne.

Fotografia 1. PIC32 Multimedia Expansion Board (MEB) II i moduł PIC32MZ Starter Kit

Rysunek 2. Konfiguracja sterownika LCC

Niestety, wszystkie projekty tworzone we wcześniejszych wersjach nie były kompatybilne z projektami przeznaczonymi do uruchamiania z wykorzystaniem MPALB Harmony.

Tak było do momentu wprowadzenia najnowszej wersji pakietu IDE - MPALB X IDE 3.0. Zupełnie zrezygnowano w niej z wtyczki GDDX, a funkcję środowiska projektowego przeznaczonego do projektowania ekranów graficznych przejęło MPLAB Harmony Configurator (MHC).

Podobnie jak w poprzednio, projekty tworzone za pomocą GDDX 2.xx nie mogą być otwierane przez MHC. To oczywiście frustrująca sytuacja dla wszystkich tych, którzy projektują interfejsy graficzne i chcieliby korzystać z kolejnych wersji biblioteki.

Takie są konsekwencje korzystania z bezpłatnych narzędzi. Z drugiej strony jednak to dobra wiadomość, bo firma nadal rozwija biblioteki i pewnie w jakimś momencie tez zawirowania się skończą, a przecież stale są dostępne starsze wersje z MPALB X 2.35 i GDDX 2.xx.

Rysunek 3. Konfiguracja drivera interfejsu I²C

Rysunek 4. Menu konfiguracji biblioteki graficznej

W momencie pisania tego artykułu możliwości biblioteki konfigurowanej prze MHC były nieco okrojone w porównaniu do ostatniej wersji GDDX, ale według zapewnień producenta ma się to zmienić w nowszych wersjach IDE.

Oprogramowanie dla mikrokontrolerów PIC32MX i PIC32MX tworzone z wykorzystaniem MPLAB Harmony raczej jest rozbudowane i skomplikowane. Użycie biblioteki graficznej na pewno nie upraszcza sprawy. Z tego powodu, przy pierwszym kontakcie z nowymi rozwiązaniami najlepiej jest użyć sprawdzonych i działających przykładów. Do najnowszego MPLAB Harmony jest dołączonych wiele przykładów, w tym przykłady wykorzystania biblioteki graficznej.

Oprócz rozwiązań programowych będzie nam potrzeby też sprzęt do testowania. Dzięki polskiemu biuru firmy Microchip miałem możliwość użycia zestawu PIC32 Multimedia Expansion Board (MEB) II i współpracującego z nim modułu PIC32MZ Starter Kit (fotografia 1).

Zestaw MEBII jest bogato wyposażony w układy peryferyjne, między innymi w: kamerę VGA, 24-bitowy kodek audio, moduły Wi-Fi i Bluetooth, akcelerometr, czujnik temperatury i inne. Dla potrzeb tego przykładu przyda się kolorowy wyświetlacz LCD o przekątnej 4,3 cala, rozdzielczości WQVGA, z pojemnościowym panelem dotykowym.

Wyświetlacz nie ma wbudowanego sterownika. Przy okazji opisywania biblioteki graficznej Microchip wspomniałem, że wspiera ona obsługę kilku popularnych sterowników paneli LCD, ale też oferuje ma funkcjonalność sterownika LCD realizowanego przez mikrokontroler.

Rysunek 5. Okno edycji ekranów Graphic Composer Screen

Rysunek 6. Okno Graphics Composer Tool Box

To ostatnie rozwiązanie ma szereg zalet. Po pierwsze, nie musimy szukać wyświetlacza ze wspieranym sterownikiem lub samodzielnie tworzyć procedur obsługi. Po drugie, panele bez sterownika są tańsze. Jednak nie ma róży bez kolców - implementacja sterownika zajmuje zasoby.

Pojemnościowy panel dotykowy jest obsługiwany przez sterownik MTCH6301. Komunikacja z mikrokontrolerem odbywa się za pomocą interfejsu I²C.

Testowanie zestawu

Testowanie zastawu rozpoczynamy od otworzenia przykładu o nazwie composer umieszczonego w katalogu harmony/V1_04_02/ apps/gfx/composer. Projekt jest przeznaczony dla mikrokontrolera typu PIC32MZ2048ECL144.

W testowanym module zastosowano PIC32MZ2048ECH144, więc w pierwszym kroku należy zmienić typ mikrokontrolera. Aby poprawnie skompilować pliki źródłowe, trzeba użyć kompilatora MPLAB XC32 w wersji v1.34 lub nowszej.

Rysunek 7. Okno właściwości obiektu Button

Rysunek 8. Okno Graphics Component Management

Przykładowy projekt Composer w wersji dostarczonej z MPLAB Harmony pozornie nie działa - po skompilowaniu i wgraniu do pamięci mikrokontrolera modułu PIC32MZ Starter Kit na ekranie wyświetlacza nic nie jest wyświetlane. Trzeba otworzyć wtyczkę MPLAB Harmony Configurator (MHC) i wczytać konfigurację zapisaną w projekcie z ustawieniami początkowymi:

  • Drivers → Graphics Controllers → LCC. Opcja LCC oznacza sterownik wyświetlacza LCD zaimplementowany w mikrokontrolerze. Po wybraniu LCC możemy ustawić pamięć obrazu zaimplementowaną w mikrokontrolerze (Internal Memory) lub w układzie zewnętrznym (External Memory), kanał DMA do zapisywania tej pamięci oraz ustalić priorytet przerwań. Konfigurację sterownika grafiki pokazano na rysunku 2.
  • Drivers → I²C. Interfejs I²C jest używany do komunikacji ze sterownikiem panelu dotykowego. Konfigurację I²C pokazano na rysunku 3. Warto zwrócić uwagę na to, że zaimplementowano driver dynamiczny i do obsługi magistrali wykorzystuje on przerwania.
  • BSP Configuration. Jeśli w projekcie wybierzemy mikrokontroler z rodziny PIC32MZ, w zakładce BSP Configuration zostaną pokazane wszystkie moduły ewaluacyjne zbudowane w oparciu o wybrany mikrokontroler. Ja użyłem PIC32MZ EC Starter Kit i Mutlimedia Expansion Board (MEB) II. Po zaznaczeniu tej opcji konfigurator MHC wygeneruje plik bsp_sys_init.c zawierający procedury sterowania diodami LED, odczytywania stanu przycisków itd.
  • Taktowanie rdzenia mikrokontrolera przebiegiem o częstotliwości 200 MHz, a układów peryferyjnych - 100 MHz. Taktowanie wybiera się w oknie Clock Diagram konfiguratora MHC
  • Konfiguracja biblioteki graficznej - przy niej zatrzymamy się na dłużej. Konfiguracja biblioteki graficznej jest elementem Harmony Framework. Po zaznaczeniu Use Graphics Library otrzymujemy możliwość wyboru szeregi opcji (rysunek 4). Nas najbardziej będzie interesowała opcja Use MPLAB Harmony Graphics Composer Design. Po jej zaznaczeniu będziemy mogli projektować ekrany interfejsu graficznego w taki sam sposób, jak to się robi za pomocą wtyczki GDDX. Aplikacja Graphics Composer Design jest uruchamiana po kliknięciu na przycisk Execute. Okno tej aplikacji można podzielić na kilka obszarów:
    • Graphics Composer Screen - są w nim wyświetlane projektowane ekrany z umieszczanymi na nich widżetami i tzw. primitives - podstawowymi komponentami graficznymi, takimi jak linie, okręgi itp. Nawigowanie pomiędzy oknami odbywa się poprzez klikanie na zakładki z nazwami ekranów (rysunek 5).
    • Graphics Composer Tool Box z widżetami i primitives (rysunek 6). W aktualnej wersji Composera lista elementów jest uboższa w porównaniu z ostatnią wersją GDDX, ale ma to się zmienić. Elementy z tego okna są wybierane i umieszczane na projektowanych ekranach.
    • Graphics Composer Properties jest przeznaczone do zarządzania właściwościami wybranego elementu projektu: ekranu, widżetu itp. (rysunek 7). Można tu ustawić na przykład tekst wyświetlany na przycisku, wybrać predefiniowany sposób rysowania przycisku itp.
    • Graphics Composer Management przeznaczone do zarządzania komponentami projektu: obiektami, ekranami, schematami i zasobami. Wszystkie te komponenty można wybierać klikając na zakładki w dolnej części okna.

Aplikacja przykładowa

Działanie aplikacji wykorzystującej bibliotekę graficzną pokażę na przykładzie. Najpierw zostaną zdefiniowane i nazwane dwa ekrany: MainScreen i SecScreen. Pierwszy będzie wyświetlany po włączeniu zasilania lub restarcie mikrokontrolera.

Umieściłem na nim obiekt Button (przycisk) z etykietą Next Screen i tekst "TESTY MPAB HARMONY-. Na drugim ekranie umieściłem przycisk Return i obiekty Slider i Digital Meter. Po naciśnięciu przycisku Next Screen aplikacja wyświetla ekran SecScreen. Powrót do ekranu głównego następuje po naciśnięciu przycisku Return.

Rysunek 9. Okno Event Code Generation

Rysunek 10. Definiowanie akcji zwiększania wartości

Aplikację możemy wygenerować automatycznie z poziomu MPLAB Harmony Graphic Composer. Na ekranie MainScreen klikamy na przycisk Next Screen, a w oknie Properties zaznaczamy jedną z akcji:

  • G F X _ G O L _ B U T T O N _ ACTION _PRESSED - przycisk naciśnięty.
  • G F X _ G O L _ B U T T O N _ ACTION _STILPRESSED - przycisk naciśnięty i przytrzymany.
  • G F X _ G O L _ B U T T O N _ ACTION _RELEASED - przycisk zwolniony.
  • G F X _ G O L _ B U T T O N _ ACTION _CANCELPRESS - przyciśnięcie anulowane.

Zaznaczyłem akcję GFX_ GOL_BUTTON_ACTION _ RELEASED wykonywaną po wykryciu zwolnienia przycisku. Po kliknięciu na ikonie z prawej strony zaznaczonej akcji otwiera się okno Button1 GFX_GOL_BUTTON_ACTION_ RELEASED event code generation (rysunek 9).

W tym oknie ustawiamy:

  • Screen tj. ekran, na którym jest umieszczony obiekt (przycisk).
  • Target tj. miejsce, w którym ma być wykonana akcja.

Zakładamy, że po naciśnięciu i zwolnieniu przycisku Button1 aplikacja przejdzie do ekranu SecScreen. Dlatego wybieramy akcję Go To Screen. Po kliknięciu na przycisk Generate Event Code zostanie wygenerowany kod GFX_ HGC_ChangeScreen(SecScreen) i automatycznie umieszczony w kodzie aplikacji w takim miejscu, aby po naciśnięciu i zwolnieniu przycisku nastąpiła zmiana ekranu. W tym momencie nie musimy nawet wiedzieć, gdzie ten kod zostanie umieszczony.

Fotografia 11. Ekran MainScreen

Fotografia 12. Ekran SecScreen

W bardzo podobny sposób generujemy kod powrotu z ekranu SecScreen do ekrany głównego po naciśnięciu przycisku Button2.

Listing 1. Procedury obsługi przerwań

Na ekranie SecScreen umieściłem dwa dodatkowe elementy: suwak Slider do zadawania wartości i okno do wyświetlania wartości cyfrowych Digital Meter. Nasza aplikacja ma teraz za zadanie zmieniać wartość wyświetlaną przez Digital Meter w czasie przesuwania suwaku Slider.

W tym celu klikamy na obiekt Slider i w oknie Properties wybieramy Events → GFX_GOL_SCROLLBAR_ ACTION_INC. Otwieramy okno Event Code Generation. W oknie Screen wybieramy SecScreen, a w oknie Target - Digital Meter1. Przesuwanie suwaka w prawo lub do góry będzie wywoływało akcję w obiekcie Digital Meter1.

Listing 2. Funkcja SYS_Tasks();

W oknie Actions można wybrać jedną z akcji: Set Value, Increment Value, Decrement Value, Show Digital Meter i Hide Digital Meter. Wybieramy Increment Value, a w oknie Select Value wpisujemy 1 (krok). Po kliknięciu na przycisk Generate Event Code zostanie wygenerowany i umieszczony kod akcji (rysunek 10). Identycznie postępujemy dla Events → GFX_GOL_ SCROLLBAR_ACTION_DEC z tym, że w oknie Action wybieramy Decrement Value.

Moduły MPLAB Harmony (drivery urządzeń, usługi systemowe oraz middleware) są implementowane jako maszyna stanu. Użytkownik definiuje zestaw dopuszczalnych stanów i wykonuje inicjalizację maszyny stanów. Każdy z modułów ma swoją funkcję inicjalizacji i jedną z lub więcej funkcji wykonujących zadania (task functions).

Po zainicjowaniu systemu moduły mogą być wywoływane w pętli nieskończonej poprzez odpytywanie (polling), wywoływane w obsłudze przerwania lub pod kontrola systemu RTOS. Metoda pollingu jest najłatwiejsza w implementacji, ale może powodować długi czas odpowiedzi na żądanie wykonania zadania.

Listing 3. Obsługa ekranu dotykowego

Listing 3. c.d.

Dużo bardziej wydajna czasowo jest metoda wywoływania krytycznych sekwencji z wykorzystaniem mechanizmu przerwań, a dodatkowo można ją łączyć z metodą pollingu. W opisywanym przykładzie wykorzystano przerwania do wykrywania działania panelu dotykowego i odświeżania zwartości ekranu.

Listing 4. Funkcja GFX_HGC_MagButtons

Na listingu 1 pokazano funkcje obsługi przerwań używanych do obsługi wyświetlacza. Funkcja DRV_ TOUCH_MTCH6301_ReadRequest(); jest przeznaczona do wysyłania zapytania do podprogramu obsługi I²C, odbierania od niego danych odczytywanych za pomocą I²C ze sterownika MCTH6301 i umieszczania tych danych w kolejce. Potem tymi danymi - umieszczonymi w buforze drvI²CReadFrameData - "zajmuje się- procedura DRV_TOUCH_MTCH_Tasks.

W każdej aplikacji MPLAB Harmony funkcja main zawiera pętlę nieskończoną wywołującą cyklicznie funkcję SYS_Tasks();, jak pokazano na listingu 2.

Do obsługi ekranu dotykowego jest przeznaczona zamieszczona na listingu 3 funkcja DRV_TOUCH_ MTCH6301_Tasks ();. Przy konfigurowaniu akcji w Graphics Composer przypisaliśmy na przykład przyciskowi Button1 funkcjonalność zmiany ekranu z MainScreen na SecScreen.

Composer wygenerował kod i umieścił go w programie, więc rzeczywiście naciśnięcie przycisku powoduje zmianę ekranu. Obsługa zdarzenia od akcji przypisanej do przycisku jest wykonywana przez pokazaną na listingu 4 funkcję GFX_HGC_MagButtons().

Ta funkcja poprzez szereg innych funkcji jest również wywoływana z SYS_Tasks(). Dla każdej z akcji użytkownik może dopisać swój własny kod. Composer umieścił tu automatycznie wywołania GFX_HGC_ ChangeScreen(SecScreen); dla akcji zwolnienia przycisku Button1 oraz GFX_HGC_ChangeScreen(MainScreen) dla akcji zwolnienia przycisku Button2. Aktywne akcje są ustawiane przez driver obsługi panelu dotykowego.

Listing 5. Funkcja GFX_HGC_MsgDigitalMeters

Listing 6 Funkcja GFX_HGC_MsgScrollBars

Dla obiektów Digital Meter i Scroll Bars oprogramowanie Graphics Composer wygenerowało odpowiednie funkcje: GFX_HGC_MsgDigitalMeters ( listing 5) oraz GFX_HGC_MsgScrollBars (listing 6). W funkcji GFX_ HGC_MsgScrollBars kreator umieścił wywołania funkcji odpowiedzianych za zmianę wyświetlanej wartości w obiekcie Digital Meter. Ekrany wyświetlane po skompilowaniu programu wygenerowanego przez MHC zostały pokazane na fotografiach 11 i 12.

Tomasz Jabłoński, EP

Artykuł ukazał się w
Elektronika Praktyczna
wrzesień 2015
DO POBRANIA
Pobierz PDF Download icon
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik listopad 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio listopad - grudzień 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje październik 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna listopad 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich listopad 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów