Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 26 kwi 2024, o 20:13


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 29 maja 2017, o 18:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2016
Posty: 248
Lokalizacja: Norwegia
Pomógł: 16

Witajcie
od kilku dni próbuję znaleźć zrozumiałą dla mnie bibliotekę do LCD na ST7920. Znalazłem bibliotekę chyba najczęściej polecaną u8g, ale nie potrafię jej ogarnąć. Jest tak rozbudowana i uniwersalna że powoduje zamęt w moim starym umyśle...
W moim projekcie chcę puścić ten wyświetlacz na programowym SPI i przeglądają internet znajduję przykłady które są zbyt złożone jak na mój poziom wiedzy.
Może ktoś z Was ma proste rozwiązanie które mógł bym sobie przysposobić?
Jeżeli to mi się nie uda to porzucę pomysł z tym wyświetlaczem i zastosuje OLED, ale zanim to uczynię pytam szanownych kolegów czy może coś takiego już przewalczyliście?
Zapomniałem dodać że chodzi mi o bibliotekę w C dla AVR :) Za słaby jestem żeby samemu przewalać coś z Arduino :(

_________________
SP2LUB - LA1BUA



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 cze 2017, o 12:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2016
Posty: 248
Lokalizacja: Norwegia
Pomógł: 16

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.
Obrazek

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
Obrazek

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
Obrazek

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
Obrazek


procedura wysyłania danych do ST7920 po SPI ja akurat używam programowego SPI
Składnia: [ Pobierz ] [ Ukryj ]
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:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Druga funkcja
Składnia: [ Pobierz ] [ Ukryj ]
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
Składnia: [ Pobierz ] [ Ukryj ]
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
Składnia: [ Pobierz ] [ Ukryj ]
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.

_________________
SP2LUB - LA1BUA



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 cze 2017, o 07:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1148
Lokalizacja: Kraków
Pomógł: 93

Przeglądam ostatni wpis. Czy w funkcji ST7920_Init() konieczne jest wywołanie funkcji ST7920_Bas_FunctionSet(1);, jeżeli jest ona również wywołana w funkcji ST7920_InitInGraphMode();?
Świetne opisanie problemu nowych programistów ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 cze 2017, o 15:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2016
Posty: 248
Lokalizacja: Norwegia
Pomógł: 16

Marhef napisał(a):
Przeglądam ostatni wpis. Czy w funkcji ST7920_Init() konieczne jest wywołanie funkcji ST7920_Bas_FunctionSet(1);, jeżeli jest ona również wywołana w funkcji ST7920_InitInGraphMode();?
Świetne opisanie problemu nowych programistów ;)


Dziękuję za dobre słowo.
rzeczywiście nie trzeba wywoływać Bas_FunctionSet.. ja w procedurze init testowałem różne tryby pracy (graficzny, tekstowy i czyszczenie ekranu przy starcie.. ) i tak zapomniałem w końcu co tam musi a co może być :)

_________________
SP2LUB - LA1BUA



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 cze 2017, o 17:47 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27226
Lokalizacja: Szczecin
Pomógł: 1041

A dlaczego wrzuciłeś swoją pracę w dział rybny ? zamiast do DIY do projektów programistycznych ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 cze 2017, o 18:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2016
Posty: 248
Lokalizacja: Norwegia
Pomógł: 16

Tak się ucieszyłem że mi coś wyszło że po prostu dopisałem to do pierwszego posta który zamieściłem w dziale rybnym :)

_________________
SP2LUB - LA1BUA



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO