Wykorzystanie modułu wyświetlacza matrycowego 8×8 z układem MAX7219 i Arduino UNO R3
Zadaniem układu jest wyświetlanie przewijanego napisu „KAMAMI”. Układ oparty jest na module Arduino UNO R3 oraz module wyświetlacza matrycowego. Program sterujący pracą mikrokontrolera Atmega328P (zawartego w module Arduino) został napisany w języku Bascom-AVR.
Układ wykorzystuje moduł wyświetlacza matrycowego 8×8 ze sterownikiem MAX7219, do którego dane przesyłane są szeregowo. Wysłane przez mikrokontroler dane (linia DIN) trafiają do rejestrów i są przesuwane wraz z narastającym zboczem na linii zegarowej CLK. Stan niski na linii CS pozwala na załadowanie danych do rejestrów; zmiana stanu tej linii na wysoki powoduje zatrzaśnięcie danych w rejestrach (ostatnie dwa bajty).
Program sterujący mikrokontrolera napisany został w języku Bascom (do jego skompilowania można użyć wersji demonstracyjnej kompilatora). Program zaczyna się deklaracją typu procesora oraz częstotliwości taktowania. Deklarowane są także 3 wyjściowe linie mikrokontrolera (linie komunikacji z układem MAX7219) oraz przypisane są im nazwy. Na listingu 1 przedstawiono fragment kodu programu zawierający deklaracje.
Listing 1. Fragment programu zawierający deklaracje
[bascomavr] $regfile = "m328pdef.dat" $crystal = 16000000 Config Pinc.0 = Output Config Pinc.1 = Output Config Pinc.2 = Output Din Alias Portc.0 Cs Alias Portc.1 Clk Alias Portc.2 [/bascomavr]
Komunikacja z mikrokontrolerem nie jest objęta żadnym standardem – dane wystawiane są na linie asynchronicznie, w takt linii CLK. Do obsługi wysyłania zmiennych stworzono procedurę Wyslij , której wywołanie powoduje wysłanie do układu MAX7219 wartości zmiennych Dane i Adres.
Dwa bajty danych wysyłane są przy użyciu instrukcji For…Next, wykonywanej dla każdego bajtu po 8 razy. Procedurę Wyslij przedstawiono na listingu 2.
Listing 2. Procedura Wyslij
[bascomavr]
Sub Wyslij
Reset Cs
Waitus 50
For Licz = 7 To 0 Step -1
Din = Adres.licz
Set Clk
Waitus 100
Reset Clk
Waitus 100
Next Licz
For Licz = 7 To 0 Step -1
Din = Dane.licz
Set Clk
Waitus 100
Reset Clk
Waitus 100
Next Licz
Set Cs
End Sub
[/bascomavr]
Do poprawnej pracy układu MAX7219 wymagane jest ustawienie jego parametrów początkowych poprzez wpisanie wartości do odpowiednich rejestrów. Po włączeniu układu do zasilania, mikrokontroler wywołuje procedurę Ustawienia , w której ustawianie są parametry pracy – tryb pracy, jasność matrycy, typ dekodowania, limit dświeżania oraz tryb testowy. Ustawiane są wartości adresu i danych, po czym wykonany zostaje skok do procedury wysyłania. Procedura ustawiania parametrów układu jest wykonywana tylko raz (listing 3).
Listing 3. Podprogram ustawiania parametrów układu
[bascomavr] Sub Ustawienia Set Cs Reset Din Reset Clk Adres = &HC 'shutdown mode Dane = &H1 'normal op Call Wyslij Waitms 10 Adres = &HA 'intensity Dane = &H03 'wartosc Call Wyslij Waitms 10 Adres = &H9 'decode mode Dane = &H0 'no decoding Call Wyslij Waitms 10 Adres = &HB 'scan limit Dane = &H7 'wszystkie Call Wyslij Waitms 10 Adres = &H0F 'test mode Dane = &H00 'normal op Call Wyslij Waitms 10 Call Czysc End Sub [/bascomavr]
Po włączeniu zasilania, lub w wyniku zakłóceń na liniach mikrokontrolera mogą pojawić się błędy na wyświetlaczu (np. wynikające ze źle zaadresowanych rejestrów). Całość ekranu czyszczona jest w podprogramie Czysc (listing 4), którego wywołanie spowoduje wpisanie zer do rejestrów odpowiedzialnych za wyświetlanie wierszy.
Listing 4. Podprogram Czysc
[bascomavr]
Sub Czysc 'czyszczenie całości
For Licz2 = 1 To 8
Adres = Licz2 'wiersz HEX:1-8
Dane = &H0 'kolumny HEX: wszystkie 0
Call Wyslij
Waitus 100
Next Licz2
End Sub
[/bascomavr]
Procedura czyszczenia wyświetlacza wykonywana jest także po zakończeniu wyświetlania napisu. Napis wyświetlany zapisany jest w tablicy danych, w postaciach serii wartości heksadecymalnych. Każda litera tekstu „KAMAMI” zajmuje po 8 bajtów.
Pętla główna programu odczytuje dane z tablicy, czytając je od końca – w pierwszej chwili po uruchomieniu zasilania dane odczytywane są od komórki 55, zaś po wykonaniu pełnego przesunięcia napisu, punkt początkowy odczytu z tablicy przesuwany jest na komórkę 63 (działanie programu tuż po uruchomieniu układu powoduje wyświetlenie pierwszej litery przy lewej krawędzi wyświetlacza, zaś po wykonaniu przesunięcia całego napisu pojawia się on od prawej strony).
Przesuwanie napisu polega na przesunięciu punktu odczytywania tablicy, każdorazowo zmniejszając go o jeden (po ośmiokrotnym wykonaniu pętli for…next zmniejszającej o 1 wykonywane jest dodanie liczby 7 do wartości zmiennej wskazującej na początek odczytu tabeli (zmienna Wartosc ).
Rozwiązanie to pozwala na łatwe przesuwanie napisu, jednak z tego względu napis musi być w całości umieszczony w tablicy, mimo powtarzania się liter, zaś po obu stronach napisu znajduje się po 8 bajtów pustych (wartości 0).
Pętlę główną oraz tablicę znaków przedstawiono na listingu 5.
Listing 5. Pętla główna oraz tablica znaków
[bascomavr]
Do
For Licz3 = 0 To 7
Waitms 1
Adres = Licz4
Dane = Lookup(wartosc , Tablica)
Call Wyslij
Decr Wartosc
Incr Licz4
If Licz4 > 8 Then
Licz4 = 1
End If
Next Licz3
Wartosc = Wartosc + 7
Waitms 25
If Wartosc = 8 Then
Call Czysc
Wartosc = 63
Waitms 500
End If
Loop
.
.
.
Tablica:
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 '
Data &H00 , &H00 , &H00 , &H00 , &H00 , &HFD , &HFD , &H00 'i
Data &H00 , &HFF , &HFF , &H0E , &H1C , &H0E , &HFF , &HFF 'm
Data &H00 , &H00 , &HF8 , &HFF , &H13 , &H13 , &HFF , &HF8 'a
Data &H00 , &HFF , &HFF , &H0E , &H1C , &H0E , &HFF , &HFF 'm
Data &H00 , &H00 , &HF8 , &HFF , &H13 , &H13 , &HFF , &HF8 'a
Data &H00 , &H00 , &H81 , &HC3 , &H66 , &H3C , &HFF , &HFF 'k
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
[/bascomavr]
Na listingu 6 pokazano kompletny program.
Listing 6. Kompletny program w jęzku Bascom AVR
[bascomavr]
$regfile = "m328pdef.dat"
$crystal = 16000000
Config Pinc.0 = Output
Config Pinc.1 = Output
Config Pinc.2 = Output
Din Alias Portc.0
Cs Alias Portc.1
Clk Alias Portc.2
Declare Sub Wyslij
Declare Sub Ustawienia
Declare Sub Czysc
Dim Licz As Byte
Dim Adres As Byte
Dim Dane As Byte
Dim Licz2 As Byte
Dim Licz3 As Byte
Dim Licz4 As Byte
Dim Wartosc As Byte
Call Ustawienia
Licz4 = 1
Wartosc = 55
Do
For Licz3 = 0 To 7
Waitms 1
Adres = Licz4
Dane = Lookup(wartosc , Tablica)
Call Wyslij
Decr Wartosc
Incr Licz4
If Licz4 > 8 Then
Licz4 = 1
End If
Next Licz3
Wartosc = Wartosc + 7
Waitms 25
If Wartosc = 8 Then
Call Czysc
Wartosc = 63
Waitms 500
End If
Loop
Sub Ustawienia
Set Cs
Reset Din
Reset Clk
Adres = &HC 'shutdown mode
Dane = &H1 'normal op
Call Wyslij
Waitms 10
Adres = &HA 'intensity
Dane = &H03 'wartosc
Call Wyslij
Waitms 10
Adres = &H9 'decode mode
Dane = &H0 'no decoding
Call Wyslij
Waitms 10
Adres = &HB 'scan limit
Dane = &H7 'wszystkie
Call Wyslij
Waitms 10
Adres = &H0F 'test mode
Dane = &H00 'normal op
Call Wyslij
Waitms 10
Call Czysc
End Sub
Sub Czysc 'czyszczenie całości
For Licz2 = 1 To 8
Adres = Licz2 'wiersz HEX:1-8
Dane = &H0 'kolumny HEX:wszystkie 0
Call Wyslij
Waitus 100
Next Licz2
End Sub
Sub Wyslij
Reset Cs
Waitus 50
For Licz = 7 To 0 Step -1
Din = Adres.licz
Set Clk
Waitus 100
Reset Clk
Waitus 100
Next Licz
For Licz = 7 To 0 Step -1
Din = Dane.licz
Set Clk
Waitus 100
Reset Clk
Waitus 100
Next Licz
Set Cs
End Sub
Tablica:
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 '
Data &H00 , &H00 , &H00 , &H00 , &H00 , &HFD , &HFD , &H00 'i
Data &H00 , &HFF , &HFF , &H0E , &H1C , &H0E , &HFF , &HFF 'm
Data &H00 , &H00 , &HF8 , &HFF , &H13 , &H13 , &HFF , &HF8 'a
Data &H00 , &HFF , &HFF , &H0E , &H1C , &H0E , &HFF , &HFF 'm
Data &H00 , &H00 , &HF8 , &HFF , &H13 , &H13 , &HFF , &HF8 'a
Data &H00 , &H00 , &H81 , &HC3 , &H66 , &H3C , &HFF , &HFF 'k
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 '
[/bascomavr]

Dominik Bednarski porównuje STM32MP1 i OpenSTLinux oraz Raspberry Pi 5
Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć 



