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

Attiny2313 LCD [C] brak wyświetlania.

archaniol40 08 Sty 2012 19:27 2023 5
  • #1 10368762
    archaniol40
    Poziom 21  
    Witam wszystkich. Proszę o pomoc, na wyświetlaczu 2X16 nie wyświetla mi się nic. Użyłem biblioteki ze strony radzia. Tryb 4 bitowy z odczytem flagi, niestety avr studio kompiluje wszystko, nie ma błędów, a mimo to układ nie działa poprawnie. Korzystam z płytki z oślej łączki ZL11AVR. Pod bascomem układ wyświetla. Proszę o pomoc.

    Plik główny.
    
    #include <avr/io.h>
    #include "HD44780.h"
    #define F_CPU 4000000UL
     
    int main()
    {
    	LCD_Initalize();
    	LCD_WriteData('T');
    	_delay_ms(100);
    	LCD_Clear();
    	LCD_Initalize();
    	LCD_WriteData('TM');
    	_delay_ms(100);
    
     
    
    	while(1);
     
    }
    
     
    }


    Plik .h
    
    
    //-------------------------------------------------------------------------------------------------
    // 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>
    #define F_CPU 4000000UL
    
    //-------------------------------------------------------------------------------------------------
    //
    // Konfiguracja sygnałów sterujących wyświetlaczem.
    // Można zmienić stosownie do potrzeb.
    //
    //-------------------------------------------------------------------------------------------------
    #define LCD_RS_DIR		DDRB
    #define LCD_RS_PORT 	PORTB
    #define LCD_RS_PIN		PINB
    #define LCD_RS			(1 << PB2)
    
    #define LCD_RW_DIR		DDRB
    #define LCD_RW_PORT		PORTB
    #define LCD_RW_PIN		PINB
    #define LCD_RW			(1 << PB3)
    
    #define LCD_E_DIR		DDRB
    #define LCD_E_PORT		PORTB
    #define LCD_E_PIN		PINB
    #define LCD_E			(1 << PB1)
    
    #define LCD_DB4_DIR		DDRB
    #define LCD_DB4_PORT	PORTB
    #define LCD_DB4_PIN		PINB
    #define LCD_DB4			(1 << PB4)
    
    #define LCD_DB5_DIR		DDRB
    #define LCD_DB5_PORT	PORTB
    #define LCD_DB5_PIN		PINB
    #define LCD_DB5			(1 << PB5)
    
    #define LCD_DB6_DIR		DDRB
    #define LCD_DB6_PORT	PORTB
    #define LCD_DB6_PIN		PINB
    #define LCD_DB6			(1 << PB6)
    
    #define LCD_DB7_DIR		DDRB
    #define LCD_DB7_PORT	PORTB
    #define LCD_DB7_PIN		PINB
    #define LCD_DB7			(1 << PB7)
    
    //-------------------------------------------------------------------------------------------------
    //
    // 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);
    
    //-------------------------------------------------------------------------------------------------
    //
    // Koniec pliku HD44780.h
    //
    //-------------------------------------------------------------------------------------------------
    
    


    Plik .c
    
    
    //-------------------------------------------------------------------------------------------------
    // 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.c	
    // Mikrokontroler : Atmel AVR
    // Kompilator : avr-gcc
    // Autor : Radosław Kwiecień
    // Źródło : http://radzio.dxp.pl/hd44780/
    // Data : 24.03.2007
    //-------------------------------------------------------------------------------------------------
    
    #include "HD44780.h"
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja wystawiająca półbajt na magistralę danych
    //
    //-------------------------------------------------------------------------------------------------
    void _LCD_OutNibble(unsigned char nibbleToWrite)
    {
    
    if(nibbleToWrite & 0x01)
    	LCD_DB4_PORT |= LCD_DB4;
    else
    	LCD_DB4_PORT  &= ~LCD_DB4;
    
    if(nibbleToWrite & 0x02)
    	LCD_DB5_PORT |= LCD_DB5;
    else
    	LCD_DB5_PORT  &= ~LCD_DB5;
    
    if(nibbleToWrite & 0x04)
    	LCD_DB6_PORT |= LCD_DB6;
    else
    	LCD_DB6_PORT  &= ~LCD_DB6;
    
    if(nibbleToWrite & 0x08)
    	LCD_DB7_PORT |= LCD_DB7;
    else
    	LCD_DB7_PORT  &= ~LCD_DB7;
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja wystawiająca półbajt na magistralę danych
    //
    //-------------------------------------------------------------------------------------------------
    unsigned char _LCD_InNibble(void)
    {
    unsigned char tmp = 0;
    
    if(LCD_DB4_PIN & LCD_DB4)
    	tmp |= (1 << 0);
    if(LCD_DB5_PIN & LCD_DB5)
    	tmp |= (1 << 1);
    if(LCD_DB6_PIN & LCD_DB6)
    	tmp |= (1 << 2);
    if(LCD_DB7_PIN & LCD_DB7)
    	tmp |= (1 << 3);
    return tmp;
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja zapisu bajtu do wyświetacza (bez rozróżnienia instrukcja/dane).
    //
    //-------------------------------------------------------------------------------------------------
    void _LCD_Write(unsigned char dataToWrite)
    {
    LCD_DB4_DIR |= LCD_DB4;
    LCD_DB5_DIR |= LCD_DB5;
    LCD_DB6_DIR |= LCD_DB6;
    LCD_DB7_DIR |= LCD_DB7;
    
    LCD_RW_PORT &= ~LCD_RW;
    LCD_E_PORT |= LCD_E;
    _LCD_OutNibble(dataToWrite >> 4);
    LCD_E_PORT &= ~LCD_E;
    LCD_E_PORT |= LCD_E;
    _LCD_OutNibble(dataToWrite);
    LCD_E_PORT &= ~LCD_E;
    while(LCD_ReadStatus()&0x80);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja odczytu bajtu z wyświetacza (bez rozróżnienia instrukcja/dane).
    //
    //-------------------------------------------------------------------------------------------------
    
    unsigned char _LCD_Read(void)
    {
    unsigned char tmp = 0;
    LCD_DB4_DIR &= ~LCD_DB4;
    LCD_DB5_DIR &= ~LCD_DB5;
    LCD_DB6_DIR &= ~LCD_DB6;
    LCD_DB7_DIR &= ~LCD_DB7;
    
    LCD_RW_PORT |= LCD_RW;
    LCD_E_PORT |= LCD_E;
    tmp |= (_LCD_InNibble() << 4);
    LCD_E_PORT &= ~LCD_E;
    LCD_E_PORT |= LCD_E;
    tmp |= _LCD_InNibble();
    LCD_E_PORT &= ~LCD_E;
    return tmp;
    }
    
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja zapisu rozkazu do wyświetlacza
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_WriteCommand(unsigned char commandToWrite)
    {
    LCD_RS_PORT &= ~LCD_RS;
    _LCD_Write(commandToWrite);
    }
    
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja odczytu bajtu statusowego
    //
    //-------------------------------------------------------------------------------------------------
    unsigned char LCD_ReadStatus(void)
    {
    LCD_RS_PORT &= ~LCD_RS;
    return _LCD_Read();
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja zapisu danych do pamięci wyświetlacza
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_WriteData(unsigned char dataToWrite)
    {
    LCD_RS_PORT |= LCD_RS;
    _LCD_Write(dataToWrite);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja odczytu danych z pamięci wyświetlacza
    //
    //-------------------------------------------------------------------------------------------------
    unsigned char LCD_ReadData(void)
    {
    LCD_RS_PORT |= LCD_RS;
    return _LCD_Read();
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja wyświetlenia napisu na wyswietlaczu.
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_WriteText(char * text)
    {
    while(*text)
      LCD_WriteData(*text++);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja ustawienia współrzędnych ekranowych
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_GoTo(unsigned char x, unsigned char y)
    {
    LCD_WriteCommand(HD44780_DDRAM_SET | (x + (0x40 * y)));
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja czyszczenia ekranu wyświetlacza.
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_Clear(void)
    {
    LCD_WriteCommand(HD44780_CLEAR);
    _delay_ms(2);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja przywrócenia początkowych współrzędnych wyświetlacza.
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_Home(void)
    {
    LCD_WriteCommand(HD44780_HOME);
    _delay_ms(2);
    }
    //-------------------------------------------------------------------------------------------------
    //
    // Procedura inicjalizacji kontrolera HD44780.
    //
    //-------------------------------------------------------------------------------------------------
    void LCD_Initalize(void)
    {
    unsigned char i;
    LCD_DB4_DIR |= LCD_DB4; // Konfiguracja kierunku pracy wyprowadzeń
    LCD_DB5_DIR |= LCD_DB5; //
    LCD_DB6_DIR |= LCD_DB6; //
    LCD_DB7_DIR |= LCD_DB7; //
    LCD_E_DIR 	|= LCD_E;   //
    LCD_RS_DIR 	|= LCD_RS;  //
    LCD_RW_DIR 	|= LCD_RW;  //
    _delay_ms(15); // oczekiwanie na ustalibizowanie się napiecia zasilajacego
    LCD_RS_PORT &= ~LCD_RS; // wyzerowanie linii RS
    LCD_E_PORT &= ~LCD_E;  // wyzerowanie linii E
    LCD_RW_PORT &= ~LCD_RW;
    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
    
    _delay_ms(1); // czekaj 1ms 
    LCD_WriteCommand(HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_TWO_LINE | HD44780_4_BIT); // interfejs 4-bity, 2-linie, znak 5x7
    LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF); // wyłączenie wyswietlacza
    LCD_WriteCommand(HD44780_CLEAR); // czyszczenie zawartosći pamieci DDRAM
    LCD_WriteCommand(HD44780_ENTRY_MODE | HD44780_EM_SHIFT_CURSOR | HD44780_EM_INCREMENT);// inkrementaja adresu i przesuwanie kursora
    LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF | HD44780_CURSOR_NOBLINK); // włącz LCD, bez kursora i mrugania
    }
    
    //-------------------------------------------------------------------------------------------------
    //
    // Koniec pliku HD44780.c
    //
    //-------------------------------------------------------------------------------------------------
    
  • #2 10368909
    excray
    Poziom 41  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Coś Ci ta deklaracja nie wyszła. Niby ENA to PORTB a na koniec okazuje się że jednak PA1. Niby nie zmienia to funkcjonalności ale brzydko wygląda. Na schemacie:
    http://www.btc.pl/pdf/zl11avr.pdf
    widać że sygnał ENA jest podpięty pod PB1 albo PB3 w zależności od ustawienia zworki J3. Sprawdź jak ustawiona jest ta zworka u Ciebie.
  • #3 10369264
    archaniol40
    Poziom 21  
    Poprawiłem, pojawiła się litera T, ale ponowne wpisanie nowej watości nic nie daje, mruga tylko kursor na wyświetlaczu. Opcja resetu też nie pomaga.

    edit:
    Dopisałem wyżej, by nie zaśmiecać.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    To też nie działa. Może spróbuję z inną biblioteką.


    Dalej tylko kursor mruga.:(
  • #4 10369281
    excray
    Poziom 41  
    Załącz nowy kod.

    Dodano po 35 [minuty]:

    Czemu drugi raz inicjalizujesz? Inicjalizuje się tylko raz - po resecie.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodano po 36 [minuty]:

    Kolego nie edytuj postu tylko pisz kolejny bo już masło maślane i nie wiadomo co zrobiłeś wcześniej a co teraz. Załaduj kod który Ci podałem do procka. Wyłącz całą płytkę z zasilania. Włącz ponownie i powiedz co się dzieje.
  • #5 10373725
    archaniol40
    Poziom 21  
    Zmieniłem bibliotekę, pobrałem złą. Potrzebna była biblioteka bez odczytu flagi. Udało mi się uruchomić układ.
  • #6 10373788
    excray
    Poziom 41  
    archaniol40 napisał:
    Zmieniłem bibliotekę, pobrałem złą. Potrzebna była biblioteka bez odczytu flagi. Udało mi się uruchomić układ.

    Ta biblioteka w pierwszym pliku jest przecież bez sprawdzania flagi zajętości...?
REKLAMA