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

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

krzysin 07 Sty 2010 17:37 4337 6
  • #1 7499726
    krzysin
    Poziom 14  
    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:
    
    //-------------------------------------------------------------------------------------------------
    
    // 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:
    
    #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.
    }
  • Pomocny post
    #2 7499782
    Szucio
    Poziom 14  
    Witam,

    Proponuję do sprawdzania wpisać w funkcji main:

    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
  • Pomocny post
    #3 7499891
    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:
    
    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 ;)
  • #4 7500099
    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
  • #5 7500626
    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
  • #6 7500747
    krzysin
    Poziom 14  
    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 ;]
  • #7 7500789
    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
REKLAMA