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

[AVR] [AVR][C] Błędy w wyświetlaniu znaków na HD44780 - biblioteka własna

bartek3579 06 Mar 2012 18:31 2924 16
  • #1 10642270
    bartek3579
    Poziom 17  
    Witam.
    Napisałem swoją bibliotekę do wyświetlacza w temacie, ale niestety są z nią problemy.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Na wyświetlaczu powinien wyświetlić się ciąg znaku "a", ale niestety czasem nie wyświetli się nic. Innym razem wyświetli się ciąg "a", ale miejscami ze spacją. Ogólnie nie działa jak powinien.


    Plik nagłówkowy biblioteki:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod





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



    Ogólnie robię tak jak jest w nocie katalogowej HD4478. Zwiększyłem czasy w niektórych pętlach opóźniających dla pewności. Po stronie sprzętowej niema żadnych problemów bo sprawdzałem na bibliotece ze strony radzio.dxp.pl i działa w pełni poprawnie.
    Siedziałem nad tą biblioteką dużo czasu i już nie mam pomysłu co robię źle.
  • #2 10642585
    sulfur
    Poziom 24  
    Funkcje static inline powinny znajdować się w pliku nagłówka (.h).
    A kompilator nie zgłasza żadnych błędów ani ostrzeżeń ?
  • #3 10642593
    tadzik85
    Poziom 38  
    sulfur napisał:
    Funkcje static inline powinny znajdować się w pliku nagłówka (.h).


    To troche przesadzone.
  • #4 10642615
    gaskoin
    Poziom 38  
    Tam chyba miało być poprostu 'nie'. Bo z wypowiedzi sulfura wynika, że daje reprymendę, a przecież autor ma takie funkcje w nagłówku.
  • #5 10642681
    sulfur
    Poziom 24  
    O ile mi wiadomo, funkcje static inline są rozwijane w miejscu wywołania i jednocześnie nie posiadają ciała funkcje, które można by było wywołać, czyli nie mają adresu. Oznacza to, że żeby były dostępne w innych jednostkach kompilacji MUSZĄ znajdować się w pliku nagłówkowym. Ponieważ ich deklaracje znajdują się w pliku nagłówkowym zakładam, że powinny być dostępne na zewnątrz.
    Pytanie dodatkowe do autora: Podczas LCD_Initialize włączyć kursor. To da odpowiedź, na mniej więcej jakim etapie są problemy.
  • #6 10642700
    gaskoin
    Poziom 38  
    sulfur napisał:
    O ile mi wiadomo, funkcje static inline są rozwijane w miejscu wywołania i jednocześnie nie posiadają ciała funkcje, które można by było wywołać, czyli nie mają adresu. Oznacza to, że żeby były dostępne w innych jednostkach kompilacji MUSZĄ znajdować się w pliku nagłówkowym. Ponieważ ich deklaracje znajdują się w pliku nagłówkowym zakładam, że powinny być dostępne na zewnątrz.
    Pytanie dodatkowe do autora: Podczas LCD_Initialize włączyć kursor. To da odpowiedź, na mniej więcej jakim etapie są problemy.


    Co za bezsens, przecież static oznacza, że zakres funkcji jest dostępny tylko w obrębie jednostki kompilacji i po kiego grzyba wystawiać taką funkcję na zewnątrz skoro przypisało się jej static? :D
  • #7 10642745
    sulfur
    Poziom 24  
    Ja tego nie wymyślam. Jeśli byłoby samo inline, to kompilator oprócz rozwijania funkcji utworzyłby osobne ciało, które można byłoby wywołać (call). W przypadku static inline tego nie zrobi.
    Co do sensu lub nie, przykład z core_cm3.h
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    W moim pliku od lini 1694.
  • #8 10642762
    gaskoin
    Poziom 38  
    tylko zauważ, że w tym pliku h znajduje się cała definicja, którą dołączasz wszędzie tam, gdzie dołączasz tenże plik h. Czyli tak jakbyś tę funkcję sobie powklejał do tychże plików. Nie jest ona wkompilowana w żadną binarkę, a my tu mówimy o sytuacji, gdzie masz funkcję static inline w pliku c/binarce i "wystawiasz" ją na zewnątrz nagłówkiem.
  • #9 10642781
    sulfur
    Poziom 24  
    Ale ja tego nie neguje. Zauważ przede wszystkim co jest u autora wątku.
  • Pomocny post
    #10 10642795
    gaskoin
    Poziom 38  
    Dobra, już teraz widzę, że mówimy o tym samym, tylko z dwóch różnych stron :P

    Celem autora było jednak chyba ukrycie tych funkcji przed światem zewnętrznym - wtedy definicji takich funkcji nie daje się do nagłówka, tylko do pliku c
  • #11 10643012
    sulfur
    Poziom 24  
    Nie znam intencji autora. Jeśli mają być ukryte, powinien zrobić tak jak mówisz. Jeśli dostępne, tak jak zaznaczyłem wcześniej.

    Co do kodu, zauważyłem jeszcze
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Porównać, jak zrobił to radzio.
  • #12 10643041
    bartek3579
    Poziom 17  
    Kompilator wyświetlał warningi do tych deklaracji.
    Usunąłem deklaracje funkcji static w pliku nagłówkowym. Chcę, żeby te funkcje nie były dostępne nigdzie indziej niż w HD44780.c bo te funkcje nie są mi potrzebne poza nią. Czy teraz będzie poprawnie?

    Włączyłem kursor i niestety go nie wyświetla.
    Po podłączeniu zasilania wyświetlacz wyświetla czarny pasek w pierwszym wierszu.
    Po inicjalizacji wyświetlacz jest wyczyszczony, ale nic więcej.

    U mnie zdefiniowane jest tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    U radzia za każdym razem pisane w całości:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Na to samo wychodzi więc nie widzę problemu.
    IMHO u mnie jest czytelniej i wygodniej.
  • Pomocny post
    #13 10643243
    sulfur
    Poziom 24  
    Napisałem, że masz CLR_E oraz SET_E bezpośrednio po sobie. Zrób z tym porządek.
    Nie chodziło mi o czytelność, tylko o czas pomiędzy jednym a drugim. Wstaw jakieś nopy albo do sprawdzienia _delay_us(1)
  • #14 10643519
    bartek3579
    Poziom 17  
    Trochę źle zrozumiałem.

    Ale u radzia jest tak samo:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Instrukcja jest po instrukcji i daje dwie po sobie takie same instrukcjie w ASM jak i u mnie.

    Ale dopisałem jak zaproponowałeś _delay_us(1)
    I faktycznie się poprawiło trochę, chodź dalej nie wiem czemu u radzia działa bez tego...

    Po tej zmianie zaczęło wyświetlać "a" kursor pojawią się tam gdzie trzeba. Po wyczyszczeniu wyświetlacza funkcją LCD_WriteCmd(HD44780_CLEAR);. Wyświetlacz jest faktycznie wyczyszczony, ale "zjada" mi pierwszy znak jaki wyśle po wyczyszczeniu. Czyli nie wyświetla "d" przed pięcioma "b".

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


    Jestem coraz bardziej skołowany.
  • Pomocny post
    #15 10643528
    krru
    Poziom 33  
    bartek3579 napisał:
    Kompilator wyświetlał warningi do tych deklaracji.
    Usunąłem deklaracje funkcji static w pliku nagłówkowym. Chcę, żeby te funkcje nie były dostępne nigdzie indziej niż w HD44780.c bo te funkcje nie są mi potrzebne poza nią. Czy teraz będzie poprawnie?



    Wystarczającym zabezpieczeniem jest oznaczenie ich jako static wewnątrz HD44780.c
    Wtedy, w innym pliku można zdefiniować tak samo nazywające się funkcje, a i tak w HD44780
    zostaną użyte te lokalne.
  • #16 10643571
    sulfur
    Poziom 24  
    bartek3579 napisał:
    Ale u radzia jest tak samo
    No tak, nie założyłem, że używasz innej biblioteki, bo za zajrzałem do tej 4x40, a tam jest odrobinę inaczej.
    bartek3579 napisał:
    chodź dalej nie wiem czemu u radzia działa bez tego...
    Też nie wiem.
    bartek3579 napisał:
    Czyli nie wyświetla "d" przed pięcioma "b".
    Zgaduję, ale w czytaniu flagi masz (LCD_Read) też masz SET i CLR w bezpośrednim sąsiedztwie i nie wstawiłeś tam żadnej przerwy.
  • #17 10646028
    tehaceole

    Poziom 28  
    sulfur napisał:
    Napisałem, że masz CLR_E oraz SET_E bezpośrednio po sobie. Zrób z tym porządek.
    Nie chodziło mi o czytelność, tylko o czas pomiędzy jednym a drugim. Wstaw jakieś nopy albo do sprawdzienia _delay_us(1)


    Też kiedyś popełniłem ten błąd... Z jednymi wyświetlaczami działało, z innymi już nie. Teraz robię to tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Resztę opisałem tutaj
REKLAMA