Witam.
Kupiłem kiedyś ten (wspomniany w temacie) LCD. I przyszedł czas na napisanie sterownika. LCD podłączyłem pod ATB z uC ATMega32 taktowany 11059200Hz. Szyna równoległa 8-bit. Zacząłem od podstaw, czyli inicjalizacji oraz uruchomienia trybu znakowego. Wziąłem w łapę notę i coś tam napisałem. Udało się zainicjalizować, wyświetlać 4 linie. Więc jakby sukces. Ale to był jakby prototyp biblioteki... przed każdym odczytem i zapisem danych używałem instrukcji delay. Jestem amatorem, ale wiem, że wyświetlacz podłączony równolegle powinien działać szybko. Więc przyszedł czas na kontrolę Busy Flag wyświetlacza.
I tu zaczęły się schody. Wstawiłem w funkcji wysyłającej dane lub instrukcje do LCD sprawdzanie Busy Flag jak poniżej. Dodatkowo podłączyłem "debugger"

język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Funkcja check_BF ma jak wiadomo za zadanie odczytanie 8-go bitu szyny danych LCD. Zatem ją odczytuję:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
I po tym wyświetlacz przestał działać. Program kończył działanie na TEST_LED_ON; Więc ewidentnie BF nie jest odczytane. Spędziłem wiele godzin na rozkminianie dlaczego. Może coś źle zdefiniowałem porty, kierunki, przypisania itd.. Ale nie. Wszystko OK. Przeszukiwałem Internet. Trafiłem na poniższy trop z arduino dotyczący kontroli BF:
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dodałem zatem do kodu co poniżej:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Efekt jest taki że LCD działa perfekcyjnie.
Ma ktoś pojęcie dlaczego tak się dzieje? W specyfikacji ST7920 są podane czasy "Exec time" czyli czas wykonania instrukcji. Przy zapisie instrukcji i danych ten czas to 72us. Jedyny wyjątek Read Busy Flag... jest 0us. Dlaczego w takim razie brak tej 1us uniemożliwia odczytanie BF? Studiowałem też bibliotekę Mirka do HD44780. Przed odczytem BF nie ma delay'ów, a działa.
Zatem dlaczego tu są takie cuda?
Dzięki za wskazówki