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

Atmega128 i LCD hd44780 2x16 Programuje się a nie wyświetla.

inspector_electro 11 Kwi 2011 21:19 4532 21
  • #1 9388957
    inspector_electro
    Poziom 22  
    Witam Panów.
    Prosiłbym o pomoc.
    Podkreślam, że jestem totalnym laikiem.
    Poczytałem trochę w internecie i udało mi się połączyć proca z stk200.

    Procesor to atmega128
    Programuję procesor różnymi wsadami ,ale nic mi lcd nie wyświetla a był podłączony4-ro bitowo tak jak na rysunku (nie mam pojęcia czy dobrze).
    Atmega128 i LCD hd44780 2x16 Programuje się a nie wyświetla.

    Po odpaleniu wygląda to tak
    Atmega128 i LCD hd44780 2x16 Programuje się a nie wyświetla.

    Czy dobrze rozumiem, że LCD podłącza się do Pinów proca w zależności od wsadu?
    I czy pliki do programowania wystarczą tylko z rozszerzeniem .HEX?
    Pytam ponieważ ISPprogrammer ma jeszcze eeprom i user sig;

    Proszę Was pomóżcie mi to w końcu zgrać w całość.
    Bardzo proszę.

    Pozdrawiam.
  • #2 9388991
    gts1991
    Użytkownik obserwowany
    Daj cały schemat nam. I źródło twojego wsadu.
  • #4 9389154
    inspector_electro
    Poziom 22  
    Ten kawałek schematu jest z jakiejś strony nie mogę jej odnalezć ,ale podam jak mam podpięty lcd do procesora ,a więc:

    lcd>d7 do pb3 procesora
    lcd>d6 do pb2 proc.
    lcd>d5 do pb1 proc.
    lcd>d4 do pb0 proc.
    lcd>rs do pd0 proc.
    lcd>rw do pd1 proc
    lcd>e do pd2 proc.
    No i oczy wiście wszystkie VCC+5v i gnd-
    Kwarc 8Mhz.
  • #6 9389250
    inspector_electro
    Poziom 22  
    Właśnie kurcze nie jestem nie mam pojęcia gdzie to się ustawia, a ja mam program trialowy DEV-c++.Próbowałem odpalać pliki testowe w tym programie które powodują wyświetlanie czegokolwiek na obojętnie którym podłączonym porcie i niestety nic:cry:
  • #10 9389979
    nsvinc
    Poziom 35  
    Wyświetlacz to nie rakieta.
    
    void _LCD_Write(unsigned char dataToWrite)
    {
    LCD_E_PORT |= LCD_E;
    _LCD_OutNibble(dataToWrite >> 4);
    _delay_us(5); //DELAY!!! DELAY!! DELAY!!
    LCD_E_PORT &= ~LCD_E;
    _delay_us(50); //DELAY!!! DELAY!! DELAY!!
    LCD_E_PORT |= LCD_E;
    _LCD_OutNibble(dataToWrite);
    _delay_us(5); //DELAY!!! DELAY!! DELAY!!
    LCD_E_PORT &= ~LCD_E;
    _delay_us(50);
    }
    


    Po raz setny napiszę, że dla wyświetlacza (zgodnego z) HD44780 nieużywane piny D3..D0 podłącza się do masy, a jeśli nie używasz odczytów, to pin R/W również trzeba na stałe podłączyć do masy
  • #11 9390035
    Konto nie istnieje
    Poziom 1  
  • #12 9390194
    inspector_electro
    Poziom 22  
    Po wpisaniu w programie tego co napisałeś mam takie wyniki:
    gcc.exe "C:\Documents and Settings\pink\Pulpit\HD44780.c" -o "C:\Documents and Settings\pink\Pulpit\HD44780.exe" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib"
    C:\Documents and Settings\pink\Pulpit\HD44780.c: In function `_LCD_Write':
    C:\Documents and Settings\pink\Pulpit\HD44780.c:3: error: `LCD_E_PORT' undeclared (first use in this function)
    C:\Documents and Settings\pink\Pulpit\HD44780.c:3: error: (Each undeclared identifier is reported only once
    C:\Documents and Settings\pink\Pulpit\HD44780.c:3: error: for each function it appears in.)
    C:\Documents and Settings\pink\Pulpit\HD44780.c:3: error: `LCD_E' undeclared (first use in this function)

    Wykonanie zakończone

    Używam polecenia kompiluj i uruchom teraz to już kompletnie zbaraniałem.
    D3 i D0 podłączone do masy , a reszta według rysunku wyżej.
  • #13 9390208
    dondu
    Moderator na urlopie...
    Nie masz zadeklarowanych dwóch zmiennych zmiennych: LCD_E_PORT oraz LCD_E

    Zobacz gdzie masz zadeklarowane na przykład:
    LCD_RS_PORT
    LCD_RS
    i tam poszukaj tych brakujących.

    Najlepiej wklej cały kod, ale nie jako załącznik tylko bezpośrednio w poście używając znaczników SYNTAX.
  • #16 9391012
    inspector_electro
    Poziom 22  
    jest coś takiego:
    
    /-------------------------------------------------------------------------------------------------
    // 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		DDRA
    #define LCD_RS_PORT 	PORTA
    #define LCD_RS			(1 << PA2)
    #define LCD_E_DIR		DDRA
    #define LCD_E_PORT		PORTA
    #define LCD_E			(1 << PA3)
    #define LCD_DB4_DIR		DDRA
    #define LCD_DB4_PORT	PORTA
    #define LCD_DB4			(1 << PA4)
    #define LCD_DB5_DIR		DDRA
    #define LCD_DB5_PORT	PORTA
    #define LCD_DB5			(1 << PA5)
    #define LCD_DB6_DIR		DDRA
    #define LCD_DB6_PORT	PORTA
    #define LCD_DB6			(1 << PA6)
    #define LCD_DB7_DIR		DDRA
    #define LCD_DB7_PORT	PORTA
    #define LCD_DB7			(1 << PA7)
    //-------------------------------------------------------------------------------------------------
    //
    // 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);
    void LCD_WriteData(unsigned char);
    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
    //
    //-------------------------------------------------------------------------------------------------
    Czyli według tego LCD_RS (1 << PA2) mam przylutować rs z lcd do niogi PA2 układu, dobrze rozumuję?
    nsvinc nie mam czegoś takiego, jak LCD_rs w programie.
    Jedyne co mam w zakładce KLASY to: (unsigned char data to write)
    Mam jeszcze takiego gotowca co mam pozmieniać aby u mnie to działalo?
    #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
    //
    //-------------------------------------------------------------------------------------------------
    

    Bo jak nacisnę zakladkę kompiluj i uruchom to, mam podświetloną na czerwono linijkę LCD_DB4_PORT |= LCD_DB4; i komunikat 23 C:\DOCUME~1\pink\USTAWI~1\Temp\Rar$DI01.344\HD44780.c `LCD_DB4_PORT' undeclared (first use in this function)

    Dodano po 3 [godziny] 4 [minuty]:

    Chłopaki żyjecie? help :cry:

    Proszę o umieszczenie kodu w znacznikach!
    Robak
  • #20 9401894
    inspector_electro
    Poziom 22  
    Dobrze ,postaram się ściągnąć program ,a na razie dziękuję i dobranoc.

    Te kody w c są pod Atmega644p czy będą działać na atmega128? (te z linku)
    I czy dobrze rozumiem, że jeden kod c to flash a drugi eeprom?
    Jeszcze jedno ,mam program ISP programmer i nie rozumiem czy trzeba wgrywać i eprom i flash? czy wystarczy sam flash w hexie?
REKLAMA