Witajcie
Ponieważ nie było odzewu na moje zapytanie o wyświetlacz ST7920, a ja właśnie takiego potrzebuję użyć i właśnie na SPI, postanowiłem uporać się z problemem sam.
Przepraszam wszystkich zaawansowanych czytelników. Opisuję tutaj swoje początkujące poczynania zapewne mało interesujące dla zaawansowanych, jednak myślę że ktoś taki jak ja szukający pomocy z ST7920 może coś z tego dla siebie zaczerpnąć.
Jestem bardzo początkujący w programowaniu i przyznam że nie wierzyłem że uda mi się uruchomić taki wyświetlacz. Byłem pewny że to mnie przerasta. Próbowałem najpierw ogarnąć bardzo powszechną bibliotekę u8glib, jednak ta biblioteka samym swoim rozmiarem po prostu mnie przerasta. Mimo iż obejrzałem poradniki Mirka na temat oled SSD1306 i przeczytałem zieloną książkę w miarę uważnie, to złożoność u8glib przerastała moje możliwości ogarniania kodu. Szukałem oczywiście w internecie i miałem nadzieję że podejrzę jak to zrobili inni. Przecież ten display pochodzi z epoki kredy, ktoś musiał już opublikować jakieś przydatne informacje o nim. Okazuje się jednak że gro użytkowników używa ARDUINO którego ja jeszcze rozumiem i tam właśnie uruchamiają bibliotekę u8glib. Masa ludzi publikuje jakieś swoje osiągnięcia z tymi wyświetlaczami, jednak mało kto chce się podzielić z początkującym jak ja.
Znalazłem kilka fajnych opracowań w necie, ale na interface równoległy. To nic, tam też było trochę wiedzy która mi się przydała ale wciąż za mało..
Sięgnąłem więc po notę wyświetlacza ST7920 i zacząłem "po swojemu".
Najpierw doczytałem się że ST7920 może pracować zarówno w trybie graficznym jak i tekstowym w dodatku tryb tekstowy jest kompatybilny z popularnym HD44780 (pewnie to nie nowość dla obeznanych z tym interfacem ale dla mnie to było coś nowego). Podłączyłem więc mój wyświetlacz dokładnie tak jak HD44780 używając biblioteki Mirka z NIEBIESKIEJ KSIĄŻKI i wyświetlacz ładnie mi pokazał znaki. To było proste, ale tryb tekstowy oraz sterowanie równoległe to nie to czego ja potrzebuję, jednak już jakiś pozytyw się pojawił. Zacząłem drążyć dalej..
1. Zgodnie z notą katalogową wyświetlacza, aby sterować go przez SPI należy pin PSB połączyć do masy i tutaj pierwsza uwaga.
W moim egzemplarzu pin PSB był podciągnięty do VCC zworką (R9). Musiałem tę zworkę odlutować. To nie pierwsza taka niespodzianka na którą się natknąłem w tanich produktach z dalekiego wschodu.
W internecie znalazłem kilka opisów gdzie dla transmisji SPI ktoś każe podciągać PSB do VCC ale to nie prawda to jest totalna bzdura których jak się potem okazało jest cała masa w internecie.
Nota katalogowa pokazuje coś takiego:
"ST7920 is in serial interface mode when pull down PSB pin. Two pins (SCLK and SID) are used to complete the data transfer.
Only write data is available." Czyli dla transmisji szeregowej, należy ustawić stan NISKI na PSB. Wystarczy też użyć dwóch pinów (SCLK i SID) aby transferować dane do wyświetlacza ponieważ tylko ZAPIS jest dostępny w trybie komunikacji szeregowej. Nie da się odczytywać danych z wyświetlacza. Czyli z procesora wystarczy wystawić dwa sygnały MOSI i SCK aby zapisać coś do LCDka.
dalej jest tak:
"When connecting several ST7920, chip select(CS)must be used. Only when(CS)is high the serial clock(SCLK)can be
accepted. On the other hand, when chip select(CS)is low ST7920 serial counter and data will be reset. Transmission will be
terminated and data will be cleared. Serial transfer counter is set to the first bit. For a minimal system with only one ST7920 and
one MPU, only SCLK and SID pins are necessary. CS pin should pull to high."
Co oznacza że jeżeli używamy więcej niż jednego wyświetlacza, musimy użyć sygnału CS (to jest logiczne). Teraz ważne -
tylko jeśli na CS jest stan wysoki, wyświetlacz może odbierać sygnał SCLK. W przeciwnym wypadku jeśli CS jest w tanie niskim, licznik zegarowy oraz dane będą zresetowane a transmisja szeregowa przerwana i dane zostaną wyczyszczone.
Jeżeli używamy tylko jednego wyświetlacza ST7920, wszystko czego potrzeba do transmisji szeregowej to SCLK, SID a CS powinien być podciągnięty do VCC.
zainicjowałem zatem w moim projekcie programowy SPI i podłączyłem wyświetlacz w taki sposób:
wyświetlacz RS (CS) do VCC
wyświetlacz RW do MOSI
wyświetlacz E do SCK
wyświetlacz PSB do GDN
Jak się potem okazało, także sygnał reset nie jest potrzebny...
Ponieważ byłem strasznie zdesperowany żeby już coś sobie spróbować wysłać do wyświetlacza, spróbowałem wysłać komendę hex w której są rozkazy włączenia wyświetlacza, włączenia i migania kursora.
2. w nocie znalazłem tabelę wszystkich komend do obsługi tego wyświetlacza a wśród nich była ta
Niestety wyświetlacz nic mi nie pokazał....
wróciłem więc do noty i pokornie czytałem dalej na temat transmisji serial, a tam jest napisane tak:
"When starting a transmission a start byte is required. It consists of 5 consecutive 〝1〞(sync character). Serial transfer counter
will be reset and synchronized. Following 2 bits for read/write(RW)and register/data select(RS). Last 4 bits is filled by 〝0〞"
Co znaczy mniej więcej to:
Kiedy zaczyna się transmisja szeregowa wymagany jest "startbajt". Zawiera on 5 następujących po sobie jedynek (potrzebne resetu i synchronizacji zegara w wyświetlaczu) dalej po pięciu jedynkach następują dwa bity RW oraz RS a ostatni bit musi być zero.
Czyli oprócz bajtu z rozkazem muszę wysłać bajt startu. !!! ok
Czytam dalej
"After receiving the sync character and RW and RS bits, every 8 bits instruction/data will be separated into 2 groups. Higher
4 bits(DB7~DB4)will be placed in first section followed by 4 〝0〞. And lower 4 bits(DB3~DB0)will be placed in second
section followed by 4 〝0〞."
Co oznacza:
Po odebraniu synchronizacji wraz z bitai RW i RS, każde 8 bitów instrukcji czy danych będzie podzielone na dwie grupy.
Wysokie 4 bity (DB7-DB4) będą ustawione jako pierwsze a za nimi 4 bity 0 (takie bity separujące). Niskie 4 bity (DB3-DB0) będą umieszczone w kolejnej sekcji a za nimi znowu 4 bity 0.
Czyli wniosek taki, w transmisji szeregowej do wyświetlacza ST7920 trzea wysyłać zawsze 3 bajty. Pierwszy bajt synchronizacji, i dwa bajty rozkaz/data.
ten rysunek świetnie to obrazuje
Kiedy zastosowałem się do tych wytycznych i zmodyfikowałem moją procedurę SPI dla wysyłania tych trzech bajtów, wysłałem instrukcję włączenia wyświetlacza wraz z włączeniem i miganiem kursora. I zadziałało. No prostu byłem szczęśliwy patrząc na ten migający kursor jak dziecko na czekoladę.
Pracowałem z tym wyświetlaczem jeszcze długo i stworzyłem sobie swoją bibliotekę której fragmenty przedstawię dla tych którzy jak ja nie mogli znaleźć w internecie pomocy z tym prostym starym sterownikiem ST7920.
Na początek wzorując się na Mirkowym opracowaniu biblioteki do OLED, stworzyłem sobie procedury do obsługi sprzętu (wysyłanie inicjacji, komend i danych do wyświetlacza po SPI). Potem w większości używałem Mirka metody do pozyskiwania pewnych rozwiązań związanych z obsługą graficzną tego wyświetlacza. Kilka procedur (tych procedur do obsługi graficznej) po naprawdę drobnej modyfikacji pozyskałem z biblioteki napisanej przez Mirka dla sterownika SSD1306. Tych procedur nie będę umieszczał bo można je znaleźć w Mirkowym poradniku na YT albo zakupić w sklepie ATNEL.
Wyświetlacz pracuje bardzo fajnie w trybie graficznym, w każdym razie jak na moje potrzeby jest ok
procedura wysyłania danych do ST7920 po SPI ja akurat używam programowego SPI
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
W nocie katalogowej znajduje się sporo ładnie opisanych instrukcji dla tego sterownika. Zauważymy że wyświetlacz ma dwa rodzaje komend, podstawowe i rozszerzone (Basic i Extended).
żeby zainicjować wyświetlacz do trybu graficznego potrzeba kilku procedur. Pierwsza do ustawiania trybu bacis:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Druga funkcja
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i właściwa funkcja (w której użyte są dwie poprzednie funkcje) ustawiająca tryb graficzny
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i na koniec, już ostateczna prościutka funkcja której używam w programie do inicjacji wyświetlacza wraz z SPI
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Mając powyższe, można posiłkując się poradnikiem Mirka o OLEDACH albo ZIELONĄ KSIĄŻKĄ stworzyć swoje funkcje wyższego poziomu do obsługi graficznej wyświetlacza.
Należy pamiętać że w tym wyświetlaczu wysyłane do niego dane, trafiają do jego pamięci którą potem trzeba przepisać już na wyświetlacz.
Nie chcę umieszczać całej biblioteki gdyż zawarte są w niej nie tylko moje procedury do których nie mam praw autorskich.
Zamieszczone tu informacje powinny już w dużej mierze pomóc komuś kto boryka sie z takimi problemami jak ja.