fbpx

Ostatnio sprawiliśmy, że wyświetlacz 7-segmentowy sam się multipleksował dzięki magicznemu scalakowi MAX7219. Dzisiaj pokażę Ci to jak można dzięki tym układom ogarnąć teoretycznie nieskończoną liczbę wyświetlaczy. Mowa jest o połączeniu kaskadowym, które oferują nam te wspaniałe układy. Już za chwilę zobaczysz jak nie używając większej ilości pinów, podłączyć i obsłużyć tyle wyświetlaczy, ile zechcesz. Do dzieła!

Kompletny cykl wpisów:

Nigdy więcej multipleksowania na GPIO! MAX7219 w akcji cz.1

Nigdy więcej multipleksowania na GPIO! MAX7219 w akcji cz.2

Nigdy więcej multipleksowania na GPIO! MAX7219 w akcji cz.3

MAX7219 – połączenie kaskadowe

Aby zwiększyć ilość obsługiwanych diod należałoby podłączyć kolejny układ MAX7219. W “klasycznym” podłączeniu należałoby wydzielić osobny pin CS na wybór aktywnego układu, a komunikację i zegar podpiąć równolegle do drugiego układu. Miałoby to nawet sens, lecz co jeżeli powiem Ci, że chcę podłączyć 500 układów, aby obsłużyć tysiące diod? Znajdź mi STMa który ma ponad 500 pinów. Ciężka sprawa…

Z pomocą przychodzi połączenie kaskadowe. Czym to właściwie jest i dlaczego pozwoli bez problemu ogarnąć 500 układów? Już śpieszę z wyjaśnieniem. Kaskada występuje w naturze lub ogrodnictwie i jest to rodzaj wodospadu, lub fontanny. Generalnie związane jest to z przepływem wody. Dla przypomnienia zobacz na pierwsze z gugla zdjęcie takiego tworu.

Jak ma się to do układów elektronicznych? Otóż zauważ, że kaskada składa się ze stopni. Każdy taki stopień to jeden z naszych układów MAX7219. Natomiast woda reprezentuje dane,  które wysyłamy do kaskady. Początek kaskady (góra wodospadu) to pierwszy układ. Dane (woda) przepływają przez niego i trafiają dalej, przepływając przez kolejne scalaki w kaskadzie. W elektronicznym wodospadzie dochodzi jeszcze moment zaakceptowania lub mówiąc bardziej fachowo, zatrzaskiwania danych. Przecież to, co wysyłamy do układów powinno do nich trafić, a nie po prostu przelecieć. Zauważ też, że wprowadzając nową daną, wszystkie starsze przesuwają się o jeden wprzód więc pisząc coś do elementu nr 0, za chwilę trafi na element nr 1. Nie chcemy przecież, aby ten również wykonywał to samo zadanie…

Aby kontrolować to, co układy zatrzaskują służy zwykły CS. MAX7219 bowiem zaakceptuje dane które w sobie aktualnie przechowuje tylko, jeżeli na pinie CS pojawi się zbocze narastające. Wracając do kaskady wodnej, takim CSem może być żaba, która zjada spływającego robala (daną) :). Jak wygląda połączenie kilku układów MAX7219? Pomoże nam w tym dokumentacja.

Jak widzisz, od strony MCU są tylko trzy sygnały (z lewej):

  • DATA IN, czyli MOSI interfejsu SPI
  • CLOCK, czyli SCK 
  • LOAD DATA, czyli CS

Zegar oraz CS w każdym układzie podłączone są równolegle. DATA IN każdego kolejnego układu podłączany jest do DATA OUT poprzedzającego. To właśnie na tym pinie układy wystawiają historyczne dane, które mają być przekazane dalej.

Wprowadzanie danych do kaskady

Bardzo ważnym aspektem jest zrozumienie jak “adresować” dane. Tyle, że my już bardzo dobrze wiemy na czym polega taka adresacja, bo znamy już diody WS2812B, które opisywałem w innym cyklu (Adresowalne diody WS2812B na STM32 cz. 1). W tamtej kaskadzie była taka różnica, że zatrzaskiwanie było uzależnione czasowo oraz była odwrotna (a właściwie to logiczna) zasada wprowadzania danych. Tam dioda po otrzymaniu danych pamiętała je, a na swoje wyście przekazywała dopiero kolejne, które już jej nie dotyczyły. Wpisywaliśmy więc do tamtej kaskady dane w kolejności od 0 do n.

Przy MAX7219 jest inaczej. Zapamiętywanie jest realizowane po podniesieniu pinu CS. Układy nic nie zachowują dla siebie i podają dalej wszystko co wpadnie im w ręce jak małpy, przytrzymując na chwilę tylko to, co ostatnio co dostali. W tym wypadku pierwsze co trzeba wpisać do kaskady, to informacje dla ostatniego układu, następnie przedostatniego i tak do zerowego. Pozwól, że to zobrazuję na przebiegu z analizatora logicznego na żywym przykładzie. Mam połączone kaskadowo cztery układy co daje mi łącznie 5 punktów, w których mogą pojawić się dane:

  • SDIN0
  • SDOUT0<->SDIN1
  • SDOUT1<->SDIN2
  • SDOUT2<->SDIN3
  • SDOUT3

Pogrubione nazwy to te, których użyłem w obrazie przebiegu. Przebieg  podzieliłem  na  cztery  sekcje  ponieważ,  przesyłam  cztery  informacje.  Po  jednej  dla  każdego  z układów.  MAX7219  przyjmuje  dane  w paczkach  po  2 bajty,  stąd  wysyłam  łącznie  8 bajtów.

Dla ułatwienia analizy wysyłam paczki z danymi, które reprezentują kolejne kroki, czyli 0x11 dla pierwszego kroku 0x22 w drugim itd. 

  1. Pierwsza paczka 0x11 trafia na wejście SDIN układu zerowego. Dane są zapamiętane w układzie, ale nie zatrzaśnięte – czeka na zbocze narastające na pinie CS.
  2. Zbocze się nie pojawiło, ale przyszła kolejna paczka na SDIN0 – 0x22. Pierwszy w szeregu układ musi zrobić miejsce na nowe dane, więc wypycha te stare na swoje SDOUT, a te z kolei trafiają na SDIN układu numer 1. Teraz dwa układy czekają na zbocze narastające na pinie CS.
  3. Zbocze kolejny raz się nie pojawiło i po raz kolejny pojawił się nowy zestaw danych. Każdy z poprzednich układów robi miejsce na nowe dane wypychając stare na swoje wyjścia SDOUT. 0x11 trafiają na układ numer 2, 0x22 na układ nr 1, a na układzie nr 0 znajdują się teraz najświeższe dane, czyli 0x33. Teraz trzy układy czekają na zbocze narastające na pinie CS.
  4. I niespodzianka – zbocze znowu się nie ukazało oczom pinu CS. Cała sekwencja z przekazywaniem swoich danych przez układy rozpoczyna się na nowo. Każdy z nich podaje dalej to, co aktualnie przechowywał. W efekcie na układ nr 3 trafiło 0x11, które było wprowadzone do kaskady jako pierwsze, na układzie nr 2 mamy 0x22, na numerze 1 mamy 0x33, a na początkowym 0x44. 

Nie zmieściło mi się już na wykresie, ale po tym wszystkim w końcu wstaje CS. W tym momencie dane, które każdy z układów przechowywał zostają zatrzaśnięte, a odpowiadające im operacje dopiero teraz są wykonywane przez scalaki.

Obsługa kaskady w bibliotece

Biblioteka od samego początku wspiera połączenie kaskadowe, a obsługa wielu scalaków zawarta jest w funkcji:

MAX7219_STATUS MAX7219_SendToDevice(uint8_t DeviceNumber, uint8_t Register, uint8_t Data)

Cały trick polega na działaniu na buforze, który wielkością odpowiada ilości układów w szeregu. Mając cztery scalaki bufor ma rozmiar 8 bajtów (pamiętaj, że dane muszą być w 2-bajtowych paczkach). W pierwszej kolejności ustalany jest offset urządzenia, do którego chcemy pisać. Następnie cały bufor jest zerowany. Zero jak pamiętasz z poprzedniego wpisu jest to operacja No-op, czyli brak operacji. Wpisanie jego do układu nic nie zmieni.

W następnym kroku należy wpisać do bufora dane rejestru oraz wpisywanej wartości zgodnie z wyliczonym offsetem. Należy pamiętać o naturze kaskady, że jeżeli chcesz pisać do pierwszego elementu, to wysyłasz to jako ostatnią wartość i odwrotnie. Jeżeli piszesz do ostatniego elementu to puszczaj to w kaskadę jako pierwsze.

Po wypełnieniu bufora wystarczy go przetransferować przez SPI. Gotowe. Podane dane zostały wpisane do tego układu, do którego chcieliśmy pisać.

Działanie kaskady

Prezentacje z działania kaskady na wyświetlaczach 7-segmentowych znajdziesz na poniższym filmie. Niestety ładwodostępne moduły nie są przyjazne w fizycznym połączeniu wyświetlaczy. Mają bowiem kawałek PCB po obu stronach, co nie pozwala na idealne spasowanie wyświetlaczy. 

Podsumowanie

Mam nadzieję, że jasno wytłumaczyłem to w jaki sposób działa połączenie kaskadowe. Technika ta często stosowana jest w rejestrach przesuwnych, którymi poniekąd są omawiane dzisiaj układy MAX7219. Dobrze znane diody WS2812B również korzystają z podobnego mechanizmu, co czyni je niesamowicie konfigurowalnymi. W kolejnej części zajmę się wyświetlaczami matrycowymi. Połączę je w kaskadę, a także w jeden, większy wyświetlacz, którym będzie można w łatwy sposób sterować z biblioteki graficznej!

Pełny projekt wraz z biblioteką znajdziesz jak zwykle na moim GitHubie: link

Jeśli zauważyłeś jakiś błąd, nie zgadzasz się z czymś, chciałbyś coś dodać istotnego lub po prostu uważasz, że chciałbyś podyskutować ne ten temat, napisz komentarz. Pamiętaj, że dyskusja ma być kulturalna i zgodna z zasadami języka polskiego.

5/5 - (4 votes)

Podobne artykuły

.

0 komentarzy

Dodaj komentarz

Avatar placeholder

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *