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

Sterowanie LCD z Atmega16 i HD4478 - brak wyświetlania kursora

ginar 06 Sie 2007 15:20 2462 8
REKLAMA
  • #1 4151196
    ginar
    Poziom 21  
    Posty: 595
    Pomógł: 26
    Ocena: 34
    Witam
    Przeczytałem artykuł o wyświetlaczach LCD z EDW, ale mam problem z uzyskaniem cokolwiek na nim. Wyświetlacz zgodny ze sterownikiem HD4478
    http://www.sklep.avt.com.pl/go/_info/?id=42421

    sterowany w układzie:
    Sterowanie LCD z Atmega16 i HD4478 - brak wyświetlania kursora

    Sterowanie 8 - bitowe

    Napisałem programik aby wyświetlic chociaż sam kursor :
    Sterowanie LCD z Atmega16 i HD4478 - brak wyświetlania kursora
    funkcja czekaj:
    Sterowanie LCD z Atmega16 i HD4478 - brak wyświetlania kursora

    ale niestety nic (tylko zapalona górna linia w zależności od pokręcenia kontrastem).
  • REKLAMA
  • #2 4151280
    aster11
    Poziom 19  
    Posty: 211
    Pomógł: 36
    Ocena: 1
    Kompletnie skopana jest funkcja czekaj. Pętla zewnętrzna nie wykona się ani raz, bo pomyliłeś kierunek nierówności. Pętla wewnętrzna jest z kolei nieskończona! - przypisanie x=0 powinno być przed pętlą, a nie w jej wnętrzu.

    Niezależnie od błędnej funkcji, program i tak może nie działać według założenia. Pasowałoby na początek wstawić standardową sekwencję inicjalizującą, bo bez tego LCD może kaprysić.
    Polecałbym poszukać gotowej biblioteki do LCD, może ktoś z kolegów Ci podrzuci, ja nie mam teraz pod ręką dla AVR - albo sam poszukaj (google :) ). Tworzenie obsługi LCD samemu od podstaw, gdy nie ma się dużego doświadczenia i odpowiednich pomocy, może trochę sfrustrować.
  • REKLAMA
  • #3 4151809
    serum
    Poziom 16  
    Posty: 199
    Pomógł: 11
    Ocena: 4
    W załączniku jest program który na 100% działa na ATMega 8, niestety interfejs 4bitowy. Powinieneś zainicjować wyświetlacz, czasem (nie wiem czemu ale ja tak miałem) pomaga zresetowanie uC ale bez wyłączania zasilania.
    Załączniki:
    • LCD.c.rar (1.26 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #4 4152013
    ginar
    Poziom 21  
    Posty: 595
    Pomógł: 26
    Ocena: 34
    fakt czekaj była źle napisana ale i tak po poprawie nie chce ruszyć.
    Chyba konieczna jest inicjalizacja. Ktoś mógłby pomóc ale na 8 bitowym interfejsie (konieczne jest sprawdznie przy tym stanu zajętości czy wystarczy poczekać z nadmiarem)

    aha
    @serum

    Przejście z 4 bitowego interfejsu na 8 bitowy to chyba trzeba tylko zmienić
    w pewnym miejscu ten program co podesłałeś
    a konkretnie tylko tę fuknkcję :


    void LCD_init()
    {
    delayms(15); // czekaj 15ms na ustabilizowanie się napięcia zasilającego
    clr_e; // E = 0
    clr_rs; // RS = 0
    char i; // zmianna licznikowa
    for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
    {
    set_e; // E = 1
    LCD &= 0x3F; //
    clr_e; // E = 0
    delayms(5); // czekaj 5ms
    }
    set_e; // E = 1
    LCD &= 0x2E; //
    clr_e; // E = 0
    delayms(1); // czekaj 1ms

    write_command(0x28); // interfejs 4-bity, 2-linie, znak 5x7

    write_command(0x08); // wyłącz LCD, kursor i miganie
    write_command(0x01); // czyść LCD
    write_command(0x06); // bez przesuwania w prawo
    write_command(0x0C); // włącz LCD, bez kursora i mrugania
    }

    + zmiana pinów zgodnie z moim schematem (bo mam port C i A)
    czy tak?
  • #5 4152126
    aster11
    Poziom 19  
    Posty: 211
    Pomógł: 36
    Ocena: 1
    Radzę nie kombinować na początek, tylko uruchomić program, który przysłał kolega serum w niezmienionej postaci, w trybie 4-bitowym! Jeżeli masz fizyczne połączenie 8-bitowe, to masz i 4-bitowe:), potrzeba tylko odpowiednio zdefiniować piny, zgodnie z Twoim podłączeniem.
    Dopiero jak "wersja gwarantowana" zadziała, będziesz bawił się dalej. Już coś źle zakładasz, bo zmiany o których piszesz nie wystarczą - trzeba pozmieniać funkcję zapisu do portu LCD, aby wystawiała 8 bitów, a nie 2x4. Nie wystarczy zmienić inicjalizacji!

    NAJPIERW URUCHOM W TRYBIE 4-BITOWYM:!:

    PS. Najczęściej stosuje się tryb 4-bitowy, bo daje oszczędność wyprowadzeń uP, okupioną niewielką komplikacją algorytmu sterowania. No a jeśli algorytm ma się jak na tacy - z gotowej biblioteki, to w zasadzie czysty zysk. Nawet jeśli nie chcesz już teraz "odcinać kabli", możesz pozostać w trybie 4-bitowym, aby nie męczyć się z modyfikacją programu.
  • REKLAMA
  • #6 4159522
    ginar
    Poziom 21  
    Posty: 595
    Pomógł: 26
    Ocena: 34
    No teraz już śmiga :)

    Podaje inicjalizacje LCD (zgodna z opisem w EDW) dla interfejsu 8 bitowego, może sie przyda komuś,
    u mnie działa.

    ___________________________________
    Załączniki:
    • inicjal.c (1.77 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #7 4161707
    ginar
    Poziom 21  
    Posty: 595
    Pomógł: 26
    Ocena: 34
    Pisząc dalszą część programu mam następujacy problem z funkcją sprintf() :
    tak działa :

    Sterowanie LCD z Atmega16 i HD4478 - brak wyświetlania kursora

    a tak już nie :
    Sterowanie LCD z Atmega16 i HD4478 - brak wyświetlania kursora


    dodatkowo użycie funkcji sprintf powoduje kilkakrotny wzrost objętości programu (jakieś 10X).
    Potrzebuje uzyć funkcji sprintf aby nie wyswietlać wszystkich liczb po przecinku, wydaje mi sie że zawartość tablicy buffer nie jest traktowana jak ciąg stringów bo na wyswietlaczu pojawiają się krzaki.
    Co zmienić aby wyświetlić prawidłwo przykładowy wynik (28.78 ) ?
  • #8 4185504
    serum
    Poziom 16  
    Posty: 199
    Pomógł: 11
    Ocena: 4
    Nie wiem czemu u Ciebie nie działa, ja skompilowałem przykładowy programik i wszystko działa (na kompie), daj może większy bufor, wyskakują jakieś błędy przy kompilacji?
    Cytat:
    #include <stdio.h>
    #include <stdlib.h>

    int main(int argc, char *argv[])
    {
    float a=32.4432;
    char buffer[20];
    int i;
    sprintf(buffer,"%2.2f",a);
    for(i=0;i<20;i++){
    printf("%c",buffer[i]); }
    scanf( "%d", &i ); //czeka na naciśnięcie klawisza
    return 0;
    }


    PS. Twoja funkcja "wyswietl" jest nieekonomiczna, powinienbeś operować na wskaźnikach.
  • #9 4186015
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    ginar napisał:
    ...Potrzebuje uzyć funkcji sprintf aby nie wyswietlać wszystkich liczb po przecinku...

    Do sformatowania-konwersji jednej zmiennej typu float , sprintf() wcale nie jest Ci potrzebna( armata i wróbel :) ).Funkcja sprintf() jest baaardzo uniwersalna i jednocześnie baaardzo pamięciożerna.Zainteresuj się funkcja dtostrf() , bo do Twoich celów nadaje się idealnie.Jeśli "poczujesz" potrzebę sformatować kilka zmiennych różnego typu , to wtedy użyj sprintf().Mikrokontroler to nie PC-et , w którym możesz szastać pamięcia na prawo i lewo ;)


    Piotrek

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z wyświetlaniem kursora na wyświetlaczu LCD sterowanym przez mikrokontroler Atmega16 z użyciem sterownika HD4478 w trybie 8-bitowym. Głównym problemem była błędnie zaimplementowana funkcja opóźnienia (czekaj), która uniemożliwiała poprawne działanie programu. Zalecane było zastosowanie standardowej sekwencji inicjalizującej LCD, gdyż brak inicjalizacji powodował niestabilne działanie wyświetlacza. Wskazano, że łatwiej i pewniej jest rozpocząć pracę w trybie 4-bitowym, korzystając z gotowej biblioteki, a następnie ewentualnie przejść na 8-bitowy interfejs, co wymaga modyfikacji funkcji zapisu do portu LCD. Po poprawieniu funkcji opóźnienia i zastosowaniu odpowiedniej inicjalizacji LCD problem został rozwiązany i wyświetlacz działał poprawnie. Dodatkowo poruszono kwestię użycia funkcji sprintf() do formatowania liczb zmiennoprzecinkowych, która znacząco zwiększa rozmiar programu i może powodować błędy wyświetlania. Zamiast sprintf() zasugerowano użycie funkcji dtostrf(), bardziej optymalnej dla mikrokontrolerów AVR.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA