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

[Rozwiązano] [PIC16F1827][XC8 1.33][Proteus 8 VSM] LCD 16X2; symulacja, a rzeczywistość

Urgon 28 Sty 2018 16:29 753 2
  • #1 28 Sty 2018 16:29
    Urgon
    Poziom 36  

    AVE...

    XC8 nie ma dobrej biblioteki do obsługi LCD 16x2. Ta stworzona przez Microchip działa tylko przy określonej kolejności podłączania pinów do wyświetlacza i nie ma poprawnej inicjalizacji trybu 4-bitowego, inna, dostępna w odmętach internetów nie obsługuje wszystkich modeli wyświetlaczy oraz funkcji. Łącząc kawałki z obu stworzyłem potworka, który w teorii działa. Konkretniej działa poprawnie w symulacji, ale w rzeczywistym układzie tani, chiński wyświetlacz 16x2 nie inicjalizuje się wcale. Co ciekawe, analizator logiczny nie wykrywa żadnej komunikacji, a jak wykrywał zanim zacząłem grzebać w kodzie, to na przykład stan wysoki pinu E trwał mniej, niż mikrosekundę, choć w kodzie jest opóźnienie 50µs.

    Na początek biblioteka lcd_alt.h, z góry przepraszam za całe funkcje w nagłówku, ale kompilator nie ma z tym problemów:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Wewnętrzny oscylator PIC16F1827 konfiguruję jako 8MHz * 4xPLL = 32MHz.

    Teraz kawałek z main.c, pomijam nieistotne rzeczy (jak deklaracje zmiennych) i zostawiam tylko wykorzystywane funkcje dla czytelności:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W symulacji program wykonuje się przynajmniej do końca funkcji configure(). W symulacji czasy trwania impulsów wysyłanych do symulowanego wyświetlacza są poprawne. Napisy się pojawiają i wszystko bangla. W prototypie nic nie działa. Próbowałem konfiguracji, w której na RA6 był sygnał CLKOUT, ale ta linia ma rezystor pull-up 10kΩ i nie jestem pewien, czy to nie wpływa na sygnał wyjścioewy. Czasami zaraz po podłączeniu zasilania pojawiał się tam sygnał prostokątny o częstotliwości około 4 lub 12MHz według mojego klona Saleae. W jednej z prób zmieniłem funkcję configure w ten sposób:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    by "złapać sekwencję inicjalizacji i ewentualnego wysyłania znaków, ale przebiegi, które złapałem miały złe czasy - stan wysoki na linii E trwał ~1µs zamiast ~50µs.

    Uprzedzając pytanie: tak, sprawdzałem połączenia do wyświetlacza multimetrem. zresztą sprawdzę jeszcze raz, na wszelki wypadek...

    EDIT 1:

    Przygotowałem prosty projekt by sprawdzić działanie samej biblioteki lcd_alt.h.
    Poniżej cały projekt z kodem źródłowym i symulacja Proteus ze schematem. Symulacja działa pięknie.
    Układ rzeczywisty już nie za bardzo.
    Mogę dodać to, co złapało Saleae w ichnim formacie lub w formacie CSV, ale nie wiem, czy jest sens...

    EDIT 2:

    Wsadziłem goły mikrokontroler w podstawkę ZIF, podłączyłem zasilacz i analizator stanów, i złapałem ramki danych z odpowiednio długimi stanami linii E.

    [PIC16F1827][XC8 1.33][Proteus 8 VSM] LCD 16X2; symulacja, a rzeczywistość

    Zatem to chyba jednak wyświetlacz jest zwalony. A taki nowy był, chiński...

    0 2
  • Pomocny post
    #2 29 Sty 2018 21:33
    Seba_smd
    Poziom 15  

    1. Po załączeniu zasilania musisz poczekać 45ms (wyświetlacz wykonuje automatyczną procedurę inicjacji)
    2.
    RS=0
    E=1
    D7=D6=0, D5=D4=1 (Function Set interfejs 8-bitowy)
    E=0
    opóźnienie 5ms
    E=1
    D7=D6=0, D5=D4=1 (Function Set interfejs 8-bitowy)
    opóźnienie 2us
    E=0
    czekaj 100us
    E=1
    D7=D6=0, D5=D4=1 (Function Set interfejs 8-bitowy)
    opóźnienie 2us
    E=0
    opóźnienie 100us

    RS=0
    E=1
    D7=D6=D4=0, D5=1 ( Function Set - interfejs 4-bitowy)
    opóźnienie 2us
    E=0
    opóźnienie 2us
    E=1
    itp...
    Function SET
    Display OFF
    Display Clean
    Entry Mode Set
    Działa na wszystkie wyświetlacze

    http://atmega32.republika.pl/34.htm

    0
  • #3 02 Lut 2018 17:34
    Urgon
    Poziom 36  

    AVE...

    Odkryłem przyczynę niedziałania układu w płytce. pin MCRL na zaprojektowanej płytce zwarty jest do masy - gdy przemieszczałem kilka komponentów przy tym pinie, nie zauważyłem iż jedna ścieżka się przesunęła na złą stronę kondensatora, zwierając go oraz pin do masy, i nie zauważyłem tego gdy zamawiałem płytkę...

    Dokonałem zatem drobnej operacji chirurgicznej na płytce, naprawiłem błąd i teraz wszystko działa dobrze z każdym wyświetlaczem...

    0