środa, 2 lutego 2022

STM32G0 - Bare Metal - MAX7219

MAX7219 to kultowy układ , który "zrewolucjonizował" sterowanie wyświetlaczami 7-segmentowymi LED . Za jego pomocą możemy sterować do 8-śmiu wyświetlaczy 7-segmentowych, włącznie z kropką lub wyświetlaczami matrycowymi 64 LED (np.8x8). Układ ma wbudowany dekoder BCD co upraszcza sterowanie wyświetlaczami. Mamy też regulację jasności świecenia. Z układem rozmawiamy za pomocą SPI z maksymalną prędkością 10 MHz. Układ wspiera połączenia kaskadowe czyli możemy łączyć wiele układów w szeregu. Cena oryginalnego układu na poziomie  60 zł / szt może trochę szokować. Z odsieczą przybywają nam tutaj potomkowie dzielnego generała Yue Fei., dzięki którym nabędziemy układy za "grosze". Układ wykorzystałem w swoim zegarku do sterowania łącznie 10-segmentami. Działa to rewelacyjnie. Dużą zaletą układu jest prostota w sterowaniu i oprogramowaniu. W artykule pokażę jak sterować układem za pomocą STM32G0 na przykładzie mojego budowanego zegarka.

Moja baza narzędziowa to :

  • płytka z modułem zegara opartym o STM32G071KBT6, do wizualizacji efektów działania MAX7219
  • programator J-LINK EDU Mini firmy Segger,
  • środowisko SEGGER IDE,

Na początek fragment schematu mojego zegarka :


Jak widzimy aby sterować 10-cioma segmentami potrzebujemy 2 x MAX7219. Na płytce zegarka, LED0 mam fizycznie z prawej strony ale w małych potrójnych segmentach muszę zmienić kolejność sterowania tak aby najmłodszy numer DIG4 i DIG0x były też z prawej strony. Aby utrzymać tę samą konwencję w sterowaniu. Poprawię to w docelowej płytce (jak nie zapomnę). Układ i wyświetlacze zasilamy z 5V. Aby nasz MCU STM32G071 ,poprawnie sterował układem MAX7219, musimy użyć konwertera napięcia z +3.3V na +5V na liniach SPI i CS. Ja taką konwersję zrobiłem za pomocą tranzystorów MOSFET BS138 ,kupionych za śmieszne kwoty od braci gen.Yue Fei. STM nie ma niestety w swoim portfolio MCU 32-bit  zasilanych  +5V.  Microchip posiada takie MCU dla CORTEX M0+ np. nowe PIC32CM.

O tym jak SPI ogarnąć w STM32G0 pisałem w artykule poprzednim. Poniżej dla przypomnienia pokazuję moją funkcję konfiguracyjną dla SPI1 .


Ważne aby SPI było skonfigurowane w trybie 0 czyli CPOL i CPHA na zero. Do sterowania układu będę posługiwał się dwiema funkcjami narzędziowymi SPI , pierwsza służy do konfiguracji i odwołania globalnego do wszystkich segmentów w kaskadzie , druga obsługuje dostęp wybiórczo do poszczególnych segmentów w kaskadzie :


Teraz plik z definicjami dla MAX7219 :


Poniżej funkcja bezpośrednio rozmawiająca z MAX7219 a w szczególności ze wszystkimi układami w kaskadzie na raz. Najpierw wysyłamy adres rejestru do którego się chcemy odwołać a potem daną jaką chcemy zapisać w rejestrze, czyli łącznie mamy 2 x 8 bit. Wysyłam ciurkiem 16-bitów.  Funkcji tej używam do konfiguracji układów.


Poniżej funkcja rozmawiająca z MAX7219, która potrafi rozróżnić z którym układem w kaskadzie rozmawia :


Aby zrozumieć jak możemy sterować poszczególnymi MAX7219 w kaskadzie, proponuje obejrzeć poniższy filmik wtedy wszystko się rozjaśni :

https://www.youtube.com/watch?v=SMH45vnRbjI

Aby rozmawiać z pierwszym układem MAX7219 w kaskadzie musimy wysłać najpierw sekwencję NOP (adres: 0x0 data :0x0) a potem sekwencję komendy (np. adres: 0x1 data :0x3) co w kodzie BCD wyświetli nam cyfrę 3 na pozycji DIG0 (Device0) . Jeśli chcemy odwołać się do drugiego układu w kaskadzie to najpierw wysyłamy sekwencję komendy (np. adres: 0x1 data :0x3) a potem sekwencję NOP (adres: 0x0 data :0x0). W efekcie na DIG0 (Device1) zobaczymy cyfrę 3.

Funkcja pokazana powyżej operuje na buforze 4-ro elementowym, dwa bajty na NOP i dwa bajty dla sekwencję komendy. Gdyby w kaskadzie było więcej MAX7219 niż dwa ,bufor musiałby być odpowiednio większy. Po odpowiednim ustawieniu sekwencji wysyłanej w buforze, w zależności do którego MAX7219 się odwołujemy, cały bufor wysyłamy po SPI. Na końcu zatrzaskujemy na CS stanem wysokim i dopiero wtedy dane zostaną zatwierdzone a na wyświetlaczu zobaczymy tego efekt.

Dla uzupełnienia pokażę jeszcze funkcję konfigurującą MAX7219 :


Jak tym wszystkim się posługiwać prezentuje obrazek poniżej :


Efekt działania programu poniżej :


Żeby trochę urozmaicić nasz kod . Stwórzmy sobie interfejs do rozmowy z MAX7219. Interfejs ma tę zaletę, że grupuje nam wszystkie funkcje w obiekcie który wywołujemy. Przećwiczmy sobie zatem tworzenie interfejsu. Tworzymy dwa pliki max7219_interface.h i max7219_interface.h. W pliku .h powołujemy strukturę i deklarujemy wskaźniki na funkcje, tyle wskaźników ile funkcji chcemy dołączyć do interfejsu. Wskaźniki muszą być zgodne z typami funkcji jakie chcemy dołączyć. W pliku tym na końcu deklarujemy nasz interfejs o nazwie max7219.


W pliku .c do zadeklarowanych wskaźników na funkcje przypisujemy konkretne funkcje . Całość wygląda jak poniżej :


Używamy nasz interfejs :


Interfejsy są bardzo wygodne , nie musimy pamiętać nazw poszczególnych funkcji aby je wywoływać w programie tylko pamiętamy jeden obiekt max7219. A kiedy się do niego odwołamy to rozwinie nam się lista wszystkich dostępnych operacji jakie możemy zrobić na tym obiekcie. Jak dla mnie rewelacja.

I to tyle w temacie. MAX7219 bardzo uprzyjemnia działanie z wyświetlaczami LED. Jego zalety to  prostota w sterowaniu, wyświetlanie w dwóch formatach BCD i w trybie pojedynczych LED w segmencie , sterowanie jasnością. Niska cena modułów z Chin zachęca wybitnie do stosowania ich w swoich projektach. Czysta przyjemność.



Pozdrawiam

PICmajster
picmajster.blog@gmail.com


Brak komentarzy:

Prześlij komentarz