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

[Atiny2313][C]Wyświetlacz HD44780 nie działa poprawnie

excray 05 Lis 2011 17:05 2138 13
  • #1 10104580
    excray
    Poziom 41  
    Zaczynam przygodę z C i napisałem swój pierwszy program do obsługi wyświetlacza HD44780. Niestety nie mogę go poprawnie uruchomić. Program jest kopią w C programu napisanego w ASM który działa poprawnie. Wersja w C wyrzuca krzaki.
    start.c - program główny
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    LCD.h - definicje i deklaracje
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    LCD.c - obsługa LCD
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jak wspominałem wersja w ASM działa prawidłowo. Kompilacja przebiega bezbłędnie. W AVR Studio symulacja też sprawia wrażenie poprawnego działania - na porcie w trakcie działania ustawiane są dokładnie takie dane jakich oczekuję. Mikroprocek programowany równolegle z ustawieniem zegara wewnętrznego RC 8MHz. Proszę o wskazanie błędów. Jak wspominałem jestem początkującym w C więc może to być jakaś skrajnie oczywista głupota, niestety nie dla mnie.

    EDIT> Poprawiono flagę RS
  • #2 10104601
    tmf
    VIP Zasłużony dla elektroda
    Dlaczego po prostu nie wykorzystasz gotowego kodu obsługi tego LCD z AVR-libc? Lepiej niż twórcy tej biblioteki zapewne tego nie zrobisz :)
  • #3 10104618
    excray
    Poziom 41  
    Ponieważ się uczę C i w ramach nauki piszę akurat bibliotekę do LCD. Priorytetem jest to abyście mi wytknęli błędy które popełniłem pisząc ten program, abym nie popełniał tych błędów pisząc inne programy. Z góry dziękuję za pomoc.

    Dodano po 1 [godziny] 57 [minuty]:

    Pierwszy błąd znaleziony. RS powinien być wyzerowany w czasie zapisu rozkazu a ustawiony w czasie zapisu danych a u mnie było odwrotnie. Błąd poprawiony ale wyświetlacz nadal nie działa. Wygląda jakby się dobrze inicjował, ale na wyświetlaczu nic się nie wyświetla. Kontrast ustawiony prawidłowo.
  • #4 10107376
    excray
    Poziom 41  
    Niestety mimo zmiany środowiska na Eclipse i wieeelu testów z czasami wykonania poszczególnych procedur w dalszym ciągu kod nie działa. Czy jest ktoś na forum kto jest w stanie odpowiedzieć dlaczego kod w C++ nie działa a analogiczny w ASM hula aż miło? Dodam że ze znaczących zmian to wyłączyłem przerwania. W nagrodę za pomoc oddam 200 punktów.
  • #5 10107470
    mirekk36
    Poziom 42  
    Po pierwsze to nie jest kod w C++ tylko w C (to jest różnica). Po drugie to nałożonych jest tu albo było wiele błędów. Jednym z nich było użycie #define F_CPU i np atmelowskiego toolchaina i _delay_xx.

    Rozumiem, że kolega chce napisać własną obsługę LCD - to się chwali. Jednak masz czy to w necie, czy gdziekolwiek - jakieś przykładowe rozwiązania - czy nie warto się im przypatrzeć i na tej podstawie rozwiązywać swoje problemy? Wtedy o wiele łatwiej wyłapać błędy i się czegoś nauczyć. Tym bardziej, że sam na początku piszesz, że robisz kopię programu z asm. Zamiast tego podpatrz jak to się robi w C.
  • #6 10107604
    excray
    Poziom 41  
    mirekk36 napisał:
    Po pierwsze to nie jest kod w C++ tylko w C (to jest różnica). Po drugie to nałożonych jest tu albo było wiele błędów. Jednym z nich było użycie #define F_CPU i np atmelowskiego toolchaina i _delay_xx.

    Rozumiem, że kolega chce napisać własną obsługę LCD - to się chwali. Jednak masz czy to w necie, czy gdziekolwiek - jakieś przykładowe rozwiązania - czy nie warto się im przypatrzeć i na tej podstawie rozwiązywać swoje problemy? Wtedy o wiele łatwiej wyłapać błędy i się czegoś nauczyć. Tym bardziej, że sam na początku piszesz, że robisz kopię programu z asm. Zamiast tego podpatrz jak to się robi w C.

    Racja. Przejęzyczyło mi się. Oczywiście że C. Co do F_CPU już dawno poprawiłem. A co do innych procedur obsługi to przejrzałem już chyba z 5 innych bibliotek i w zasadzie nie widzę większych odstępstw od mojej. W większości (ale nie wszystkich) dane są wystawiane bitowo na szynę co chcę uniknąć bo niepotrzebnie mi spowalnia procedury a D4-D7 wyświetlacza a i tak zawsze podpinam pod piny 4-7 kontrolera, ale w jednej dwóch było analogicznie jak u mnie. A co do uporu to jak mam pisać inne programy skoro napisałem ten i nie działa. Błędów kompilator żadnych nie wskazuje. Logicznie niby wszystko OK. To czemu nie działa? Za tydzień napiszę obsługę do jakiegoś układu AD do którego w necie nie będzie "gotowca" i też mi nie będzie działać z niewiadomego powodu? Dlatego muszę wiedzieć dlaczego akurat ten kod nie działa.

    EDIT> Co do funkcji delay(xx) to nie mogę mieć do niej zastrzeżeń. Odpowiednik asemblerowy w pliku .lss jest ładnie wykonany, działa dokładnie tak jak powinien i nie niszczy żadnych danych których nie powinien.
  • Pomocny post
    #7 10107858
    mirekk36
    Poziom 42  
    O jakim kolega spowalnianiu niepotrzebnym tu pisze skoro nie używa w swoim kodzie nawet obsługi BusyFlag, tylko wszystko oparte jest na _delay'ach. TO DOPIERO są spowolnienia! A to, że obsługa miałaby być na oddzielnych bitach - to nic, to maleńki pikuś w porównaniu do tego.

    Poza tym podstawowe pytanie, bo wiem, że kolega ma książkę a jak słyszę - to szuka obsługi różnych bibliotek gdzieś po necie albo nawet przerabia procedury z asemblera. Czy w książce nie ma biblioteki do LCD ??? bo coś dziwnego chyba tu się dzieje albo ja czegoś mocno nie rozumiem ??? Ja tworząc coś nowego wolałbym odpalić chociaż raz jakąś bibliotekę gotową, która działa i na jej podstawie potem sobie pisać ew swoją - albo szukać błędów w swojej - mając dobrą pod ręką. A tu coś całkiem odwrotnego chyba kolega robi. Dlatego proszę o rozjaśnienie.
  • Pomocny post
    #8 10107923
    zumek
    Poziom 39  
    excray napisał:
    ...Dlatego muszę wiedzieć dlaczego akurat ten kod nie działa.

    To ja Ci napiszę dlaczego :!:
    Odpowiedź jest jak zwykle, prozaiczna - źle inicjujesz LCD.
    Zadałem sobie trud odpalenia Twojego kodu i po poprawieniu 1 (słownie: jednego) znaku w Twoim kodzie, LCD działa :-P


    PS
    Ponieważ projekt kompilowałem za pomocą AVRStudio4.18+WinAvr, to z kodu pousuwałem również wszystkie #define F_CPU 8000000UL
    ... gwoli ścisłości :-P
  • #9 10108330
    excray
    Poziom 41  
    Kolego zumek mógłbyś napisać o jakim znaku mówisz? Bo tak się składa że ja też znalazłem rozwiązanie moich bolączek i trochę inne niż jeden znak i chciałbym zobaczyć czy o tym samym mówimy :-)

    Kolego mirekk36 uruchamiałem inne procedury. Działają :-). Ale tak dla prostoty wybrałem sobie na projekt stworzenie własnej biblioteki. Niestety w momencie gdy ta biblioteka mimo że powinna działać - nie działała nie miałem już wyjścia. Musiałem dojść dlaczego.
  • #10 10108356
    mirekk36
    Poziom 42  
    excray napisał:

    Kolego mirekk36 uruchamiałem inne procedury. Działają :-). Ale tak dla prostoty wybrałem sobie na projekt stworzenie własnej biblioteki. Niestety w momencie gdy ta biblioteka mimo że powinna działać - nie działała nie miałem już wyjścia. Musiałem dojść dlaczego.


    No to rozumiem i pochwalam - warto napisać coś swojego w tym zakresie bo to daje duże doświadczenie....

    Poszukaj więc błędu w inicjalizacji jak pisał kolega zumek ... zapewne chodzi o jakąś wartość parametru a może nie o sam znak ... przeanalizuj jeszcze raz dokładnie PDF i procedurę startową w PDFie oraz wartości u siebie.
  • Pomocny post
    #11 10108399
    zumek
    Poziom 39  
    excray napisał:
    Kolego zumek mógłbyś napisać o jakim znaku mówisz?

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


    [Atiny2313][C]Wyświetlacz HD44780 nie działa poprawnie
  • #12 10108486
    excray
    Poziom 41  
    Kolego zumek niestety nie zgadza się. Robiłem wcześniej takie próby bo też widziałem tego pdfa. Zresztą co pdf to inaczej opisane. Ja mam na przykład takiego:
    [Atiny2313][C]Wyświetlacz HD44780 nie działa poprawnie
    który nota bene jest specyfikacją dokładnie tego LCD którego używam. Niemniej próbowałem również z 0x20 i 0x22, oczywiście bez skutku. Co ciekawe w ASM to nie ma znaczenia. Czy się zainicjuje ciągiem 0x30, 0x28 czy też 0x30 0x20 0x28 tak czy siak działa poprawnie :-)

    Do rzeczy - problem rzeczywiście siedział w komunikacji z HD44780. Mianowicie dane d7-d4 i d3-d0 należy BEZZWŁOCZNIE wysyłać po sobie. Jeśli będzie między tymi dwoma zapisami dłuższy odstęp (u mnie było ok 50us i już było zbyt długo) to wyświetlacz najwyraźniej "gubi" poprzednie dane albo zapomina która to para. Co ciekawe nie znalazłem tego w specyfikacji.
    Poniżej poprawiony kod - głównie funkcja LCD_OUT

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


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


    Plik LCD.h bez zmian.

    EDIT> Dziękuję wszystkim za pomoc i za przekonanie do środowiska Eclipse. Rzeczywiście pisanie w Eclipse staje się przyjemnością.
  • #13 10108573
    zumek
    Poziom 39  
    excray napisał:
    Kolego zumek niestety nie zgadza się...

    Cuda Panie , cuda :D

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


    Mój wyświetlacz z Twoim (poprawione tylko 0x30 na 0x20) kodem, działa nawet przy tak wielgachnym opóźnieniu.
    Czary :?:
  • #14 10108597
    excray
    Poziom 41  
    Dziwne rzeczywiście. Ale prawdziwe. Chyba zależy to od producenta/modelu a może mam uszkodzony. Punkty rozdałem po połowie:
    100 - mirekk36
    100 - zumek

    Dodano po 1 [godziny] 1 [minuty]:

    To rzeczywiście jest bardzo dziwna sprawa bo użyłem kodu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    i dwóch różnych wyświetlaczy.
    1. SSC2M16ULGY-03 - 2x16
    2. JHD 162A - 2x16
    i w obydwu przy czasie powyżej 30us a nawet często przy 30us wyświetlacz nie funkcjonował prawidłowo.
REKLAMA