Elektroda.pl
Elektroda.pl
X
PLC Fatek
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Problem z wyświetlaczem lcd na sterowniku HD44780

y0yster 09 Cze 2007 08:45 3827 39
  • #1 09 Cze 2007 08:45
    y0yster
    Poziom 19  

    Witam.

    Zacząłem sobie pisać prosty program, który wyświetlił bym mi literkę 'A' na lcd. Lecz jak zawsze to bywa w początkach troszkę się pogubiłem i mam problem z wyświetleniem tej literki.

    Załączam kod programu. Prosił bym o sprawdzenie co jest w nim żle. Z góry dziękuję i pozdrawiam.

    Dodam, że piszę w asemblerze. Plik został skompresowany 7-zipem, tylko rozszerzenie zostało zmienione.

    0 29
  • PLC Fatek
  • #2 09 Cze 2007 09:39
    deseng
    Poziom 22  

    Nie bardzo to się daje rozpakować (przynajmniej u mnie).

    0
  • #3 09 Cze 2007 11:23
    y0yster
    Poziom 19  

    Ok. Skompresowałem zipem.

    Proszę o pomoc. może kod troszkę nie jasny, ale na pewno, będzie się dało to odczytać. Jeśli miał by ktoś jakiś przykład, który by wyświetlał jakąś jedną literkę :P to proszę, żeby wrzucił kod tutaj.

    0
  • #4 09 Cze 2007 11:29
    szod
    Poziom 33  

    Nie piszesz co nie działa. Jeśli masz cały czas ciemne kwadraty na wyświetlaczu
    LCD to masz problem z inicjalizacją. Moim zdaniem masz tą procedurę do
    poprawy. Poczytaj sobie cykl artykułów o alfanumerycznych wyświetlaczach LCD:
    http://www.edw.com.pl/index.php?module=ContentExpress&func=display&ceid=68&meid=-1
    O inicjalizacji i sterowaniu też tam jest. Nie przedstawiłeś też schematu połączeń
    bo może tam też masz jakiś błąd.

    0
  • #5 09 Cze 2007 11:35
    migol
    Poziom 18  

    Jasne ze masz skopana funkcja inicjalizująca. Nie pamiętam już jak dokładnie się to obsługiwało, bodaj trzeba 3 razy wyslac 30h jako komende, po kazdym razie czekajac ileśtam czasu i wtedy dopiero to odpalało.

    0
  • #6 09 Cze 2007 11:42
    y0yster
    Poziom 19  

    Niestety nawet nie mam wszystkich czarnych prostokącików. Nie wiem, czy to coś zmienia jak nie mam wogóle podłączonego potencjometra do regulacji kontrastu w lcd'ku. Wszystko testuje z testboardzie. http://www.dg7xo.de/selbstbau/avrboard.html..


    Może ma ktoś przykładowy kod?

    0
  • PLC Fatek
  • #7 09 Cze 2007 11:45
    szod
    Poziom 33  

    Dlaczego nie podłączysz tego potencjometru od kontrastu? Nic dziwnego że
    nic nie ma. Bez niego nie będziesz nic widział na wyświetlaczu. Po włączeniu
    zasilania powinny być chociaż zaciemnione pola w LCD.

    0
  • #8 09 Cze 2007 11:50
    y0yster
    Poziom 19  

    Ok jestem w trakcie wlutowywanie potencjometru. Muszę troszkę go zmodyfikować ;).


    --edit

    Potencjometr wlutowałem. Na górze mam pasek, podświetlona jest pierwsza linia.

    0
  • #9 09 Cze 2007 12:18
    szod
    Poziom 33  

    Czyli jest wszystko ok. Teraz musisz napisać poprawny program sterujący.
    Poczytaj artykuł w czterech częściach o LCD do którego link Ci podesłałem.
    Jest tam dokładnie opisane jak przebiega inicjalizacja. Napiszesz procedurę
    według tego i zaciemnione kwadraty powinny zniknąć.

    0
  • #11 09 Cze 2007 14:12
    darrrrek
    Poziom 22  

    Szczere ale pomysl...Tobie sie nie chce przeczytac ciekawych informacji na temat LCD a komus ma sie chciec tlumaczyc i wysylac gotowe kody jak to zrobic...Musisz troche wsadzic w to wlasnych checi a nie rezygnowac po kilku probach. Na forum jest mnustwo takich tematów wystarczy wpisac "LCD" i grzebac mozna do jutra :))

    Pozdrawiam

    0
  • #12 09 Cze 2007 17:02
    y0yster
    Poziom 19  

    Pobawiłem się trochę tym lcd'kiem. Przeczytałem artykuły w EDW, napisałem program i dalej nic. Zamieszczam obecną wersję programu. Mam pytanie co do niego. Co robię źle z inicjalizacją. Cały czas mam czarną pierwszą linię na wyświetlaczu.


    Pozdrawiam.


    (kod w załączniku)

    0
  • #13 09 Cze 2007 17:50
    szod
    Poziom 33  

    Nie ma schematu to nieco utrudnia i trzeba się wypytywać. RW wyświetlacza
    masz do masy? Jak masz podłączone linie D4 - D7 od LCD? Żeby było mniej
    problemów powinny być podłączone np. D4 - PD4 do D7 - PD7. Wszystkie ustawienia startowe
    typu ustawienie portów na wejście lub wyjście zrób na początku po etykiecie
    reset. Będzie mniej zagmatwane.
    Co do samej inicjalizacji to powinno być tak (zakładając połączenia jak pisałem wcześniej):
    * ustawiasz na D4 - D7 liczbę 30h
    * po ustawieniu czekasz minimum 140ns
    * dajesz impuls enable minimum 450ns
    * czekasz 5ms
    * znów ta sama liczba, odczekanie i enable
    * czekasz 5ms
    * jeszcze raz liczba 30h, odczekanie i impuls enable
    * czekasz 5ms
    * przełączasz na tryb 4 bitowy - 20h, odczekanie i enable
    * czekasz 5ms
    Teraz ustawiasz wyświetlacz jak potrzebujesz a te dane wysyłasz w dwóch bajtach
    * np. 20h, impuls enable, 80h, impuls enable, odczekanie na przetwarzanie
    LCD lub sprawdzenie flagi busy. To ustawi wyświetlacz na 4 bity, 2 linie
    i pole 5x7 punktów.
    Dalej ustawiasz włączenie wyświetlacza, kursora, przesuwanie napisu itp.

    Chyba nie przeczytałeś uważnie tych pdf-ów...

    0
  • #14 09 Cze 2007 18:28
    McRancor
    VIP Zasłużony dla elektroda

    y0yster piszesz tutaj, jakby LCD na HD44780 był najrzadszym sterownikiem LCDków i nikt jeszcze nigdy go nie uruchamiał, na dodatek na AVRach!

    Że w ogóle użytkownikowi szod chciało się pisać jak zainicjować ten LCD...

    Weś poszukaj trochę...

    0
  • #15 09 Cze 2007 18:56
    y0yster
    Poziom 19  

    Dzięki szod, ale już to zrobiłem szybciej, a i tak mi to nie działa. Robie to według pdf'ów McRancor.

    Zmieniłem na 2 linie, a dalej pali mi się tylko linia 1, a nie obie co mama zrobić. Wrzucam nowy kod, który jest już troszkę przerobiony.

    Ja robie to ogólnie według takiego schematu:
    -czekam 25 ms
    -function set
    -czekam 5 ms
    -function set
    -czekam 1ms
    -function set
    -function set (moje ustawienia)
    -display off
    -display on
    -entry mode set

    -wyświetlam literkę A

    Z tym, że po każdej komendzie robie coś takiego. Podciągam port dla pinu E, czekam 40us, i przechodzę w niski stan na tej linii.

    Co źle robię w takim razie?

    0
  • #16 09 Cze 2007 19:42
    szod
    Poziom 33  

    Bo tylko jedna linia będzie przyciemniona. Tak ma być. I dlaczego dajesz
    reti na końcach procedur? Reti jest dla procedur przerwań. I przeczytaj co
    pisałem o inicjalizacji bo dalej byki robisz. W pewnym momencie masz przesyłać
    dane w dwóch bajtach. Jeden po drugim bez pętli opóźniających. Zobacz u
    siebie. Po drugie nie odpisałeś na pytania i dalej nie wiadomo co i jak jest
    podłączone. Jeśli jest tak jak napisałem to złe dane wystawiasz na D4 - D7.
    Po prostu nie te końcówki ustawiasz. Zobacz do których masz podłączone
    wyprowadzenia D4 - D7 wyświetlacza LCD. Wysyłając drugi bajt, młodszy półbajt
    musisz przesunąć na miejsce starszego. I nie musisz za każdym razem
    zerować RS, RW i EN. Wystarczy raz. Jak jakaś funkcja LCD będzie wymagać
    zmiany którejś z tych końcówek to wtedy to zrobisz. I gdzie są impulsy enable?
    Nie widzę ich.

    0
  • #17 09 Cze 2007 20:25
    y0yster
    Poziom 19  

    Dorzucam tutaj schemat podłączeń atmegi i lcd.

    Zaraz dokładniej sprawdzę to o czym mówisz.


    --edit

    Ja posługuję się 8-bitami. A impulsy enable są w procedurze czekaj_na_odbior.

    Mógłbyś mi dać jakiś przykładowy program na to?

    0
  • #18 09 Cze 2007 20:56
    szod
    Poziom 33  

    Nie używam trybu 8 bitowego. Nie miałem takiej potrzeby. Wszystko mi
    zawsze ładnie śmigało na 4 bitach. Jeśli chcesz używać 8 bitów to wysyłanie
    w dwóch bajtach Ciebie nie dotyczy. Inicjalizacja też będzie nieco inna. Zwróć
    też uwagę że używasz pinu RW wyświetlacza LCD. A więc powinieneś sprawdzać
    flagę busy. Zobacz tutaj, nawet podałem gotowy przykład na AVR:
    https://www.elektroda.pl/rtvforum/viewtopic.php?t=628731
    Tak więc szukaj na forum, bo dużo tematów było już poruszanych.
    Dodam tylko, że praktycznie wszystkie informacje potrzebne do uruchomienia
    LCD są w pdf-ach które Ci podałem.
    A przy impulsach enable nie możesz normalnie skorzystać z sbi i cbi? Zobacz
    przykład który podałem w linku.

    0
  • #19 09 Cze 2007 21:43
    y0yster
    Poziom 19  

    Zastanawiam się teraz dlaczego zainteresowałeś się flagą busy. Dodam, że R/S cały czas ma niską wartość logiczną, więc nie ma potrzeby bawienia się flagą busy, przynajmniej tak sądzę. Równie dobrze mógłbym ją podłączyć do masy. A program jak nie chodził tak nie chodzi dalej.

    Dodam jeszcze, że przez działanie całego programu nie zmieniam stanu R/W, więc nie ma żadnej potrzeby na razie na sprawdzanie stanu flagi busy.

    0
  • #20 09 Cze 2007 22:02
    szod
    Poziom 33  

    Dlatego że lepiej moim zdaniem używać flagi busy niż domyślnych opóźnień
    które się przydają na początku inicjalizacji bo inaczej nie można. Jakiego
    używasz kwarcu? Przeanalizuj procedurę inicjalizacji pod kątem opóźnień.
    Wyświetlacz może nie wyrabiać. Zobacz na moją listę kolejnych kroków
    inicjalizacji. Podałem czasy. Jak masz szybki kwarc to będziesz musiał dać
    trochę opóźnienia np. nop-ów. Jak nie chcesz bazować na fladze busy to
    niestety musisz dokładnie dobrać opóźnienia. Lepiej żeby były za duże jak za
    małe.

    0
  • #21 09 Cze 2007 22:16
    y0yster
    Poziom 19  

    Już próbowałem dawać różne opóźnienia. Zwiększałem, zmniejszałem. Nawet dawałem 1 sekundę ale to i tak nic mi nie dawało. Kwarc z tego co się orientuję w atmedze8 standardowo jest ustawiony na 4MHz.

    Co w moim kodzie może być nie tak. Poprawiłem troszkę kod i zoptymalizowałem. Wrzucam go jeszcze raz. Może teraz będzie jaśniejsza sprawa.

    Zaczyna mi powoli brakować pomysłów co do tej inicializacji. Zdaje mi się, że próbowałem już bardzo wielu rzeczy. Dochodzę powoli do wniosku, że coś musi być nie tak z podłączeniami, ale je sprawdzałem wielokrotnie. Styki na pewo są dobrze podłączone. Myślę, że to może wyświetlacz padł, albo coś w tym stylu. Ale to raczej mało prawdopodobne.

    0
  • #22 09 Cze 2007 22:33
    darrrrek
    Poziom 22  

    standardowo jest ustawiony 1 MHz o ile sie nie myle, ale nigdy z atmegą nie mialem doczynienia.

    0
  • #23 09 Cze 2007 23:12
    szod
    Poziom 33  

    Chyba nie czytasz tego co piszę. Przeczytaj co wypisałem o inicjalizacji i
    porównaj z tym co ty powypisywałeś. Dlaczego ustawiasz EN w stan wysoki,
    ustawiasz dane na liniach D0 - D7 a potem zerujesz EN? Ja tak na pewno
    nie napisałem. Impuls EN ma być po ustawieniu danych na liniach D0 - D7 i
    to z odpowiednim opóźnieniem. Pisałem o tym. Wróć do tego postu. Po drugie
    wraz używasz reti na końcach procedur które nie są procedurami przerwania.
    Popraw to i zobaczymy co dalej. Mogłem jeszcze coś przegapić.

    0
  • #24 10 Cze 2007 07:48
    y0yster
    Poziom 19  

    Co do reti zabardzo nie masz racji. Mi wszystko działa. Na innych moich przykładach wszystko grało. Co do tego impulsu enable próbowałem już takie kombinacje:
    -podciągnięcie na portach DB0..DB7, następnie E = 1, opóźnienie, E = 0
    -podciągnięcie na portach DB0..DB7, następnie E = 1, E = 0, opóźnienie


    Czy jest może jakaś inna opcja. Jak byś popatrzył na kod źródłowy to tam widać dokładnie czego próbowałem.

    0
  • #25 10 Cze 2007 11:00
    McRancor
    VIP Zasłużony dla elektroda

    Co do reti to jednak ma całkowitą rację. Nie stosuje się reti w taki sposób jak Ty to robisz.

    Dane do LCD zatrzaskuje się opadającym zboczem na linii EN.

    Jeśli masz podłączony interfejs z linią RW to zrób odczytywanie flagi zajętości zamiast oczekiwania, jest pewniejsze i szybsze.

    Jeśli po tej iinicjalizacji którą robisz nadal na wyświetlaczu jest jedna linia to skopane masz połączenia do wyświetlacza.

    0
  • #26 10 Cze 2007 11:20
    y0yster
    Poziom 19  

    Co do połączenia to jest na 100% dobre. Bo odpaliłem program napisany w c, który wyświetlił napis. Jedno mnie tylko zastanawia, dlaczego każdy przykład, który uda mi się znaleźć jest na 4-bitach, a nie na ośmiu, coś musi być z tym skopane. Co do flagi zajętości to nie można jej odczytywać podczas inicjalizacji. Tak jest w EDW. Chodzi mi tutaj o początkową fazę inicjalizacji.

    Co do reti, to będę dalej tak robił ponieważ nie znalazłem innego sposobu jak narazie, nie chce mi się teraz szukać innego rozkazu. Jestem jak narazie zajęty tym wyświetlaczem, który nie chce ani drgnąć.

    0
  • #27 10 Cze 2007 11:29
    dziechu
    Poziom 27  

    Rozkaz RETI jest powrotem z przerwania a nie zwyklej procedury. Widac ze nie masz pojecia o programowaniu, wiec kiedy ktos ci pisze ze zle robisz, to nie pisz 'nie masz racji'. To ze blaednie napisane programiki jakosc ci dzialaly, nie znaczy ze napisane sa dobrze, tylko 'w przyblizeniu' dobrze. Zacznij moze od prostszych rzeczy, skoro nie potrafisz uruchomic wyswietlacza LCD, gwarantuje ci ze jest to jedna z najprostszych rzeczy. Robile wiele procedur (wlasnych) na LCD dla Z80, '51, AVR, PIC i to bardziej skomplikowane - z czytanie flagi BUSY i wyswietlaniem polskich literek i nigdy zadnych problemow nie bylo - dlaczego? Bo bralem dokumentacje i czytalem dokladnie co i jak robic, a tobie jakby sie nie chcialo, najlepiej zeby ktos dal ci gotowce do wklejenia - tak nic sie nie nauczysz, bo nawet jak wkleisz gotowca to i tak nie bedziesz wiedzial dlaczego ten gotowiec dziala a twoja procedura nie. Szukanie i samodzielne rozwiazywanie bledow to najlepsza metoda nauki.

    Dodano po 3 [minuty]:

    Moze zamiast RETI uzyj zwyklego RET??? A moze napisac RET zamiast RETI tez ci sie po prostu nie chce?

    0
  • #28 10 Cze 2007 11:55
    y0yster
    Poziom 19  

    Dobra. Zmieniłem reti na ret. Ale nie wiem po co zajmować się takimi szczegółami. Temat postu to wyświetlacz lcd, a nie używanie ret, czy reti. Ma możę ktoś przykładowy kod w asemblerze dla tego lcd'ka? Pisany z użyciem 8-bitów nie 4.

    0
  • #29 10 Cze 2007 12:06
    szod
    Poziom 33  

    :arrow: y0yster - z twoich wypowiedzi wynika że nawet nie znasz rozkazów
    asemblera. Od tego chyba powinieneś zacząć. Trochę to dziwnie wygląda gdy
    na swojej stronie www piszesz, że piszesz programy na zamówienie oraz na
    zaliczenie dla AVR w asemblerze. Zastanawiam się jak Ty to robisz nie znając rozkazów.
    Chcesz tutaj dla swojej działalności dostać gotowce? Powiem Ci tyle, że mi wystarczyły
    te pdf-y które Ci podałem żeby napisać sobie całą bibliotekę do sterowania LCD
    z wszystkimi bajerami jak np. przesuwanie napisów, czytaniem flagi busy itp.,
    i jak dotąd żaden wyświetlacz mi się nie oparł. A pisałem w asemblerze
    zarówno na '51 jak i AVR.

    0
  • #30 10 Cze 2007 12:12
    dziechu
    Poziom 27  

    y0yster napisał:
    Dobra. Zmieniłem reti na ret. Ale nie wiem po co zajmować się takimi szczegółami. Temat postu to wyświetlacz lcd, a nie używanie ret, czy reti. Ma możę ktoś przykładowy kod w asemblerze dla tego lcd'ka? Pisany z użyciem 8-bitów nie 4.


    No chyba sobie zartujesz. To moze zamiast call uzyj goto, a zamiast add uzyj mov albo ldi ??? Gdyby RETI i RET mily robic to samo, to po co bylyby dwa rozne??? Czasem moze byc tak ze program nie dziala bo przyczyna jest nie w 50 linijkach akurat tej sekwencji, ale w zupelnie innym miejscu, bo procesor w czasie wykonywania tych 50 linijek moze byc np. odwolany do przerwania, ktore zle skonfigurowane moze zepsuc dzialanie poprawnie napisanych 50 linijek. Programowanie jest troche jak matematyka - drobny blad, przecinek w zlym miejscu i caly program do d...

    0