logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

HD44780 LPC1769 - Sterowanie wyświetlaczem LCD HD44780

Kubbaz 13 Paź 2014 10:52 3090 16
  • #1 14037469
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    Witam wszystkich Elektrodowiczów!

    Muszę podłączyć wyświetlacz alfanumeryczny LCD 2x20 na sterowniku HD44780 do mikrokontrolera LPC1769 w trybie 4-bitowej transmisji danych.
    Wyświetlacz mam podłączony przez konwerter napięć KAMAMI Development Boards Logic Converter ST2378E. Stronę Vl (napięcie logiczne) prowadzę z płytki LPCXpresso LPC1769 (+3,3 V), natomiast napięcie wyświetlacza prowadzę z zasilacza +5,0 V.

    Linie wyświetlacza są podpięte:

    linie sterujące:
    pin 4 - RS - GPIO P0.0 w LPC1769 (Register Select),
    pin 5 - RW - GPIO P0.1 w LPC1769 (Read or Write),
    pin 6 - EN - GPIO P0.2 w LPC1769 (Enable),

    linie danych:
    pin 7 - D4 - GPIO P2.0 w LPC1769 (DATA bit 4 LSB),
    pin 8 - D5 - GPIO P2.1 w LPC1769 (DATA bit 5),
    pin 9 - D6 - GPIO P2.2 w LPC1769 (DATA bit 6),
    pin 10 - D7 - GPIO P2.3 w LPC1769 (DATA bit 7 MSB).

    Poniżej zamieszczam kod źródłowy w C, który napisałem, ale który niestety nie działa... a wg mnie jest OK. Najwyraźniej jednak coś jest z nim nie tak.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 14037503
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Odstęp czasowy od ustawienia danych do zakończenia impulsu ENABLE musi wynosić (bodajże) 250 ns. Tyle samo od opadającego zbocza E do najbliższego narastającego. Nie zachowujesz wymagań czasowych sterownika.
    Konwerter poziomów nie jest do niczego potrzebny.
  • #3 14037596
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    BlueDraco napisał:
    Odstęp czasowy od ustawienia danych do zakończenia impulsu ENABLE musi wynosić (bodajże) 250 ns


    Wówczas wyświetlacz musiałby pracować z częstotliwością aż 4 MHz (?).

    Strona 49 dokumentacji Hitachi HD44780, tabelka Write Operatrion:
    Hitachi HD44780

    Czas zbocza narastającego i opadającego - min. 25 ns, ale tu chodzi o fizyczne opadanie i narastanie napięcia, a nie o czas trwania stanu wysokiego i niskiego.

    Czas trwania cyklu Enable - min. 1 us (maksimum nie określono).

    BlueDraco napisał:
    Konwerter poziomów nie jest do niczego potrzebny.

    Sprawdziłem mój wyświetlacz. Zaczyna świecić od napięcia Vcc = 4,20 V (wówczas w ogóle widać jakikolwiek kontrast - czyli minimalny).
    Przy zasilaniu Vcc = 5,0 V kontrast jest poprawny (duży).

    Wypiąłem konwerter poziomów napięć i liniami z wyświetlacza podpiąłem się bezpośrednio do mikrokontrolera LPC1769, natomiast linię zasilania Vcc (pin 2) podłączyłem do zasilacza +5,0 V (masa zasilacza i płytki LPCXpresso LPC1769 są połączone).
    Dodatkowo dodałem opóźnienie w funkcji void SentLCD (char x), pomiędzy zmianą stanu Enable, ale niestety wyświetlacz dalej nic nie wyświetla.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #4 14037642
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Chodzi o minimalne czasy stanów 0 i 1 na E, ale przede wszystkim o czas od stabilizacji danych do zbocza E.

    Zasilać LCD możesz (i musisz) z 5V, ale poziomy sygnałów wejściowych pozostają zgodne z logiką 3.3 V.

    Na rejestrach FIOSET i FIOCLR nie wykonuje się operacji logicznych, bo nie ma to żadnego sensu.

    Skąd pomysł, że operacja na FIOSET da Ci opóźnienie 250 ns?

    Twój kod nadal nie trzyma zależności czasowych.
  • #5 14037662
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    BlueDraco napisał:
    Na rejestrach FIOSET i FIOCLR nie wykonuje się operacji logicznych, bo nie ma to żadnego sensu.

    Nie rozumiem co masz na myśli?

    BlueDraco napisał:
    Skąd pomysł, że operacja na FIOSET da Ci opóźnienie 250 ns?

    Ja tego nie zakładam... I dalej nie wiem skąd te 250 ns?
  • #6 14037815
    Badmaneq
    Poziom 23  
    Posty: 567
    Pomógł: 76
    Ocena: 23
    Zamieszam wycinek kodu, co prawda napisany dla LPC1114 lecz po małych modyfikacjach musi działać na LPC17xx

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 14037942
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    Upraszczam nieco sprawę i chcę na start wykonać instrukcję z dokumentacji HD44780 ze strony 42: 4-Bit Operation, 8-Digit x 1-Line Display Example with Internal Reset.

    Napisałem prosty kod krok po kroku z uwzględnieniem 1 ms opóźnienia po każdym podniesieniu linii Enable w stan wysoki, ale niestety wyświetlacz nie działa... (tzn. świecą się wiersze 1 i 3).

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Używam wyświetlacza CBC020004H07-FIW-R-01, 4x20.
  • #8 14038001
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Popatrz na parametry tDSW i PWEH w dokumentacji HD44780.

    Wcześniej przeczytaj, jak działa zapis do FIOSET i FIOCLR i pomyśl, jaki sens mają operacje logiczne na tych rejestrach.
  • #9 14039735
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    BlueDraco napisał:
    Wcześniej przeczytaj, jak działa zapis do FIOSET i FIOCLR


    Za skarby nie mogę nic znaleźć o sposobie zapisu do rejestrów FIOSET i FIOCLR...
    Wszędzie piszą tylko o efekcie działania tych rejestrów.
    Czy Ty posiadasz jakieś źródła na ten temat?
    Z drugiej strony nigdy nie miałem problemów z rejestrami FIOSET i FIOCLR.
    Poza tym, nie wiem jak w inny sposób ustawiać wartości GPIO jak za pomocą właśnie rejestrów FIOSET i FIOCLR...?
  • #10 14039780
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Nie chodzi o sposób zapisu, a o jego skutek, co jest jasno opisane w manualu UM10360. Rejestry te wymyślono specjalnie po to, żeby nie trzeba było używać operacji logicznych przy zmianie stanu linii portów. Chcesz wyzerować linię portu - zapisujesz jedynkę na odpowiedni bit FIOCLR. Zapis zera nie robi nic, np:

    // Set line RS low to write configure data
    LPC_GPIO0->FIOCLR = (1<<0);
    LPC_GPIO0->FIOSET = (1<<2); // Enable line high

    Dodajmy, że w manualu jest napisane, że rejestry FIOCLR są tylko do odczytu, więc działanie operacji logicznych na FIOCLR jest neokreślone. ;)
  • #11 14039808
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    BlueDraco napisał:
    Chcesz wyzerować linię portu - zapisujesz jedynkę na odpowiedni bit FIOCLR. Zapis zera nie robi nic, np:

    // Set line RS low to write configure data
    LPC_GPIO0->FIOCLR = (1<<0);
    LPC_GPIO0->FIOSET = (1<<2); // Enable line high


    Tak, o tym wiem, że zapis zera logicznego do rejestrów FIOSET i FIOCLR nic nie robi i że te rejestry są wyłącznie do zapisu a nie odczytu.

    BlueDraco napisał:
    Dodajmy, że w manualu jest napisane, że rejestry FIOCLR są tylko do odczytu, więc działanie operacji logicznych na FIOCLR jest nieokreślone. Wink


    OK, zatem zapis:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Nie do końca wiadomo co zrobi...
    Natomiast zapis:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ustawi bit 0 w stan niski.

    Przeanalizowałem dokumentację Hitachi HD4478U w szczególności strony 52 i 58 z timingiem magistrali.

    Otóż najpierw trzeba ustawić linię EN w stan wysoki. Jego stan ustalony (wysoki) nimi trwać min. 150 ns, po czym dopiero można wystawić żądane przez nas wartości na liniach danych DB4-DB7 z pozytywnym skutkiem.
    Dalej trzeba podtrzymać stan wysoki linii EN przy wciąż ustawionych liniach DB4-DB7 przez czas min. 80 ns - co w sumie daje czas min. 230 ns (150 ns + 80 ns = 230 ns) czasu trwania stanu wysokiego linii EN.
    Potem linia EN przechodzi w stan niski (z wciąż ustawionymi tak samo liniami danych DB4-DB7) przez min. 10 ns.
    Dalej stan linii EN jest niski przez min. 250 ns.
    Tyle trwa cały pojedynczy cykl zapisu pojedynczej paczki bajtu/połowy bajtu - min. 500 ns.
    Jeszcze raz przestudiuję mój kod pod kątem czasów.
  • #12 14039819
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    źle analizowałeś dokumentację HD44780. Stan linii danych można (chociaż nie ma takiego obowiązku) ustawić przy niskim E. istotne jest, by wysoki poziom E trwał nie krócej niż PWEH oraz by dane zostały ustawione nie później niż tDSW przed opadającym zboczem E. Potem jest jeszcze wymagany minimalny odstęp między zboczami E.
  • #13 14040088
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    Wprowadziłem stosowne zmiany w moim kodzie:
    - dodałem odpowiednie opóźnienia po zmianie stanu linii EN oraz RS (1 mikrosekunda),
    - nieco zmodyfikowałem ustawienia wyświetlacza.


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wyświetlacz co prawda wygasił się - zniknęły dwie linie, które się świeciły.

    Zastanawia mnie fakt czy HD44780 obsługuje wyświetlacze z 4 wierszami po 20 znaków, każdy znak 5x8 punktów? Z tego co zauważyłem w dokumentacji maksimum, to 2 wiersze.

    Może spróbuje się przepiąć jeszcze na LCD 2 x 16, 5x8 punktów (WINSTAR WH1602A-YYH-ETK#)?

    Po podłączeniu wyświetlacza WINSTAR WH1602A i podłączeniu Vcc (+5 V) zaświeca się górna linia, natomiast po uruchomieniu programu gaśnie górna, ale niestety nic się nie wyświetla...
  • #14 14040230
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Obsługuje, bo ma pamięć na 80 znaków. Taki wyświetlacz jest widziany jako 2 x 40, zwykle 3. linia jest kontynuacją pierwszej.

    Jeśli góra gaśnie, to znaczy, że wyświetlacz zainicjował się poprawnie na 2 wiersze - sukces., ale jak się dobrze przyjrzeć - widać w Twoim kodzie jeszcze brak opóźnienia tDSW.
  • #15 14040326
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    BlueDraco napisał:
    Obsługuje, bo ma pamięć na 80 znaków. Taki wyświetlacz jest widziany jako 2 x 40, zwykle 3. linia jest kontynuacją pierwszej.

    Dzięki za odpowiedź. Póki co i tak przełączyłem się na LCD WINSTARa 2x16.

    BlueDraco napisał:
    Jeśli góra gaśnie, to znaczy, że wyświetlacz zainicjował się poprawnie na 2 wiersze - sukces.

    Jest dobrze ;).

    BlueDraco napisał:
    ...ale jak się dobrze przyjrzeć - widać w Twoim kodzie jeszcze brak opóźnienia tDSW

    Aaaa... z tego wszystkiego - przejęcia się odpowiednim sterowaniem linią EN zamiast linie danych wysyłać na LPC_GPIO2->... miałem z rozpędu napisane LPC_GPIO0->..., więc nigdy nic się nie wysyłało do LCD. Już zrobiłem poprawkę w wysyłaniu MSB i LSB w funkcji SentLCD.

    Hmm...wracając do opóźnienia tDSW - popatrzmy:
    Dokumentacja Hitachi HD44780 strona 58 figure 25:
    1. EN = 1 na 230 ns w sumie
    2. teraz czekaj 150 ns aż wystawisz DANE
    3. DANE = ... coś
    4. odczekaj 80 ns (i nie rób nic z EN i DANE)
    5. EN = 0
    6. teraz odczekaj 10 ns (nie rób nic z DANE dalej)
    7. możesz zmienić DANE = ... coś innego
    8. odczekaj 250 ns z EN = 0, żeby zbocza przeciwne EN nie były zbyt blisko siebie
    koniec albo od nowa

    no i w moim kodzie (fragm. funkcji SentLCD):

    LPC_GPIO0->FIOSET = (1<<2); -> tu pkt. 1 EN = 1
    Timer0_MicroSeconds2 (1); -> tu pkt. 2 (czekam 1 us zamiast 150 ns)
    LPC_GPIO2->FIOSET = ((Byte & 0xF0) >> 4); -> tu pkt. 3 (wystawiam dane na linie DB)
    Timer0_MicroSeconds2 (1); -> tu pkt. 4 (czekam 1 us i nie robię nic z EN i DANE) i tu jest czas tDSW
    LPC_GPIO0->FIOCLR = (1<<2); -> tu pkt. 5 EN = 0
    Timer0_MicroSeconds2 (2); -> tu pkt. 6 + pkt. 7 (odczekuje 2 us, żeby następne zbocze narastające nie było zbyt blisko tego opadającego zbocza)

    Zmodyfikowałem również nieco końcowe ustawienia LCD.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #16 14040582
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    źle. Nie ma żadnego wymagania na to, żeby dane wystawiać po E. Dane mogą być wystawione przy E=0, albo przy E=1, istotne jest tylko zachowanie odstępu przed opadającym zboczem E i podtrzymanie (króciutkie) po tym zboczu. No i po 250 ns pomiędzy zmianami E.

    Szybka obsługa LCD na STM32 była pokazana w EP wiosną lub latem tego roku.
  • #17 14058377
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    Witam po krótkiej przerwie.
    Skorzystałem z pomocy "wideo" dostępnej na:
    Obsługa wyświetlacza lcd dla opornych
    lub to samo na YouTube:
    Obsługa wyświetlacza lcd dla opornych

    Sam jestem w szoku, że z tzw. "palca" można sterować tymi wyświetlaczami z driverem Hitachi HD44780.
    Napisałem prosty kod - algorytm wg tego co widać na filmiku - działa.
    Jutro zamieszczę kod źródłowy.

Podsumowanie tematu

✨ W dyskusji poruszono problem podłączenia wyświetlacza LCD 2x20 z kontrolerem HD44780 do mikrokontrolera LPC1769 w trybie 4-bitowym. Użytkownik miał trudności z poprawnym działaniem wyświetlacza, mimo zastosowania konwertera napięć KAMAMI ST2378E. Uczestnicy wskazali na istotne wymagania czasowe dotyczące sygnału Enable (EN) oraz stabilizacji danych przed jego opadaniem. Zwrócono uwagę na konieczność odpowiednich opóźnień w kodzie, aby spełnić specyfikacje HD44780. Po wprowadzeniu poprawek w kodzie oraz zastosowaniu właściwych opóźnień, użytkownik uzyskał poprawne działanie wyświetlacza. W końcu, użytkownik skorzystał z materiałów wideo, które pomogły w zrozumieniu obsługi wyświetlacza.
Wygenerowane przez model językowy.
REKLAMA