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

WinAVR i undefined reference

Mateusz.K 13 Sie 2009 14:32 3513 19
REKLAMA
  • #1 6888823
    Mateusz.K
    Poziom 10  
    Witam.

    Czy byłby ktoś w stanie pomóc mi z nastepującym problemem. Mianowicie podczas kompilacji najprostszego programu do wyświetlanie napisu "hallo world" na wyświetlaczu LCD ze sterownikiem HD44780 pojawiają się błędy:

    undefined reference to `lcd_init'
    undefined reference to `lcd_home'
    undefined reference to `lcd_string2'

    Dodam że pliki nagłówkowe lcd.h zawierajace deklaracje tych funkcji dodałem do katalogu C:\WinAVR\avr\include\avr i C:\WinAVR\avr\include

    Jestem poczatkujący więc prosze o wyrozumiałość
  • REKLAMA
  • #2 6888855
    Loker
    Poziom 39  
    Dołączyłeś pliki nagłówkowe do programu (polecenie include)?
  • REKLAMA
  • #3 6888918
    flapo213
    Poziom 21  
    A jakiego makefile używasz, jeśli generycznego to dodaj tam plik C z obsługą tych lcd-ków.
  • #4 6891859
    Mateusz.K
    Poziom 10  
    Witam.

    Tak jak najbardziej dałem polecenie #include "lcd.h".
    Do tworzenie makefile używam programu w pakiecie WINAVR (Mfile). Jeżeli chodzi o jakąś modyfikacje w pliku makefile to naprawdę nie wiem o co chodzi.

    Pozdrawiam
  • #5 6891914
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Poza nagłówkami jest jeszcze coś takiego jak KOD, który trzeba też dołączyć do projektu. Pozatym te nagłówki nie powinny być w "systemowym" folderze WinAVR tylko po prostu w katalogu projektu.

    4\/3!!
  • #7 6892089
    Mateusz.K
    Poziom 10  
    Tak dodałem pliki nagłówkowe również do katalogu z projektem i nie pomogło ;/ o co chodzi z tym KODem ?

    z linkera
    
    #include "lcd.h"
    int main()
    {
    	int i=0;
    	lcd_init();
    	while(1)
    	{
    		i = (i+1)%10;
    		lcd_home();
    		lcd_string2("Hello World!",i);
    		for (int i=0;i<10;i++) 
    		_auxDelay(1000000);
    
    	}
    	return 0;
    }
  • #8 6892109
    Mat_91
    Poziom 25  
    Chodzi o to, że oprócz plików *.h musisz mieć jeszcze pliki *.c dodane do projektu i znajdujące się w katalogu projektu. KOD jest właśnie w plikach *.c
  • #9 6892155
    Mateusz.K
    Poziom 10  
    nie wiem dokładnie o co chodzi. Stworzyłem nowy projekt dodałem do niego plik ldc.c z kodem programu i plik nagłówkowy lcd.h. Wykonałem polecenie Make All i nadal to samo.

    Ktoś mógłby mi po kolei wytłumaczyć co należałoby zrobić? Będę wdzięczny.
  • REKLAMA
  • #11 6892257
    flapo213
    Poziom 21  
    Ok zrób tak, zamiast używać opcji kompiluj w WINAVR, wpisz w windowsie cmd i przejdź do katalogu twojego projektu i do miejsca gdzie jest ów makefile i wpisz poprostu make bądź make all i zamieś to co Ci wyświetli na forum. Pozdrawiam

    PS. Zrób jak prosi użytkownik D.D. tylko dobrze to zrób bo się wysypie wsio i nic już nie będziesz wiedział ;)


    Odszukaj w programie mfile linijkę

    # List C source files here. (C dependencies are automatically generated.)
    SRC = $(TARGET).c

    i dodaj SRC += lcd.c

    Naturalnie wcześniej odblokuj plik do modyfikacji.
  • REKLAMA
  • #12 6892309
    Mateusz.K
    Poziom 10  
    # List C source files here. (C dependencies are automatically generated.)
    SRC += lcd.c


    dodałem i nadal te same błędy.

    //  ATMega8 LCD Driver
    //
    //  (C) 2009 Radu Motisan , radu.motisan@gmail.com
    //  www.pocketmagic.net
    //  All rights reserved.
    //
    //  lcd.h: Definitions for LCD command instructions
    //  The constants define the various LCD controller instructions which can be passed to the 
    //  function lcd_command(), see HD44780 data sheet for a complete description.
    
    #include <avr/io.h> 
    
    // CONFIGURATION, EDIT THIS CAREFULLY
    #define XTAL 8000000           			// clock frequency in Hz, used to calculate delay timer 
    
    #define LCD_PORT         PORTC       	// port for the LCD lines   
    #define LCD_DATA0_PORT   LCD_PORT     	// port for 4bit data bit 0 
    #define LCD_DATA1_PORT   LCD_PORT     	// port for 4bit data bit 1 
    #define LCD_DATA2_PORT   LCD_PORT     	// port for 4bit data bit 2 
    #define LCD_DATA3_PORT   LCD_PORT     	// port for 4bit data bit 3 
    #define LCD_DATA0_PIN    4            	// pin for 4bit data bit 0  
    #define LCD_DATA1_PIN    5            	// pin for 4bit data bit 1  
    #define LCD_DATA2_PIN    6            	// pin for 4bit data bit 2  
    #define LCD_DATA3_PIN    7            	// pin for 4bit data bit 3  
    #define LCD_RS_PORT      LCD_PORT     	// port for RS line         
    #define LCD_RS_PIN       2            	// pin  for RS line         
    //#define LCD_RW_PORT      LCD_PORT     // port for RW line UNUSED - we only WRITE
    //#define LCD_RW_PIN       5            // pin  for RW line UNUSED - we only WRITE
    #define LCD_E_PORT       LCD_PORT     	// port for Enable line     
    #define LCD_E_PIN        3            	// pin  for Enable line     
    #define LCD_LINES		 2				// number of visible lines of the display
    #define LCD_DISP_LENGTH  16     		// visibles characters per line of the display 
    // configuration end.
    
    // instruction register bit positions, see HD44780U data sheet 
    #define LCD_CLR               	0x0    	// DB0: clear display                  
    #define LCD_HOME              	0x1    	// DB1: return to home position        
    #define LCD_ENTRY_MODE        	0x2     // DB2: set entry mode                 
    #define LCD_ENTRY_INC         	0x1     // DB1: 1=increment, 0=decrement     
    #define LCD_ENTRY_SHIFT       	0x0     // DB2: 1=display shift on           
    #define LCD_ON                	0x3     // DB3: turn lcd/cursor on             
    #define LCD_ON_DISPLAY        	0x2     // DB2: turn display on              
    #define LCD_ON_CURSOR         	0x1     // DB1: turn cursor on               
    #define LCD_ON_BLINK          	0x0     // DB0: blinking cursor ?          
    #define LCD_MOVE              	0x4     // DB4: move cursor/display            
    #define LCD_MOVE_DISP         	0x3     // DB3: move display (0-> cursor) ?  
    #define LCD_MOVE_RIGHT        	0x2     // DB2: move right (0-> left) ?      
    #define LCD_FUNCTION          	0x5     // DB5: function set                   
    #define LCD_FUNCTION_8BIT     	0x4     // DB4: set 8BIT mode (0->4BIT mode) 
    #define LCD_FUNCTION_2LINES   	0x3     // DB3: two lines (0->one line)      
    #define LCD_FUNCTION_10DOTS   	0x2     // DB2: 5x10 font (0->5x7 font)      
    #define LCD_CGRAM             	0x6     // DB6: set CG RAM address             
    #define LCD_DDRAM             	0x7     // DB7: set DD RAM address             
    #define LCD_BUSY              	0x7     // DB7: LCD is busy                    
    
    // set entry mode: display shift on/off, dec/inc cursor move direction 
    #define LCD_ENTRY_DEC            0x04	// display shift off, dec cursor move dir 
    #define LCD_ENTRY_DEC_SHIFT      0x05   // display shift on,  dec cursor move dir 
    #define LCD_ENTRY_INC_           0x06   // display shift off, inc cursor move dir 
    #define LCD_ENTRY_INC_SHIFT      0x07   // display shift on,  inc cursor move dir 
    
    // display on/off, cursor on/off, blinking char at cursor position 
    #define LCD_DISP_OFF             0x08   // display off                            
    #define LCD_DISP_ON              0x0C   // display on, cursor off                 
    #define LCD_DISP_ON_BLINK        0x0D   // display on, cursor off, blink char     
    #define LCD_DISP_ON_CURSOR       0x0E   // display on, cursor on                  
    #define LCD_DISP_ON_CURSOR_BLINK 0x0F   // display on, cursor on, blink char      
    
    // move cursor/shift display 
    #define LCD_MOVE_CURSOR_LEFT     0x10   // move cursor left  (decrement)          
    #define LCD_MOVE_CURSOR_RIGHT    0x14   // move cursor right (increment)          
    #define LCD_MOVE_DISP_LEFT       0x18   // shift display left                     
    #define LCD_MOVE_DISP_RIGHT      0x1C   // shift display right                    
    
    // function set: set interface data length and number of display lines 
    #define LCD_FUNCTION_4BIT_1LINE  0x20   // 4-bit interface, single line, 5x7 dots 
    #define LCD_FUNCTION_4BIT_2LINES 0x28   // 4-bit interface, dual line,   5x7 dots 
    #define LCD_FUNCTION_8BIT_1LINE  0x30   // 8-bit interface, single line, 5x7 dots 
    #define LCD_FUNCTION_8BIT_2LINES 0x38   // 8-bit interface, dual line,   5x7 dots 
    
    #define LCD_START_LINE1  		 0x00   // DDRAM address of first char of line 1 
    #define LCD_START_LINE2  		 0x40   // DDRAM address of first char of line 2 
    #define LCD_START_LINE3  		 0x14   // DDRAM address of first char of line 3 
    #define LCD_START_LINE4  		 0x54   // DDRAM address of first char of line 4 
    
    //
    #define LCD_MODE_DEFAULT     ((1<<LCD_ENTRY_MODE) | (1<<LCD_ENTRY_INC) )
    
    
    // --- LCD Utils
    // functional macros
    #define lcd_e_delay()   __asm__ __volatile__( "rjmp 1f\n 1:" );
    #define lcd_e_high()    LCD_E_PORT  |=  _BV(LCD_E_PIN);
    #define lcd_e_low()     LCD_E_PORT  &= ~_BV(LCD_E_PIN);
    #define lcd_e_toggle()  _auxToggleE()
    #define lcd_rs_high()   LCD_RS_PORT |=  _BV(LCD_RS_PIN)
    #define lcd_rs_low()    LCD_RS_PORT &= ~_BV(LCD_RS_PIN)
    // address of data direction register of port x
    #define DDR(x) (*(&x - 1))      
    
    
    // --- Forward functions
    
    //-----------------------------------------------------------------------------------------
    // FUNCTION: _auxDelayFourCyc
    // PURPOSE: delay loop for small accurate delays: 16-bit counter, 4 cycles/loop
    void _auxDelayFourCyc(unsigned long nCount);
    
    //-----------------------------------------------------------------------------------------
    // FUNCTION: _auxDelay
    // PURPOSE: computed for 4Mhz, does a 1uS delay
    void _auxDelay(unsigned long us);
    
    //-----------------------------------------------------------------------------------------
    // FUNCTION: _auxToggleE
    // PURPOSE: flush channel E
    void _auxToggleE(void);
    
    //-----------------------------------------------------------------------------------------
    // FUNCTION: lcd_write
    // PURPOSE: send a character or an instruction to the LCD
    void lcd_write(uint8_t data,uint8_t rs) ;
    
    //-----------------------------------------------------------------------------------------
    // FUNCTION: lcd_instr
    // PURPOSE:  send an instruction to the LCD
    void lcd_instr(uint8_t instr);
    
    //-----------------------------------------------------------------------------------------
    // FUNCTION: lcd_char
    // PURPOSE:  send a character to the LCD
    void lcd_char(uint8_t data);
    
    //-----------------------------------------------------------------------------------------
    // FUNCTION: lcd_init
    // PURPOSE:  Initialize LCD to 4 bit I/O mode
    void lcd_init();
    
    //-----------------------------------------------------------------------------------------
    // FUNCTION: lcd_newline
    // PURPOSE:  Move cursor on specified line
    void lcd_setline(uint8_t line);
    
    extern int g_nCurrentLine;
    
    //-----------------------------------------------------------------------------------------
    // FUNCTION: lcd_string
    // PURPOSE:  send a null terminated string to the LCD eg. char x[10]="hello!";
    void lcd_string(char *text);
    void lcd_string2(char *szFormat, ...);
    
    //-----------------------------------------------------------------------------------------
    // FUNCTION: lcd_gotoxy
    // PURPOSE:  Set cursor to specified position
    //           Input:    x  horizontal position  (0: left most position)
    //                     y  vertical position    (0: first line)
    void lcd_gotoxy(uint8_t x, uint8_t y);
    
    //-----------------------------------------------------------------------------------------
    // FUNCTION: lcd_clrscr
    // PURPOSE:  Clear display and set cursor to home position
    void lcd_clrscr(void);
    
    //-----------------------------------------------------------------------------------------
    // FUNCTION: lcd_home
    // PURPOSE:  Set cursor to home position
    void lcd_home(void);


    A tak wygląda plik lcd.h
  • #13 6892543
    tmf
    VIP Zasłużony dla elektroda
    A ten plik lcd.c jest kompilowany? Powstaje odpowiedni plik lcd.o ?
    Jak piszesz masz te bledy z linkera, czyli linker nie moze znalezc odpowiedniego skompilowanego pliku .c zawierajacego implementacje wymienionych funkcji.
    Taka mam mala propozycje - moze bedzie ci prosciej zamiast bawic sie w makefile to zainstaluj AVR Studio i tam stworz projekt dodajac do niego wszystkie wymagane pliki c. AVR Studio automatycznie ci wygeneruje makefile i wszystko powinno bez problemu ruszyc.
  • #14 6892577
    Mateusz.K
    Poziom 10  
    tak powstaje plik lcd.o

    Linking: lcd.elf
    avr-gcc -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=lcd.o  -std=gnu99 -MMD -MP -MF .dep/lcd.elf.d lcd.o lcd.h --output lcd.elf -Wl,-Map=lcd.map,--cref     -lm
    lcd.h:139: warning: function declaration isn't a prototype
    lcd.o: In function `main':


    i oczywiście pod tym komunikatem pojawiaja się undefined reference

    Dodano po 11 [minuty]:

    Może ma ktoś jakiś przykładowy program typu Hello world do LCD i atmega8 ? i podesłałby mi przynajmniej plik nagłówkowy albo jakieś wskazówki jak napisać taki programik?

    Z góry dzięki.

    Dodam że przykładowy program pobrałem ze strony:
    http://www.pocketmagic.net/?p=447
  • #15 6892763
    tmf
    VIP Zasłużony dla elektroda
    Powiedz mi, ten plik lcd.c zawiera definicje brakujacych funkcji? Tych, ktorych nazwy pojawiaja sie jako undefined reference?
  • Pomocny post
    #16 6892790
    d.d
    Poziom 20  
    Mateusz.K napisał:
    Dodam że przykładowy program pobrałem ze strony:
    http://www.pocketmagic.net/?p=447


    Mi ten program się kompiluje bez najmniejszego problemu .
    Jak rozpakujesz archiwum to nie przenoś żadnych plików po prostu skompiluj program tak jak jest i wszystko będzie działać .
  • #17 6892891
    Mateusz.K
    Poziom 10  
    WOW !!

    no nie wierzę! Faktycznie skopiowałem całkowicie projekt i działa, zmieniłem tylko deklaracje z portów C na D i działa wszystko ! Jak to możliwe że u mnie nie chciało ruszyć ?? Zna ktoś wytłumaczenie? Bardzo dziękuje użytkownikowi d.d !!

    Pozdrawiam
  • #19 6893669
    Mateusz.K
    Poziom 10  
    A mógłbyś napisać jak taki kod dodać żeby to działało??

    Dodano po 1 [godziny] 11 [minuty]:

    Chciałbym opisać rozwiązanie mojego problemu okazało się banalne. Ale może komuś się przyda w przyszłości.

    W powyższych postach jest link do strony z której można pobrać bibliotekę.

    Nie wystarczyło dodać pliku nagłówkowego lcd.h z deklaracjami funkcji do katalogu C:\WinAVR\avr\include należało również wkleić tam plik lcd.c który zawiera definicje funkcji. Należy również pamiętać o tym, że nie można nazywać pliku z projektem tak samo jak nazwa tej biblioteki w tym przypadku lcd.c(ja zmieniłem nazwę na LDC.c). Rozwiązanie okazało się proste ale sam bym sobie nie poradził, dlatego chciałem wszystkim SERDECZNIE PODZIĘKOWAĆ!

    POZDRAWIAM
REKLAMA