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.

Obsługa LCD 2X16 na PIC16F877A

15 Maj 2011 14:34 2476 12
  • Poziom 11  
    Witam, buduję pracę dyplomową i co chwilę walczę z jakimś problem, teraz mam kłopot z obsługą LCD, otóż najpierw trafił mi się uszkodzony LCD, kupiłem nowy i teraz działa, ale nie z napisanym kodem, otóż cała część programu pracuje jak należy oprócz obsługi LCD, wiem że jest dobry bo montowałem go w innym układzie i tam działał, ale u mnie milczy, świecą się tylko same kwadraciki i i na tym koniec, nigdy sam nie pisałem programu do obsługi LCD 2X16 ani jakiegokolwiek wyświetlacza, więc oparłem się o książkę Tomasz Jabłońskiego "Mikrokontrolery PIC16F8x", tam jest napisany kod do obsługi LCD, więc przepisałem go dostosowałem pod mój mikrokontroler to znaczy PIC16F877A, kwarc tak jak w książce 2MHz żeby opóźnienia działały prawidłowo, ale nic na wyświetlaczu się nie pokazuje oprócz kwadracików, na symulatorze wszystko jest OK, działa program i wyświetlacz, po zaprogramowaniu mikrokontrolera działa tylko logika, to znaczy reaguje na sygnały na wejściach i odpowiednio wystawia wyjścia do sterowania, jednak mimo iż jakieś napięcia są wystawiane na wyświetlacz to LCD w ogóle nie reaguje, ja nie znam języka C więc tylko ktoś kto pisze w asemblerze może mi pomóc, w załączniku z wyrzuconą częścią sterującą innymi funkcjami, tylko kod do obsługi LCD na symulatorze działa OK, może ktoś rzucić okiem, może wie ktoś dlaczego to nie działa
    Wyświetlacz podłączony prawidłowo, 1- masa, 2- +5V, 3 kontrast przez potencjometr 10k, 4- RS podpięte pod PORTD 6, 5- R/W podłączone do masy, 6-E podłączone pod PORTD 7, linia danych wykorzystywana jako 4 biotwa, linie D4-D7 odpowiednio podłączone pod RB0 do RB3
  • Poziom 10  
    Kręciłeś trochę potencjometrem? Jak jest zły kontrast to nie widać nic, albo same kwadraciki.
  • Poziom 11  
    Kręciłem, ale nic to nie dało, albo wszystko znika, to znaczy te kwadraciki, albo się świecą, jak ustawię pośrodku, tak że słabo je widać to i tak nic się nie wyświetla, zapytam tak z ciekawości, choć z praktyki wiem że tego nie trzeba robić, to znaczy czy linie E, RS, i D4-D7 połączyć z mikrokontrolerem przez rezystory powiedzmy 100 om, kiedyś jak robiłem zegary na wyświetlaczach 7 segmentowych z sterowaniem na pilota to musiałem połączyć dwa mikrokontrolery, to znaczy PIC16F877A z PIC16F84A, to jak były połączone bezpośrednio to nie działały, jak je połączyłem przez 4 rezystory 100om układ ruszył od razu, ale wiem że nikt nigdy nie podłączał tego typu wyświetlaczy z prockiem przez rezystory, zawsze bezpośrednio i innym użytkownikom tak działało
  • Specjalista - Mikrokontrolery
    Co tu dużo mówić, nie trzymasz się dokumentacji. Inicjalizacja jest wykonana inaczej niz zaleca producent. Pierwsza czynnością jest trzykrotne wystawienie 0x3, a to po to, żeby na 100% wyświetlacz przełączył się w tryb 8bitów z nieważne jakiego trybu, a potem 0x2, żeby wyświetlacz przełączył się na 100% w tryb 4b. Dopiero potem zaczyna się standardowa transmisja 4bitowa.
  • Poziom 11  
    Kolego michalko 12 to znaczy że w procedurze inicjalizacji najpierw mam trzykrotnie na port b wystawić 0x3, odczekać po każdym wystawieniu co najmniej 40us, następnie wystawiam 0x2 i odczekuję także co najmniej 40us zgodnie z tym co piszą w moich mądrych książkach, i dopiero wtedy mam uruchomiona transmisję 4 bitową, spróbuję i opisze rezultaty.

    Dodam że próbowałem również trochę inny kod odpalić na obsługę LCD opisany w ksiązce "Mikrokontrolery PIC w zastosowaniach" autorstwa B. Borowik, I Kurytnik i tam także w symulatorze wszystko działa a po wgraniu do mikrokontrolera całość milczy, mimo że kod jest napisany trochę inaczej, więc idę za twoją radą, mam nadzieję że jakby coś to jeszcze posłuży kolega podpowiedzią
  • Specjalista - Mikrokontrolery
    Tak, 3 x 3, potem 2, ale z czasami nie 40us, a takimi jakie są w dokumentacji. Dopiero po tej procedurze będziesz mógł wysyłać 8b w postaci 2 połówek 4b.
  • Poziom 11  
    Zgodnie z notą katalogową, która jest uboga, czas zapisu danych odnośnie inicjalizacji przy ustawianiu czy interfejs 4 czy 8 bitowy trwa 40us, niestety i tak wyświetlacz nie ruszył, wykonałem nawet z większymi opóźnieniami po 100us i po 50ms i nic, po drugie to o czym pisze kolega znajdowało się w inicjalizacji w wersji programu którą załączyłem, w podprogramie inicjalizacja LCD na początku na port b jest wystawiane 3, potem przerywa się komunikację i odmierza opóźnienie, po czym się ją uruchamia zgodnie z kodem

    BSF E ;ZEZWOLENIE DLA KOMUNIKACJI PROCESORA Z WYSWIETLACZEM
    MOVLW 0X3 ;WARTOSC DO WYSLANIA, DO ZAADRESOWANIA PAMIECI RAM W WYSWIETLACZU
    MOVWF PORTB ;WYSLANIE DANYCH NA PORTB DO REJESTRU IR W WYSWIETLASCZU, ZAADRESOWANIE PAMIECI TRAM W WYSWIETLACZU ;WPISANIE CZASU OPOZNIENIA 5MS
    ;IDZ DO PODPROGRAMU OPOZNIENIE

    BCF E ;WYLACZENIE ZEZWOLENIA DLA WYSYLANIA DANYCH DO WYSWIETLACZA
    MOVLW 0X05 ;WPISANIE CZASU OPOZNIENIA 5MS
    CALL OPOZNIENIE ;IDZ DO PODPROGRAMU OPOZNIENIE
    MOVLW 0X3 ;WARTOSC DO WYSLANIA, DO ZAADRESOWANIA PAMIECI RAM W WYSWIETLACZU
    MOVWF PORTB
    BSF E ;ZEZWOLENIE DLA KOMUNIKACJI PROCESORA Z WYSWIETLACZEM
    NOP ;CZAS POTRZEBNY NA PONOWNE WPISANIE MODULU 3
    NOP
    BCF E ;KONIEC KOMUNIKACJI PROCESORA Z WYSWIETLACZEM
    CALL OPOZNIENIE_100u ;IDZ DO PODPROGRAMU OPOZNIENIE 100uS
    MOVLW 0X3 ;WARTOSC DO WYSLANIA, DO ZAADRESOWANIA PAMIECI RAM W WYSWIETLACZU
    MOVWF PORTB
    BSF E ;ROZPOCZECIE KOMUNIKACJI PROCESORA Z WYSWIETLACZEM
    NOP
    NOP
    BCF E ;KONIEC KOMUNIKACJI WYSWIETLACZA Z PROCESOREM
    CALL OPOZNIENIE_100u ;IDZ DO POZNIENIE 100uS

    MOVLW 0X28 ;URUCHOMIENIE W WYSWIETLACZU INTERFEJSU 4 BITOWEGO
    CALL WYSLIJ_DANE ;IDZ DO PODPROGRAMU WYSLIJ DANE, W TYM PRZYPADKU ROZKAZ

    W ten sposób 3 jest wpisywana 3 razy, potem wysyłana jest wartość inicjująca tyle że nie 2 tylko 28, jak wpisałem dwa to wyświetlacz i tak nie ruszył a na symulatorze pojawiły się totalne głupoty, tu raczej nie tkwi problem
  • Specjalista - Mikrokontrolery
    pawel_na_chwile napisał:

    MOVLW 0X28 ;URUCHOMIENIE W WYSWIETLACZU INTERFEJSU 4 BITOWEGO
    CALL WYSLIJ_DANE ;IDZ DO PODPROGRAMU WYSLIJ DANE, W TYM PRZYPADKU ROZKAZ

    W ten sposób 3 jest wpisywana 3 razy, potem wysyłana jest wartość inicjująca tyle że nie 2 tylko 28, jak wpisałem dwa to wyświetlacz i tak nie ruszył a na symulatorze pojawiły się totalne głupoty, tu raczej nie tkwi problem


    W tym momencie rozsynchronizowałes interfejs!

    Dodano po 4 [minuty]:

    http://www.sparkfun.com/datasheets/LCD/HD44780.pdf

    46 strona
  • Poziom 11  
    Masz kolego w 100% rację, powinno być 2 a nie 28 jak mam w książce, tyle że to i tak nic nie dało, ale opierając się o dokumentację sam napiszę po swojemu inicjalizację, może wtedy ruszy, pewnie problem tkwi w kodach wysyłanych na portb, odezwę się jak napiszę i przetestuję

    Dodano po 51 [minuty]:

    Niestety, nic to nie dało, jak wpiszę inna wartość niż 28h jako wartość inicjująca wyświetlacz z komunikacją po 4 bitach, dokładnie to 2 to i tak nic się nie zmienia, wyświetlacz nie rusza, tyle że symulator głupieje, i pytanie brzmi co dalej
    MOVLW 0X28 ;URUCHOMIENIE W WYSWIETLACZU INTERFEJSU 4 BITOWEGO
    CALL WYSLIJ_DANE ;IDZ DO PODPROGRAMU WYSLIJ DANE, W TYM PRZYPADKU ROZKAZ
    tylko przy tej kombinacji kodu rusza symulator, jeżeli wpisze 2 czy jakąkolwiek inną wartość to i tak wyświetlacz nie rusza tyle że symulator się sypie, zresztą w drugiej książce jaką posiadam, "Mikrokontrolery PIC w zastosowaniach" do inicjalizacji wyświetlacza także wpisują 28h, a nie 2 wiem że w specyfikacji sterownika jest inaczej, ale jak przebada się wpisywanie wartości 28h, po bitach to pasuje żeby ustawić bit DL na 0 tak żeby wyświetlacz pracował z interfejsem 4 bitowym, może gdzieś tkwi inny problem, a może coś nie tak jest w kodach opóźnień, i cała komunikacja jest dużo szybsza niż powinna, z praktyki pamiętam że jak budowałem zegary na PIC16F877A zastosowałem kod opóźnienia z układu opartego o mikrokontroler PIC16F84, i żeby prawidłowo odmierzał czas na 877A trzeba było ustawić inaczej preskaler, napisany kod zaczerpnięty z książki przeznaczony jest właśnie dla PIC16F84 a nie 877
  • Poziom 11  
    po wysłaniu pierwszego rozkazu czas odpowiedzi lcdeka jest >= 4.1 ms (str 46 w/w manuala)
  • Poziom 10  
    Witam,
    problem już był poruszany / https://www.elektroda.pl/rtvforum/topic767873.html/.
    Spróbuj z niego zrobić "hexa" i wgraj do swojego PIC-a, aby co najmniej sprawdzić, czy Twój wyswietlacz reaguje prawidłowo na rozkazy z PIC-a. Tak na marginesie -ja mam kod asm pod Z80 (w mikrokontrolerze CA80 Gardynika), mogę go Tobie udostępnić, ale ja tam wykorzystuję przesyłanie 8-bitowe, więc chyba nic z tego, jesli nie znasz rozkazów Z80
  • Poziom 24  
    Masz , powinien ruszyć , przeanalizuj sobie.
    Straszny zamęt, usunąłem zbedne deklaracje, nie ma potrzeby ich wypisywania , dołączaj je dyrektywą include.
    Brak bylo pierwszej instrukcji przełączajacej z trybu 8 na 4 bitowy.
    Wiec i następna : set funktion (28h) nic nie mogła zdziałac.
  • Poziom 11  
    Koledzy, chylę czoło i dziękuję za pomoc, szczególnie koledze "adamwasola", obsługa wyświetlacza ruszyła, jednak opierając się o podany przez kolegę program musiałem wprowadzić drobne kosmetyczne poprawki w opóźnieniach, gdyż tam tkwił główny problem, podesłany przez kolegę program, powodował że zaraz po wgraniu pojawiał się napis na górnym wierszu, ale w drugim już były hieroglify, co lepsze, jak wyłączyło się ukłąd z źródła zasilania i włączyło, zapala się tylko pierwsza litera i w obu liniach kwadraciki, pierwsze co zrobiłem to wpisałem w opóźnieniach odpowiednio 84h i 81h, taki ustawienia zapewniało że zawsze rezystory podciągające będą wyłączone, spowodowało to że przestały wyświetlać się kwadraciki, a zapalały w obu liniach hieroglify, więc metodą prób i błędów zmieniałem ustawienia preskalera dla obu opóźnień, i wpisując dla każdego preskaler 86h, czyli podział 1:128, wszystko ruszyło i działa prawidłowo, zaraz wyślę w załączniku kod z moimi drobnymi zmianami, może komuś na przyszłość pomoże. Dodam co jest oczywiste że teraz obsługa wyświetlacza jest wolniejsza ale dla mojego rozwiązania 100ms w tą czy w tą nie gra roli

    Dodano po 56 [sekundy]:

    Kod programu z moimi poprawkami