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

PIC18F46K22 - Wyświetlacz LCD - brak wyświetlania czegokolwiek

Leeoonek 29 Lis 2014 14:15 2220 21
  • #1 29 Lis 2014 14:15
    Leeoonek
    Poziom 9  

    Witam. Rozpocząłem zabawę z mikrokontrolerem PIC18F46K22, niemniej już na samym początku spotkałem się z problemem, którego nie potrafię przeskoczyć. Chciałem podłączyć kontroler do wyświetlacza LCD i sprawdzić jego działanie, niestety wyświetlacz nie pokazuje zupełnie niczego. Układ jest bardzo prosty, program również w związku z czym zupełnie nie wiem co działa nie tak.
    Tutaj umieszczam plik main.c

    Kod: c
    Zaloguj się, aby zobaczyć kod

    a tutaj bibliotekę, ktrórą ściągnąłem z internetu i odpowiednio zmodyfikowałem
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Z góry dziękuje za wszelką okazaną pomoc
    Pozdrawiam
    [/code]

    0 21
  • #2 29 Lis 2014 19:06
    szymonjg
    Poziom 15  

    Kodu jeszcze nie czytałem, e najpierw zaczął bym od sprawdzenia tego, czy procesor wykonuje jakikolwiek program. Chociażby zwykłe miganie diodą.
    Jeśli procesor taktuje i działa to wtedy sprawdzamy kontrast na wyświetlaczu. Bo niezainiciowany wyświetlacz powinien wyświetlić na początku kwadraty w pierwszej linii, a Ty napisałeś, że nie wyświetla niczego co dla mnie jest podejrzane. Podobno są takie wyświetlacze co tych kwadratów nie wyświetlają, ale mam nadzieję, że nie trafiłeś na taki.
    Kontrast ustawia się na trzecim pinie oznaczonym "V0" napięcie na nim powinno wynosić około 0,7V, ale najistotniejsze jest to co się dzieje na wyświetlaczu.
    Potem zwykle sprawdza się połączenie.
    Mógłbyś jeszcze zamieścić zdjęcie lub schemat dotyczący zapytania bo nie wiadomo co znaczy dla Ciebie "prosty układ". Bo chociażby definicja pinów musi być zgodna ze schematem i podłączeniem wyświetlacza.
    Potwierdź czy masz to wszystko ok i podaj mi więcej info i wtedy zajmiemy się kodem.

    edit: Napisz jeszcze Jakie środowisko i jakiego kompilatora używasz, bo to też istotne.

    0
  • #3 29 Lis 2014 19:42
    Marek_Skalski
    Moderator Projektowanie

    Moim zdaniem widać, że to XC8 w MPLAB X.
    Obsługa LCD referuje się do innego uC: p18f4520.h, zamiast pic18f46k22.h Niby podobne i rejestry portów są w tych samych lokacjach, ale jednak są między nimi różnice, np. brak ANSELA w f4520, więc kompilator na pewno zgłaszał jakiś błąd.
    Czy to jest układ na płytce stykowej, jakiś gotowy moduł, czy własna konstrukcja? Schemat, zdjęcia mogą być przydatne.
    Jaki masz programator? Prawidłowo go podłączyłeś? Jak programujesz układ: w trybie debugera czy w trybie programowania?

    0
  • #4 29 Lis 2014 23:30
    Leeoonek
    Poziom 9  

    Tak, układ jest na płytce stykowej. O dziwo, gdy zdecydowałem się zasilić wyświetlacz (Vdd, led etc) napięciem z programatora (Pickit III) na wyświetlaczu zaczęły pojawiać się standardowe czarne prostokąty na całej szerokości wyświetlacza w momencie kiedy miał wyświetlać się jakikolwiek napis. Gdy zmierzyłem napięcie multimetrem okazało sie, że wynosiło ono zaledwie ~3,6V, zatem być może było to za mało, aby poprawnie działać, ale wystarczająco, aby przetwarzać i wyświetlać owe prostokąty. Ponadto okazało się, że zakupiony przeze mnie w sklepie elektronicznym potencjometr osiąga maksymalnie 10k omhów, a nie jak poprosiłem sprzedawce-20k. Być może po prostu wyświetlacz nie może złapać odpowiedniego kontrastu, niemniej zastanawia mnie, dlaczego przy niższym napięciu zasilania (3,6V) kontrast był ok
    Po ponownym zasilaniu wyświetlacza napięciem DC 5V niestety dalej hd44780 nie wyświetla niczego :/

    0
  • #5 30 Lis 2014 06:06
    szymonjg
    Poziom 15  

    Wyświetlacz potrzebuje 5V bo inaczej jego sterownik nie będzie działał poprawnie. Pickit3 powinien dać takie napięcie, chyba że masz wersję "LF" mikrokontrolera. Zakładając, że nie (ale sprawdź to na procesorze, czy nie ma tam literki "L" przed literką "F") to wystarczy tylko pogrzebać w ustawieniach programatora i tam gdzieś powinna być regulacja napięcia zasilania. W tym starym MPlabie jest to i w tym nowym też powinna być. Dla pewności, zawsze możesz jeszcze skorzystać z zewnętrznego zasilania 5V. (np z usb)

    Nie doczekaliśmy się jeszcze schematu ale już wiadomo, że masz coś źle z tym pinem kontrastu. Jak już wcześniej wspominałem napięcie na 3-cim pinie wyświetlacza powinno być około 0,7V i możliwe, że jak zasilałeś 3,6V cały wyświetlacz to i coś koło tego było, a jak podniosłeś napięcie zasilania to i to na pinie kontrastu też się podniosło i dlatego kwadraciki zniknęły.
    Trzeba to napięcie obniżyć. Potencjometr 10k jest do tego dobry, jak się go dobrze podłączy. Ma on 3 nóżki. Jedną skrajną podłączasz do masy. Środkową do tego trzeciego pinu wyświetlacza, a drugą skrajną możesz podłączyć do plusa. Zamiast potencjometru można zastosować też zwykły rezystor pomiędzy pinem kontrastu a masą i też będzie działało. Trzeba tylko dobrać mu odpowiednią rezystancję. U mnie to zwykle jest 2,2k lub 2,7k ale to nie musi być regułą. Potencjometrem sobie ustawisz dowolną rezystancję i na pewno trafisz w punkt.

    Zrób, te kwadraciki przy 5V i zastosuj popraw te pliki nagłówkowe jak słusznie zauważył Marek.
    Potwierdź jeszcze sprawność procesora, choćby zwykłym miganiem diody (bo właśnie ta czynność jest w mikrokontrolerach uważana za odpowiednik PC'towego "Hello World") i wtedy będzie wiadomo, czy dobrze jest zaprogramowany, czy oscylator dobrze podłączony (bo widzę, że masz ustawiony na zewnętrzny kwarc), czy też nie przeszkadza mu włączenie "LVP" (bo podobno wtedy trzeba podawać stan wysoki na pin RB5) czy !RESET dobrze działa. itd i tp.
    I jak już będzie wiadomo, że mamy do czynienia ze sprawnym wyświetlaczem i sprawnym procesorem wtedy dopiero można zabierać się za programowanie.

    0
  • #6 30 Lis 2014 15:40
    Leeoonek
    Poziom 9  

    Co do potencjometru już metodą prób i błędów zorientowałem się ze daje on rade. Co do napięcia z programatora, już przed założeniem tematu zmieniałem wartość napięcia, niestety przy zadeklarowaniu 5V otrzymywałem komunikat

    Cytat:
    PICkit 3 is trying to supply 5,000000 volts from the USB port, but the target VDD is measured to be 4,625000 volts. This could be due to the USB port power capabilities or the target circuitry affecting the measured VDD.

    Zmodyfikowałem lekko kod, dałem mnóstwo różnych tekstów do wyświetlania i w ciągu całego czasu działania programu ciemne prostokąciki pojawiają mi się po około 2 sekundach i od razu gasną(stąd wiem że kontast nie jest przyczyną), próbuje znaleźć przyczynę, ale naprawdę nie potrafię.

    Co do schematu ideowego, nie ma tutaj wielkiej sztuki, piny D7-D4 z mikrokontrolera są odpowiedzialne za przesyłanie danych do pinów D7-D4 wyświetlacza, RW jest uziemione, do Vo dodany jest potencjometr 10k, do Led+ dodany jest rezystor 1k, wyświetlacz zasilany jest napięciem 5V ze stabilizatora LM7805( do którego dodałem oczywiście dwa kondensatory 100nF), zaś kontroler napięciem z programatora 4,6V. Kontroler ponadto ma podpięty rezonator 16Mhz do którego dodane są dwa kondensatory 22pF. Wszystko wydawałoby się proste jak drut. Między pinami Vdd i MCLR dołączyłem rezystor 10k, jak było w instrukcji PICkit III.

    Jedynym moim pomysłem jest owe dziwne zasilanie programatora, więc spróbuje w zaprogramować na stale kontroler, podłączyć do niego normalne napięcie ze stabilizatora i zobaczymy czy spowoduje to jakiekolwiek zmiany.

    W załączniku dodaje zdjęcia mojej płytki stykowej, ale nie wiem czy ktokolwiek bedzie wstanie cokolwiek wyłapać. Co do diody, kupie ją jutro rano i sprawdzę

    0
  • #7 30 Lis 2014 15:46
    szymonjg
    Poziom 15  

    Jeśli nie masz diody, to możesz użyć podświetlania w wyświetlaczu (pin 15 to + a 16 masa. Tylko trzeba dać szeregowo rezystor (albo potencjometr) od 100 do 2000 omów. Potencjometr lepiej ustawić tak na trochę więcej i obniżając rezystancję sprawdzać czy się będzie zapalało.

    Słabo znam angielski, ale wydaje mi się, że ten komunikat od pickita3 jest spowodowany tym, że układ programowany pobiera za dużo prądu.
    Teraz już nie widzę rezystora ograniczającego prąd diod podświetlania i najprawdopodobniej to jest przyczyną. Jeśli nie posiadasz stosownego rezystora, to na razie odłącz całkiem pin 15 wyświetlacza i świeć sobie na niego jakimś innym światłem by było na nim coś widać. Po odłączeniu tego pinu spróbuj ponownie z tymi 5 Voltami.
    http://mikrokontrolery.blogspot.com/2011/03/Dioda-LED-obliczanie-rezystora-kalkulator.html - tu masz informację dlaczego ten rezystor jest ważny i jak się go dobiera.
    W wolnej chwili polecam lekturę innych artykułów na tym blogu, bo warto. Sam dzięki niemu stawiałem pierwsze kroki z mikrokontrolerami.

    EDIT: Widzę jakiś rezystor przy złączu programatora, ale nie wiem czy jest on poprawnie podłączony.
    Jeśli to jest rezystor na pin RESETU to powinien mieć on wartość około 10k (skrajnie 4,5k-20k). i być podłączony pomiędzy pierwszym i drugim pinem złącza programowania. Albo...
    I tak nie korzystasz z resetu to dla pewności wyłącz go programowo zmieniając linijkę:
    #pragma config MCLRE = EXTMCLR
    na:
    #pragma config MCLRE = INTMCLR

    zmień też:
    #pragma config LVP = ON na: #pragma config LVP = OFF
    #pragma config BOREN = SBORDIS na: #pragma config BOREN = OFF

    bo z tego też na razie nie korzystasz a tylko może wkurzać.

    0
  • #8 30 Lis 2014 16:27
    Leeoonek
    Poziom 9  

    Napisałem bardzo prosty program, ustawiłem w nim aby cały port D ustawiał się jako 1 i po sekundzie jako 0 i tak w kółko, jest on na tyle prosty, że chyba nie mogłem się pomylić. Zrobiłem połączenie z D2 Vdd wyświetlacza

    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod

    I jednak działa, wyświetlacz włącza się i wyłącza po 1s

    0
  • #9 30 Lis 2014 17:12
    szymonjg
    Poziom 15  

    Nie panikuj. W życiu jeszcze nie zjarałem, żadnego kontrolera a bawię się tym przez 2 lata i początki też były czasem drastyczne. Po prostu coś nie łączy.
    Stawiam na oscylator, dla pewności użyj wbudowanego:
    #pragma config FOSC = INTIO67

    Skopiuj sobie konfigurację bitów konfiguracyjnych z tamtego programu z wyświetlacza i zawrzyj w niej wszelkie opisywane tu poprawki z powyższą włącznie.

    Edit: Miało być do zasilania podświetlania, a nie wyświetlacza ale jak działa to super. Rozumiem, że z tym komunikatem od Pickit3 też sobie poradziłeś.

    Sprawdź jeszcze czy podłączenie na płytce masz takie samo, jak definicje w programie i czy w ogóle wszystko łączy tak jak trzeba.

    0
  • #10 30 Lis 2014 17:57
    Leeoonek
    Poziom 9  

    Niestety dalej nie osiągnąłem sukcesu, niemniej zauważyłem, że gdy mocniej przycisnę potencjometr to czasami nieśmiało pojawiały się kwadraciki, dlatego też zamieniłem go na rezystor 1k (kontrast mógłby być lepszy, jutro zakupie inny opornik o większej wartości). Co ciekawe kwadraciki pojawiają się jedynie dla komendy Lcd_Chr(), dla Lcd_Out() niestety już nie

    @EDIT
    zacząłem czytać zagraniczne fora i odmawiają tam podłączenia RW do uziemienia. Czy to może być przyczyną? Dlaczego nie powinno się tego robić?

    0
  • #11 30 Lis 2014 18:17
    szymonjg
    Poziom 15  

    Te potencjometry montażowe nie za bardzo lubią się ze stykówkami ale da się przeżyć. Możesz też dać równolegle 2 rezystory po 1k i wtedy będą działały jako 1 rezystor 500 ohmów i powinien być lepszy kontrast.

    Ale jeśli kwadraty pojawiają się zamiast znaków a nie na całej pierwszej linii to by znaczyło, że po pierwsze wyświetlacz się jakoś tam zainicjalizował a po drugie to że kontrast jest za mocny. Czyli trzeba zwiększyć rezystancję dając rezystory szeregowo.

    Spróbuj się pobawić z tym kontrastem bo już czuje, że może być blisko. Jakimiś szczypcami kombinerkami, albo nawet obcinaczką do paznokci, wyprostuj zakończenia nóżek w tym potencjometrze i wtedy powinny stykać bez przyciskania.

    0
  • #12 30 Lis 2014 18:19
    Leeoonek
    Poziom 9  

    szymonjg napisał:
    Te potencjometry montażowe nie za bardzo lubią się ze stykówkami ale da się przeżyć. Możesz też dać równolegle 2 rezystory po 1k i wtedy będą działały jako 1 rezystor 500 ohmów i powinien być lepszy kontrast.

    Ale jeśli kwadraty pojawiają się zamiast znaków a nie na całej pierwszej linii to by znaczyło, że po pierwsze wyświetlacz się jakoś tam zainicjalizował a po drugie to że kontrast jest za mocny. Czyli trzeba zwiększyć rezystancję dając rezystory szeregowo.

    Spróbuj się pobawić z tym kontrastem bo już czuje, że może być blisko. Jakimiś szczypcami kombinerkami, albo nawet obcinaczką do paznokci, wyprostuj zakończenia nóżek w tym potencjometrze i wtedy powinny stykać bez przyciskania.

    Niestety kwadraty pokazują się na całej pierwszej linii, gdy się mocniej przypatrzeć to można je zauważyć również na drugiej, niemniej są one dużo mniej widoczne

    0
  • #13 30 Lis 2014 18:31
    szymonjg
    Poziom 15  

    Jeśli w bibliotece nie ma nic wspomnianego o RW (a u Ciebie nie ma) to podłącza się go do masy. Jak masz te kwadraty na całej pierwszej linii to ustaw je potencjometrem tak, aby były widoczne ale tak średnio intensywne. Podłącz RW do masy i wtedy spróbuj uruchomić kod. Jeśli nie będzie działało to napisz, jaki masz kwarc i zamieść pokaż plik z funkcjami:
    void Delay_5us(void);
    void Delay_5500us(void);

    0
  • #14 30 Lis 2014 19:09
    Leeoonek
    Poziom 9  

    Niestety dalej jestem w punkcie wyjścia
    Rezonator jakiego używam to rezonator kwarcowy 16Mhz.
    Zamieszczam bibliotekę z funkcjami

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod


    tutaj zamieszczam konfigurację
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Niemniej jakby się to nie zakończyło jestem bardzo wdzięczny za wszelką okazaną pomoc : )

    0
  • Pomocny post
    #15 30 Lis 2014 21:15
    szymonjg
    Poziom 15  

    Zakończenie widzę tylko pozytywne, ale to jeszcze cierpliwości. :)

    Konfiguracji sam bym lepszej nie napisał:
    RESET tylko wyłączamy w tym procesorze pisząc:
    #pragma config MCLRE = INTMCLR (w poprzednim poście miałem błąd sugerujący inaczej który już też poprawiłem)

    Z tymi delay'ami brakuje mi ostatecznie deklaracji makr: _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0))) i _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0))) chyba, że pochodzą one z biblioteki kompilatora to wtedy można im zaufać.

    Nie podoba mi się jednak podłączenie tego wyświetlacza. Albo na pierwszym zdjęciu wyświetlacz jest włożony "do góry nogami" albo liczysz piny nie z tej strony co trzeba.
    Tu: http://mirekk36.blogspot.com/2012/04/lcd-hd4478-jak-podaczac.html masz opis i rysunki wraz z poprawną numeracją wyświetlacza. Ciebie dotyczy wersja z RW podłączonym do masy.

    Narysuj choćby odręcznie na papierze albo i w Paincie, które piny z wyświetlacza masz podłączone do których pinów mikrokontrolera i wtedy już będzie wiadome co i jak.

    0
  • #16 30 Lis 2014 22:58
    Leeoonek
    Poziom 9  

    To strasznie żenujące, ale rzeczywiście, policzyłem piny nie od tej strony co trzeba. Niemniej dalej mam tylko czarne kwadraciki, z tą różnicą, że teraz mam je w dwóch rządkach. Niemniej podejrzewam, że teraz o rozwiązanie będzie dużo łatwiej :)

    0
  • #17 30 Lis 2014 23:18
    szymonjg
    Poziom 15  

    Yeahh Plus dla mnie. :)

    Kwadraciki bez zaprogramowanego mikrokontrolera powinny być tylko na pierwszej linii. Jeśli są na dwóch, to możliwe że mikrokontroler wysłał już coś do wyświetlacza i trzeba zmniejszyć kontrast, czyli podnieść rezystancję pomiędzy trzecim pinem a masą. Jeśli to nie pomoże, to trzeba brać się za program a zwłaszcza za ustawienia pinów mikrokontrolera które sterują wyświetlaczem.

    0
  • #18 30 Lis 2014 23:23
    Leeoonek
    Poziom 9  

    Sytuacja jest następująca. W wypadku wyłączenia programatora jestem w stanie ustawić kontrast, który spowoduje zarówno, aby na wyświetlaczu pojawiły się dwie linie kwadratów, jak i jedna. W przypadku włączenia debugowania przy zmianie kontrastu zmieniam zarówno kontrast wyższej linii jak i niższej, nie ma możliwości, aby pojawiała się tylko jedna linia. W związku z czym to chyba program

    0
  • #19 01 Gru 2014 00:06
    szymonjg
    Poziom 15  

    Debugowanie na razie zostawmy, bo mi ono w niczym nie pomoże. Użyjmy programatora jako programatora.
    Wrzuć najaktualniejszą wersję kodu i schemat, albo dobrze doświetlone zdjęcie aktualnego układu i wtedy zobaczymy co w trawie piszczy.

    W między czasie, tymczasowo zaprogramuj procesor czymś takim:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Odłącz zasilanie na chwilę a potem znowu podłącz i wtedy powinna być tylko jedna linia.

    0
  • #20 01 Gru 2014 01:04
    dondu
    Moderator Mikrokontrolery Projektowanie

    szymonjg napisał:
    Mógłbyś jeszcze zamieścić ... schemat ...

    Marek_Skalski napisał:
    Schemat, ... mogą być przydatne.

    szymonjg napisał:
    Nie doczekaliśmy się jeszcze schematu ...

    szymonjg napisał:
    Wrzuć najaktualniejszą wersję kodu i schemat, ...

    ... schematu nadal nie ma, a czas leci ....

    0
  • #21 01 Gru 2014 15:29
    Leeoonek
    Poziom 9  

    Problem rozwiązany, bije się w pierś, faktycznie mogłem szybciej dać schemat ideowy, który prawdopodobnie przyśpieszyłby znalezienie rozwiązania. Najzwyczajniej w świecie zapomniałem, że w przypadku dwóch napięć zasilających dwa elementy, które mają się ze sobą komunikować, należałoby połączyć ich uziemienia, aby mieć ten sam punkt odniesienia. Po takowej operacji elegancko ukazuje mi się napis "Hello World". Serdecznie dziękuje wszystkim za zainteresowanie tematem i pomoc : )

    0
  • #22 01 Gru 2014 20:31
    szymonjg
    Poziom 15  

    Moje gratulacje.
    Schemat rzeczywiście się przydaje bo wtedy widać jak na dłoni co kto ma na myśli i co chce osiągnąć. I wtedy nie musimy chodzić na kursy wróżbiarstwa.:)
    Ale najważniejsze, że wszystko dobrze się skończyło.

    Na koniec jeszcze pozwolę sobie zamieścić kilka linków związanych z tematem dla potomnych.

    http://old.piko.avx.pl/index.php?k=mk51&p=wlcd
    http://radzio.dxp.pl/hd44780/hd44780_podstawy.htm
    http://www.picaxe.com/docs/led008.pdf
    http://academy.cba.mit.edu/classes/output_devices/44780.pdf

    0