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.

[atmega8][c]LCD wyświetla same kwadraty

krzysin 07 Sty 2010 17:37 3491 6
  • #1 07 Sty 2010 17:37
    krzysin
    Poziom 13  

    Około 2 miesięcy temu rozpocząłem przygodę z mikrokontrolerem atmega8, przyszedł czas na obsługę wyświetlacza LCD, niestety zaczęły się schody. Zakupiłem wyświetlacz

    [atmega8][c]LCD wyświetla same kwadraty
    LCD 2x16
    tak się złożyło, że nie zapytałem sprzedawcy o dokumentację ;] a na podstawie nr nie mogę nic znaleźć na internecie. Dlatego proszę jeśli to możliwe o pomoc. Jeśli ktoś miał z tym wyświetlaczem do czynienia to może wie gdzie szukać dokumentacji.

    Do jego obsługi posłużyłem się biblioteką ze strony http://radzio.dxp.pl/,, po zmianie pinów w define wygląda następująco.
    Użyłem trybu 4bitowego, poszczególne piny zostały podpięte w następujący sposób:
    Vcc - usb 5V+
    Vo - GND
    RS - PC0 //PORTC
    E - PC1
    DB4 - PC2
    DB5 - PC3
    DB6 - PC4
    DB7 - PC5
    R/W - PB0 //PORTB

    Po skompilowaniu i wgraniu do mikrokontrolera na wyświetlaczu pojawia się ciąg kwadratów na obu wierszach. Nie mam pojęcia co może być tego przyczyną.
    Oczywiście jak podpinam wyświetlacz bez załadowanego programu w mikrokontrolerze to wyświetla się ciąg kwadratów tylko w jednej linii czyli z tego co rozumie uruchomił się poprawnie.

    biblioteka:

    Code:

    //-------------------------------------------------------------------------------------------------

    // Wyœwietlacz alfanumeryczny ze sterownikiem HD44780

    // Sterowanie w trybie 4-bitowym bez odczytu flagi zajętoœci

    // z dowolnym przypisaniem sygnałów sterujšcych

    // Plik : HD44780.h   

    // Mikrokontroler : Atmel AVR

    // Kompilator : avr-gcc

    // Autor : Radosław Kwiecień

    // �ródło : http://radzio.dxp.pl/hd44780/

    // Data : 24.03.2007

    //-------------------------------------------------------------------------------------------------

    #include <avr/io.h>

    #include <util/delay.h>

    //----------------------------------------------------------------------------------------------
    //
    // Konfiguracja sygnałów sterujšcych wyœwietlaczem.
    // Można zmienić stosownie do potrzeb.
    //
    //----------------------------------------------------------------------------------------------

    #define LCD_RS_DIR      DDRC

    #define LCD_RS_PORT    PORTC

    #define LCD_RS_PIN      PINC

    #define LCD_RS         (1 << PC0)







    #define LCD_RW_DIR      DDRB

    #define LCD_RW_PORT      PORTB

    #define LCD_RW_PIN      PINB

    #define LCD_RW         (1 << PB0)


    #define LCD_E_DIR      DDRC

    #define LCD_E_PORT      PORTC

    #define LCD_E_PIN      PINC

    #define LCD_E         (1 << PC1)


    #define LCD_DB4_DIR      DDRC

    #define LCD_DB4_PORT   PORTC

    #define LCD_DB4_PIN      PINC

    #define LCD_DB4         (1 << PC2)


    #define LCD_DB5_DIR      DDRC

    #define LCD_DB5_PORT   PORTC

    #define LCD_DB5_PIN      PINC

    #define LCD_DB5         (1 << PC3)


    #define LCD_DB6_DIR      DDRC

    #define LCD_DB6_PORT   PORTC

    #define LCD_DB6_PIN      PINC

    #define LCD_DB6         (1 << PC4)


    #define LCD_DB7_DIR      DDRC

    #define LCD_DB7_PORT   PORTC

    #define LCD_DB7_PIN      PINC

    #define LCD_DB7         (1 << PC5)


    //-------------------------------------------------------------------------------------------------

    //
    // Instrukcje kontrolera Hitachi HD44780
    //
    //-------------------------------------------------------------------------------------------------

    #define HD44780_CLEAR               0x01

    #define HD44780_HOME               0x02

    #define HD44780_ENTRY_MODE            0x04

       #define HD44780_EM_SHIFT_CURSOR      0

       #define HD44780_EM_SHIFT_DISPLAY   1

       #define HD44780_EM_DECREMENT      0

       #define HD44780_EM_INCREMENT      2


    #define HD44780_DISPLAY_ONOFF         0x08

       #define HD44780_DISPLAY_OFF         0

       #define HD44780_DISPLAY_ON         4

       #define HD44780_CURSOR_OFF         0

       #define HD44780_CURSOR_ON         2

       #define HD44780_CURSOR_NOBLINK      0

       #define HD44780_CURSOR_BLINK      1


    #define HD44780_DISPLAY_CURSOR_SHIFT   0x10

       #define HD44780_SHIFT_CURSOR      0

       #define HD44780_SHIFT_DISPLAY      8

       #define HD44780_SHIFT_LEFT         0

       #define HD44780_SHIFT_RIGHT         4


    #define HD44780_FUNCTION_SET         0x20

       #define HD44780_FONT5x7            0

       #define HD44780_FONT5x10         4

       #define HD44780_ONE_LINE         0

       #define HD44780_TWO_LINE         8

       #define HD44780_4_BIT            0

       #define HD44780_8_BIT            16


    #define HD44780_CGRAM_SET            0x40

    #define HD44780_DDRAM_SET            0x80

    //----------------------------------------------------------------------------------------------
    //
    // Deklaracje funkcji
    //
    //-------------------------------------------------------------------------------------------------

    void LCD_WriteCommand(unsigned char);

    unsigned char LCD_ReadStatus(void);

    void LCD_WriteData(unsigned char);

    unsigned char LCD_ReadData(void);

    void LCD_WriteText(char *);

    void LCD_GoTo(unsigned char, unsigned char);

    void LCD_Clear(void);

    void LCD_Home(void);

    void LCD_Initalize(void);

    void LCD_ProgrammChar(unsigned char nr, unsigned char znak[]);



    kod źródłowy programu:
    Code:

    #define F_CPU 1000000
       #include <avr/io.h>
        #include <avr/interrupt.h>
        #include <util/delay.h>
        #include "HD44780.c"

    int main(void)
    {

    LCD_Initalize();


    LCD_Clear();   //czyszczenie wyswietlacza

    LCD_WriteData(1); //wyswietlenie wlasnego znaku numer 1.
    }

    0 6
  • Pomocny post
    #2 07 Sty 2010 17:46
    Szucio
    Poziom 14  

    Witam,

    Proponuję do sprawdzania wpisać w funkcji main:

    Code:
    while(1){
    
    LCD_Initialize();
    LCD_Clear();
    LCD_Home();
    LCD_GoTo(0,0); // w sumie to jest chyba zbędne, ale nie chcę wprowadzić w błąd
    LCD_WriteText("test");
    _delay_ms(1000);
    }


    Bo w sumie jak chcesz odczytywać znak skoro nie zapisałeś go jeszcze?

    Jak to nie pomoże to problem raczej jest w podłączeniu wyświetlacza (sprawdź czy wszystko styka i czy żadne z przewodów się nie zwierają).

    Możesz spróbować skorzystać z biblioteki Radzia "Sterowanie w trybie 4-bitowym bez odczytu flagi zajętości z dowolnym przypisaniem linii sterujących", gdzie R/W podłączasz po prostu do masy.

    Też miałem podobny problem i chyba wynikał on ze źle podłączonymi kabelkami (sprawdź przejścia miernikiem - dzięki temu znalazłem błąd i zadziałało :D )

    Pozdrawiam

    0
  • Pomocny post
    #3 07 Sty 2010 18:04
    Cubaza
    Poziom 14  

    Poniekąd posłuchaj kolegi wyżej, poniekąd nie ;)
    Posłuchaj, kiedy pisze do Ciebie, że:

    Cytat:
    Też miałem podobny problem i chyba wynikał on ze źle podłączonymi kabelkami (sprawdź przejścia miernikiem - dzięki temu znalazłem błąd i zadziałało Very Happy )

    I tak, ze dwa trzy razy sprawdź dla pewności ;)


    A nie słuchaj kolegi w miejscu, którym pokazuje Ci program ;)
    Inicjalizację wykonujesz tylko i wyłącznie raz a nie za każdym razem. A wpisanie jej w pętli while(1) wykonuje ją cały czas.
    Ja bym ten program zrobił tak:
    Code:

    int main(void)
    {
      LCD_Initialize();
      LCD_Clear();
      LCD_Home();
      LCD_GoTo(0,0);
      // nie używam tej biblioteki, ale wydaje mi się, że LCD_home() i LCD_GoTo
      //w tym wypadku da to samo czyli ustawienie na (0,0);

         while(1){
         LCD_WriteText("test");
          }
      }

    Ten program Ci wyświetli tekst "test" na wyświetlaczu LCD. Takie w sam raz do testów :)


    Ten program co Ty podałeś na początku i go wykonujesz wyświetla własny znak z pamięci, a w programie nigdzie nie zapisałeś własnego znaku do pamięci. Spróbuj ten program co ja Ci podałem ;)

    0
  • #4 07 Sty 2010 18:33
    Szucio
    Poziom 14  

    Nic się nie stanie wyświetlaczowi jeśli będzie kilka razy inicjalizowany. Na końcu pętli w moim kodzie jest zatrzymanie programu na sekundę :!:

    Chodziło mi o to, że gdy odpali ten program to może poprawiać kabelki, bo co sekundę od nowa wyświetlacz będzie inicjalizowany, dzięki czemu będzie mógł łatwo wykryć błąd (błędy). Oczywiście zamiast bawienia się w inicjalizację co sekundę może skorzystać z programu kolegi wyżej za każdą próbą resetując uC.

    (to jest porada moja - żółtodzioba, bo sam zaczynałem zabawę z podobnym wyświetlaczem dwa tygodnie tamu i też wyświetlały mi się kwadraty w dwóch liniach).

    Tak ja robiłem i nic się nie stało, bo w sumie to nie miało prawa się coś stać (poza pomyślnym wyświetleniem napisu, które za którymś razem nastąpiło) :D

    0
  • #5 07 Sty 2010 19:45
    Cubaza
    Poziom 14  

    W sumie to nie myślałem o tym w ten sposób. Że ta sekunda jest po to aby poprawić coś w kabelkach i spróbować od początku ;) Jeśli o to naprawdę chodziło to zwracam honor :) I pamiętaj, że nie chciałem Cię urazić ani nic :)
    Pozdrawiam :D

    0
  • #6 07 Sty 2010 20:04
    krzysin
    Poziom 13  

    Serdeczne dzięki za pomoc, problem nie tyle z brakiem sygnału co ze źle podłączonym pinem. Mianowicie przez przypadek odłączył mi się pin 2 -VCC i wtedy pojawił się napis test.
    Wynika z tego że w tym typie CBC016002E29-YIY-R ma inaczej wyprowadzenia , niestety nadal nie mam dostępu do dokumentacji :cry:.
    Pozostaje wykorzystać piny podpięte w obecnej formie ;] czyli:
    pin1- GND
    pin2 - nie podpięte // normalnie w sterowniku kompatybilnym z HD44780 powinen być podpięty do VCC+
    pin3 Vo - GND

    pin4 RS - PC0 //PORTC
    pin5 R/W - PB0 //PORTB
    pin6 E - PC1

    pin11 DB4 - PC2
    pin12 DB5 - PC3
    ping13 DB6 - PC4
    pin 14 DB7 - PC5


    Wychodzi na to, że nie mam ani jednego pinu podpiętego do VCC+ a mimo to działa ;]

    0
  • #7 07 Sty 2010 20:10
    Szucio
    Poziom 14  

    @Cubaza: dzięki. Trochę pojechałeś po mnie, ale teraz rozumiesz o co mi chodziło :D

    No w przypadku mojego wyświetlacza : SS2M16ULGY-03 jest tak, że jak podepnę do drugiego pinu +5V to podświetlenie świeci i wyświetlacz działa, a jak nie podepnę to podświetlenia brak, ale wyświetlacz nadal działa. Jak skorzystam z tych pinów 15 i 16 i podepnę odpowiednio zasilanie to podświetlenie świeci jaśniej.

    Więc u mnie wyświetlacz też działa bez tego pinu VCC :)

    Pozdrawiam

    0