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

LCD 2*16 + Atmega8 [c] - Inicjalizacja wyświetlacza

Michał 911 02 Lip 2013 19:54 2772 12
REKLAMA
  • #1 12480132
    Michał 911
    Poziom 18  
    Witam,

    Wiem, że temat powtarzał się na forum już z milion razy (chociaż ja znalazłem tylko 7 podobnych ;-) ), ale po przeczytaniu ich nie wywnioskowałem co jest nie tak.

    Kto mi powie dlaczego ten wyświetlacz nie chce się zaincjować?
    Wyświetlacz na 100% sprawny, bo jakieś gotowe skompilowane programy znalezione w sieci działają (w zasadzie to część działa, bo np. dostałem skompilowany kod, który u kolegi działał, a u mnie nie chce działać. Tylko on miał jakiś inny wyświetlacz, ale sterownik też zgodny z HD44780), z resztą sprawdzałem na drugim takim samym wyświetlaczu też to samo. Próbowałem wymienić uC, ale też nie pomogło, więc to na pewno musi być coś w kodzie. Tylko co :?:
    Biblioteki Radzia, ani różne kursy jak uruchomić LCD też niestety nie pomogły.

    Wyświetlacz to JHD162A (2*16), zgodny ze sterownikiem HD44780.
    Podłączony mam go w konfiguracji 4-bitowej.
    Nawet już próbowałem "ręcznie" wymusić na nim, żeby coś wyświetlił (jakieś śmieci, ale, żeby coś co kolwiek), tzn. napisałem kawałek kodu (ten długi komentarz na dole w kodzie głównym) i też nie działa (oczywiście jak sprawdzałem to co jest w komentarzu na dole, to zakomentowałem to co było u góry - od " lcd_init();" włącznie do przed ostatniej klamry). Tylko kontrast się zmniejszył - czyli może jakby coś chciał wyświetlać i od razu czyścił wyświetlacz?

    Kod główny:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Funkcje do obsługi wyświetlacza (plik HD44780.c);
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Plik HD44780.h
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W załączniku cały projekt w AtmelStudio 6.0. i na wypadek jak by to komuś miało ułatwić sprawdzanie mojego kodu to wstawiam jeszcze schemat.

    Z góry dzięki
    Pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 12480443
    Tom1988p
    Poziom 16  
    Na 100% masz podłączone wszystkie linie zgodnie ze schematem i definicjami?
    Kontrast masz ustawiony? może on działa jak trzeba tylko tego nie widać.

    Po co ta kolejna inicjalizacja na wszelki wypadek?
  • REKLAMA
  • #3 12480578
    Michał 911
    Poziom 18  
    Tom1988p napisał:
    Na 100% masz podłączone wszystkie linie zgodnie ze schematem i definicjami?

    Tak, podłączałem też drugi taki sam wyświetlacz i podobny (1*16), w sumie łączyłem to kilka razy. Także złe połączenie raczej odpada.
    Tom1988p napisał:
    Kontrast masz ustawiony?

    Tak kręciłem potencjometrem od kontrastu w jedną i w drugą (teraz mam ustawiony tak mniej więcej na środku, że można jeszcze przyciemnić i rozjaśnić).
    Tom1988p napisał:

    Po co ta kolejna inicjalizacja na wszelki wypadek?

    Bo już nie wiem co to może być, a czytałem, że niektóre rzeczy np. żeby przestawić jakiś rejestr to trzeba 2 razy powtórzyć, więc tak myślałem, że to może o to chodzić.
  • #4 12481022
    zumek
    Poziom 39  
    Michał 911 napisał:
    Tom1988p napisał:
    Na 100% masz podłączone wszystkie linie zgodnie ze schematem i definicjami?

    ...Także złe połączenie raczej odpada.

    Zamiast opowiadać nam tu bajki, może byś się zapoznał z plikami, które tu załączyłeś :?:
    Na pierwszy rzut oka widać, że definicje końcówek LCD w pliku hd44780.h, nie pokrywają się ze schematem.
  • REKLAMA
  • #5 12481238
    Michał 911
    Poziom 18  
    Cytat:
    Na pierwszy rzut oka widać, że definicje końcówek LCD w pliku hd44780.h, nie pokrywają się ze schematem.

    Tak nie do końca wiem o co Ci chodzi, bo w tej części kodu wszystko się zgadza;
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #6 12481264
    zumek
    Poziom 39  
    Michał 911 napisał:
    ... bo w tej części kodu wszystko się zgadza;
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    No rusz chłopie głową i pomyśl, w którym rejestrze zostanie ustawiony bit o numerze PB5 :?: DDRB, CZY DDRD :?:
  • #7 12481326
    Michał 911
    Poziom 18  
    Aaa! No racja!
    Już jest lepiej, bo górna linia zgasła, ale nadal nic nie wyświetla.
    Jeszcze minimalnie zmieniłem plik główny .c. (wywaliłem tą drugą inicjalizacją z while i dodałem delaya 15ms, przed whilem), ale nadal pusty wyświetlacz.
    Jak kontrast jest ustawiony na max to pod światło widać że w obu liniach prostokąty.
    Czyli wyświetlacz został zainicjowany. Tylko dlaczego dalej nie działa?
  • REKLAMA
  • #8 12481831
    Mystik
    Poziom 11  
    Wstaw schemat i poprawiony kod. Wtedy się porówna te dwie rzeczy, czy do siebie pasują.

    pozdrawiam
  • #9 12481985
    Michał 911
    Poziom 18  
    Schemat jest wstawiłem w pierwszym poście w złączniku.
    Wstawię wszystkie pliki, bo wg. mnie to będzie łatwiejsze do czytania, niż żeby coś w tym poście spojrzeć i co chwila przewijać stronę do pierwszego posta.
    Poza tym jeszcze minimalnie zmieniałem główny plik .c.
    Kod główny:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Funkcje do obsługi wyświetlacza (plik HD44780.c);
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Plik hd44780.h;
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #10 12482150
    Mystik
    Poziom 11  
    OK.

    Ja w konfiguracji pinów w stosunku do schematu błędu nie znalazłem.

    Zacząłbym od tego:

    1. Po co w programie głównym ustawiasz kierunki portów i ich zawartość, jak zaraz w procedurze inicjalizacji wyświetlacza to powtarzasz. Ja bym tych portów przed ustawienie LCD nie dotykał.
    2. Ja wykorzystują procedurę inicjalizacji jak poniżej (dostępna w internecie-już nie pamiętam skąd ją zassałem, ale autorowi dizękuję, bo działa bez problemu). U siebie nie korzystam z pinu RW.
    Porównaj czasy po poszczególnych blokach komend przesyłanych do LCD.

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


    Generalnie, pomijając czasy, to wszystko się zgadza z Twoją procedurą. Często te czasy są właśnie krytyczne. I albo działa albo nie działa.

    pozdrawiam
  • Pomocny post
    #11 12482157
    PDT
    Poziom 24  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Obejrzałem 'po łebkach' Twój hd44780.h i powyżej zawarłem spostrzeżenia.
    Pzdr

    Możesz nie znać tego 'standardu'. Ogólnie:

    < linia zawiera to co jest
    > linia zawiera to co ma być

    reszta służy tylko lokalizacji. To wynik programu diff.
  • #12 12482219
    Michał 911
    Poziom 18  
    Działa!!! Dzięki za pomoc :D
    Tylko jak to możliwe, że mam to skopiowane od kolegi, który używał właśnie tych plików, a mu to działało przed poprawieniem błędów.
    Tylko, że on używa win-avra...
REKLAMA