2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
Kontroler MAX7219 jest produkowany przez Maxim Integrated i jest kompaktowym, szeregowym sterownikiem wejścia/wyjścia ze wspólną katodą, który może łączyć mikrokontrolery z 64 pojedynczymi diodami LED, 7-segmentowymi numerycznymi wyświetlaczami LED do 8 cyfr, wyświetlaczami słupkowymi itp. -chip to dekoder BCD code-B, obwody skanowania multipleksowego, sterowniki segmentów i cyfr oraz statyczna pamięć RAM 8×8, która przechowuje każdą cyfrę.
Moduły MAX7219 są bardzo wygodne w użyciu z mikrokontrolerami, takimi jak ATtiny85, czy w naszym przypadku Tinusaur Board.
Krok 1: Sprzęt
Moduły MAX7219 zwykle wyglądają tak. Mają szynę wejściową z jednej strony i szynę wyjściową z drugiej. Pozwala to na łączenie łańcuchowe 2 lub więcej modułów, tj. jeden po drugim, w celu tworzenia bardziej skomplikowanych konfiguracji.
Stosowane przez nas moduły można łączyć w łańcuch za pomocą 5 małych zworek. Zobacz zdjęcie poniżej.
Krok 2: Pinout i sygnały
Moduł MAX7219 posiada 5 pinów:
- VCC – moc (+)
- GND – masa (-)
- DIN – wprowadzanie danych
- CS – wybór żetonów
- CLK – Zegar
Oznacza to, że do sterowania modułem potrzebne są 3 piny po stronie mikrokontrolera ATtiny85. Będą to:
- PB0 – podłączony do CLK
- PB1 – podłączony do CS
- PB2 – podłączony do DIN
Wystarczy podłączyć do modułu MAX7219 i zaprogramować go.
Krok 3: Protokół
Komunikacja z MAX7219 jest stosunkowo prosta – korzysta z protokołu synchronicznego, co oznacza, że dla każdego wysyłanego przez nas bitu danych jest takt zegara oznaczający obecność tego bitu danych.
Innymi słowy, wysyłamy 2 równoległe sekwencje do bitów – jedną dla zegara, a drugą dla danych. To właśnie robi oprogramowanie.
Krok 4: Oprogramowanie
Sposób działania tego modułu MAX7219 jest następujący:
- Zapisujemy bajty do jego wewnętrznego rejestru.
- MAX7219 interpretuje dane.
- MAX7219 steruje diodami w matrycy.
Oznacza to również, że nie musimy cały czas krążyć po tablicy diod LED, aby je zapalić – o to dba kontroler MAX7219. Może również zarządzać intensywnością diod LED.
Aby więc w wygodny sposób korzystać z modułów MAX7219 potrzebujemy biblioteki funkcji do tego celu.
Po pierwsze, potrzebujemy kilku podstawowych funkcji, aby pisać do rejestrów MAX7219.
- Zapis bajtu do MAX7219.
- Zapis słowa (2 bajty) do MAX7219.
Funkcja zapisująca jeden bajt do kontrolera wygląda tak:
void max7219_byte(uint8_t dane) { for(uint8_t i = 8; i >= 1; i--) { PORTB &= ~(1 << MAX7219_CLK); // Ustaw CLK na LOW if (data & 0x80) // Maskuj MSB danych PORTB |= (1 << MAX7219_DIN); // Ustaw DIN na WYSOKI w przeciwnym razie PORTB &= ~(1 << MAX7219_DIN); // Ustaw DIN na LOW PORTB |= (1 << MAX7219_CLK); // Ustaw CLK na WYSOKIE dane <<= 1; // Przesuń w lewo } }
Teraz, gdy możemy wysyłać bajty do MAX7219, możemy zacząć wysyłać polecenia. Odbywa się to poprzez wysłanie 2 bajtów – 1 na adres rejestru wewnętrznego i 2 na dane, które chcemy wysłać.
W sterowniku MAX7219 jest kilkanaście rejestrów.
Wysłanie polecenia lub słowa to w zasadzie wysłanie 2 kolejnych bajtów. Implementacja funkcji jest bardzo prosta.
void max7219_word (adres uint8_t, dane uint8_t) { PORTB &= ~(1 << MAX7219_CS); // Ustaw CS na LOW max7219_byte(adres); // Wysyłanie adresu max7219_byte(data); // Wysyłanie danych PORTB |= (1 << MAX7219_CS); // Ustaw CS na HIGH PORTB &= ~(1 << MAX7219_CLK); // Ustaw CLK na LOW }
Należy tutaj zwrócić uwagę na linię, w której przywracamy sygnał CS z powrotem do HIGH – oznacza to koniec sekwencji – w tym przypadku koniec polecenia. Podobną technikę stosujemy przy sterowaniu więcej niż jedną matrycą połączoną w łańcuch. Następnym krokiem, zanim zaczniemy włączać i wyłączać diody, jest inicjalizacja kontrolera MAX7219. Odbywa się to poprzez zapisanie określonych wartości do określonych rejestrów. Dla wygody podczas kodowania możemy umieścić sekwencję inicjującą w tablicy.
uint8_t initseq = { 0x09, 0x00, // Rejestr trybu dekodowania, 00 = Brak dekodowania 0x0a, 0x01, // Rejestr intensywności, 0x00.. 0x0f 0x0b, 0x07, // Rejestr limitów skanowania, 0x07, aby wyświetlić wszystkie linie 0x0c, 0x01, // Rejestr wyłączania, 0x01 = normalne działanie 0x0f, 0x00, // Rejestr wyświetlania-testu, 0x00 = normalne działanie };
Wystarczy wysłać 5 powyższych poleceń w sekwencji jako pary adres/dane. Następny krok – zaświecenie rzędu diod LED.
To bardzo proste – po prostu piszemy jedno polecenie, w którym 1. bajt to adres (od 0 do 7) a 2. bajt to 8 bitów reprezentujących 8 diod w rzędzie.
void max7219_row(uint8_t adres, uint8_t dane) { if (adres >= 1 && adres <= 8) max7219_word(adres, dane); }
Należy pamiętać, że będzie to działać tylko dla 1 macierzy. Jeśli połączymy więcej macierzy w łańcuch, wszystkie pokażą te same dane. Powodem tego jest to, że po wysłaniu polecenia przywracamy sygnał CS z powrotem do stanu HIGH, co powoduje, że wszystkie kontrolery MAX7219 w łańcuchu zatrzaskują się i pokazują ostatnie polecenie.