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

[ATmega 8] [C] [HD44780] Problem z wyswietlaniem znakow

corranh 10 Sty 2010 12:10 2978 10
REKLAMA
  • #1 7513625
    corranh
    Poziom 10  
    Witam, mam podlaczona ATmege z wyswietlaczem alfanumerycznym w trybie 4-bitowym z odczytem flagi zajętości. Uzywam biblioteki ze strony http://radzio.dxp.pl/hd44780/

    Inicjalizacja wyswietlacza przebiega tak jak powinna, kursor (ktory wlaczylem sobie) pojawia sie na pierwszej pozycji. Ale niestety jakakolwiek proba wyswietlenia znaku (LCD_WriteData() / LCD_WriteText() ) powoduje ze kursor przesuwa sie o dwie pozycje a pola zostaja puste.

    Wysiwetlacz jaki uzywam to: http://www.jinghua-displays.com/pdf/JM081ASPEC.pdf

    Jakies pomysly co moze byc nie tak?

    Pozdrawiam,
    Mateusz
  • REKLAMA
  • #2 7513684
    mario06
    Poziom 15  
    To, że kursor przesuwa się o dwa pola najprawdopodobniej świadczy o tym iż nie został zainicjalizowany tryb 4-bitowy transmisji. Dlatego jak wysyłane są pierwsza i druga część znaku to LCD przyjmuje to jako dwa odrębne znaki.
  • #3 7513811
    corranh
    Poziom 10  
    Tez tak na poczatku pomyslalem, ale czy jesli nie byl by zainicjalizowany tryb 4-bitowy to nie przyjalby wyswietlacz rozkazow (m. in. wlaczenia kursora, wyczyszczenia ekranu)?

    Inicjalizacja trybu u mnie wyglada nastepujaco:
    Cytat:
    for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
    {
    LCD_E_PORT |= LCD_E; // E = 1
    _LCD_OutNibble(0x03); // tryb 8-bitowy
    LCD_E_PORT &= ~LCD_E; // E = 0
    _delay_ms(5); // czekaj 5ms
    }

    LCD_E_PORT |= LCD_E; // E = 1
    _LCD_OutNibble(0x02); // tryb 4-bitowy
    LCD_E_PORT &= ~LCD_E; // E = 0
  • REKLAMA
  • #4 7514413
    golas17
    Poziom 16  
    Pokaż kod programu. Nie czyścisz przypadkiem wyświetlacza zaraz po wyświetleniu znaku?
  • REKLAMA
  • #5 7514714
    corranh
    Poziom 10  
    LCD_Initalize();
    while(1)
    
    	{
    		
    		for (i = 48; i < 60; i++)
    		{
    
    		while (PINB & (1<<PINB1))
    		{
    		}
    		
    		LCD_Clear();
    		LCD_WriteData(i);
    		_delay_loop_2(65530);
    		}
    	}


    W B1 mam przycisk zwarty do masy poprostu i co nacisniecie wyswietlam kolejne znaki poczynajac od '0' ale tak jak pisalem, zamiast pojawienia sie znaku to kursor przesuwa sie o dwie pozycje (a za to funkcja Clear dziala poprawnie - tz. przywraca kursor na poczatek).
  • REKLAMA
  • #6 7514946
    golas17
    Poziom 16  
    Spróbuj zrobić tak:
    - usuń całą zawartość pętli while(1) (ew. skomentuj jej zawartość)
    - zainicjalizuj wyświetlacz itp. itd. tak jak do tej pory
    - przed pętlą while(1) spróbuj wpisać coś takiego: LCD_WriteText("napis"); , generalnie wykorzystaj jakąś funkcję z biblioteki lcd do wyświetlenia napisu lub znaku (zakładam że do wyświetlenia znaku jest użyta ta funkcja: LCD_WriteData('a'); )
    Jeżeli znak lub napis zostaną wyświetlone to znaczy, że wyświetlacz działa prawidłowo i problem tkwi w tym co znajduje się w pętli nieskończonej.
  • #7 7515308
    corranh
    Poziom 10  
    Sporbowalem i dalej nie pomoglo.

    Wykasowalem sprawdzanie flagi zajetosci (zastapilem to odpowiednimi opoznieniami oraz ustawianiem RW na stale jako 0) dzieki czemu pozbylem sie "skakania" kursora o dwa miejsca.

    Teraz jedyny problem jaki jest to to, ze znaki sie nie wyswietlaja (pola pozostaja puste) tylko kursor sie przesuwa.

    Mozliwe jest ze pamiec ROM sterownika jest pusta?
  • #8 7515383
    golas17
    Poziom 16  
    Zawsze możesz spróbować wpisać do pamięci CGRAM wyświetlacza własne znaki i spróbować je wyświetlić.
    Sprawdź czy w tej bibliotece nie ma czegoś takiego jak ustawienie wartości oscylatora. Być może coś jest nie tak z opóźnieniami. Może trzeba zdefiniować coś w styli F_CPU i dodać bibliotekę util/delay.h:
    #define F_CPU tutaj_twoj_oscylator_np_1000000 lub 8000000
    #include <util/delay.h>

    Jak to nie pomoże to wrzucę ci inną bibliotekę do wyświeltacza 2x16
  • #9 7515461
    Vatras
    Poziom 12  
    Proponuję sprawdzić kontrast może jest zbyt mały i w ogóle znaków nie widać (kiedyś tak miałem). Kolejna rzecz jaka mi do głowy przychodzi to wpisać coś do LCD_GoTo(1,0); i LCD_GoTo(1,1); ponieważ może być zmieniona indeksacja linii. Trzecia rzecz to pozbył bym się z Twojego programu póki co LCD_Clear(); - ponieważ jak masz źle dobrane wartości taktowania i opóźnienia to możesz nie zauważyć znaku który między czasie został już skasowany. Tyle mi przyszło na myśl póki co pozdrawiam!
  • #10 7515696
    corranh
    Poziom 10  
    golas17 - mam definiowana wartosc oscylatora (1MHz) oraz dolaczam delay.h
    Probowalem dodac do CGRAM-u wlasny znak i wyswietlic go nastepujaca sekwencja:
    	LCD_WriteCommand(64);     //Pamiec CG adres 000000
    	LCD_WriteData(3);     //Pierwszy wiersz
    	LCD_WriteData(3);     //Drugi itd.
    	LCD_WriteData(3);
    	LCD_WriteData(3);
    	LCD_WriteData(3);
    	LCD_WriteData(3);
    	LCD_WriteData(3);
    	LCD_WriteData(0);     //Ostatni (miejsce na kursor)
    	LCD_WriteCommand(128);     //Pamiec DD adres 0000000
    	LCD_WriteData(0);     //Pierwszy znak z CG

    I mimo to nie chce wyswietlic znaku (ale kursor sie przesowa)

    Vatras - gdyby kontrast byl za maly to nie widoczny by byl kursor tez (ale dla pewnosci pozmienialem go, niestety bez skutku).

    Probowalem wpisywac GoTo tez nie pomoglo niestety.

    Moze problem jest w inicjalizacji? Wyglada ona u mnie tak:
    (...) //ustawianie portow oraz wlaczenie 4-bitowego trybu
    
    LCD_WriteCommand(HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_ONE_LINE | HD44780_4_BIT); // 32
    LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF); // 8
    LCD_WriteCommand(HD44780_CLEAR); // 1
    LCD_WriteCommand(HD44780_ENTRY_MODE | HD44780_EM_INCREMENT | HD44780_EM_SHIFT_DISPLAY);// 7
    LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_ON | HD44780_CURSOR_NOBLINK); // 12
  • #11 7516377
    golas17
    Poziom 16  
    Zobacz sobie bibliotekę Petera Fleury. Wyciąłem te pliki z jednego z moich małych projektów dlatego znajdziesz w nich dodatkowe funkcje do wstawiania własnych znaków oraz zdefiniowane już wartości XTAL (częstotliowość taktowania) i linie sterujące.
    Funkcja inicjalizująca: lcd_init(LCD_DISP_ON);
    Funkcja wyświetlająca napis: lcd_puts("napis");
    W pliku lcd.h zdefiniuj wartość XTAL oraz odpowiednie piny sterujące i linie danych a także czy to ma być tryb 8-bit czy 4-bit. Miałem problem z tą biblioteką, kiedy próbowałem linie danych "rozrzucić" na różne porty, dlatego zalecam podłączenie do jednego portu i najlepiej kolejne piny. Wtedy działa bez problemu.
REKLAMA