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

[Rozwiązano] Błąd niedefiniowane funkcje przy własnej bibliotece AVR i wyświetlaczu

Scyś 24 Mar 2020 20:27 720 6
  • #1 18557502
    Scyś
    Poziom 3  
    Witam
    Uczę się programowania avr, i próbuje napisać bibliotekę, do tego celu wykorzystuje wyświetlacz 7 segmentowy 4 cyfrowy.
    stworzyłem 2 pliki, jeden z rozszerzeniem .h drugi .c.
    Na próbę napisałem 2 funkcje jedna oczywiście ustawia piny portu, druga po kolei zapala poszczególne segmenty.
    Kiedy dołączę bibliotekę do głównego programu podczas kompilacji pojawia się błąd że te funkcje są niezdefiniowane.
    Co robię źle, albo czego brakuje?
    W załączniku przesyłam pliki tej biblioteki.
    a w programie głównym funkcje wywołuje np;
    TEST();
  • Pomocny post
    #2 18557536
    tmf
    VIP Zasłużony dla elektroda
    Dołączasz do głównego programu, czyli masz jakiś plik np. main w projekcie. A dołączyłeś do tego projektu plik c zawierający kod twojej "biblioteki"? Pewnie nie, stąd info o braku definicji (btw, wklejaj wyjścia z kompilatora, to ułatwia pomaganie).
    Czyli wiesz już, że musisz załączyć plik c, oprócz nagłówka. No chyba, że skompilujesz to jako prawdziwą bibliotekę i otrzymasz plik .lib, który i tak musisz dołączyć, wskazując go linkerowi.
    Co do twojego pliku nagłówkowego:
    - nie definuj zmiennych globalnych w nagłówkach. Użyj tam extern, a definicje umieść w pliku c.
    - nie masz guarda - sekwencji #ifndef/#endif - która zapobiega przed błędami w przypadku wielokrotnego włączania pliku h, co zdarza się często.
  • #3 18557687
    Scyś
    Poziom 3  
    Dzięki racja wystarczyło tylko dodać
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    i wszystko śmiga, przeniosłem też zmienne do .c.
    ale mam jeszcze jedno pytanko czysto teoretyczne.
    Czy w pliku .h muszę definiować prędkość taktowania procesora jeżeli w bibliotece są używane opóźnienia, czy wystarczy, że zrobi to w pliku główny?
  • #4 18592773
    Scyś
    Poziom 3  
    Zamykam.
    Rozwiązany jak wyżej.
  • #5 18594596
    tmf
    VIP Zasłużony dla elektroda
    Scyś napisał:
    Dzięki racja wystarczyło tylko dodać

    Nie należy robić tak jak zrobiłeś. Dyrektywa include służy do dołączania plików nagłówkowych, a nie plików c. To co zrobiłeś, być może ci zadziałało, ale jest błędne. Plik c należy dodać do projektu, tak aby był z nim kompilowany.
    Scyś napisał:
    Czy w pliku .h muszę definiować prędkość taktowania procesora jeżeli w bibliotece są używane opóźnienia, czy wystarczy, że zrobi to w pliku główny?

    Nie. Symbol F_CPU powinien zostać zdefiniowany w opcjach projektu, nigdy nie w plikach języka c.
  • #6 18841267
    Scyś
    Poziom 3  
    Mam takiego makefila

    #Main application file name
    MAIN_APP = Zegar
    #Main hex file path in windows format
    MAIN_HEX_PATH = D:\AVR\Projekty\Zegar\$(MAIN_APP).hex

    # Compiler and other Section
    CC = avr-gcc
    OBJCOPY = avr-objcopy.exe
    AVRDUDE := avrdude

    #Options for avr-gcc
    CFLAGS = -g -Os -o

    #Linking options for avr-gcc
    LFLAGS = -Os -mmcu=atmega8 -o

    #Options for HEX file generation
    HFLAGS = -j .text -j .data -O ihex

    #Options for avrdude to burn the hex file
    #MMCU model here according to avrdude options
    DUDEFLAGS = -c
    DUDEFLAGS += usbasp
    DUDEFLAGS += -p
    DUDEFLAGS += m8
    DUDEFLAGS += -P
    DUDEFLAGS += COM3
    DUDEFLAGS += -b
    DUDEFLAGS += 19200
    DUDEFLAGS += -U flash:w:$(MAIN_HEX_PATH):i

    # Sources files needed for building the application
    SRC = $(MAIN_APP).c
    SRC +=

    # The headers files needed for building the application
    INCLUDE = -I.
    INCLUDE +=

    # commands Section
    Burn : Build
    $(AVRDUDE) $(DUDEFLAGS)

    Build : $(MAIN_APP).elf
    $(OBJCOPY) $(HFLAGS) $< $(MAIN_APP).hex

    $(MAIN_APP).elf: $(MAIN_APP).o
    $(CC) $(SRC) $(INCLUDE) $(LFLAGS) $@

    $(MAIN_APP).o:$(SRC)
    $(CC) $^ $(INCLUDE) $(CFLAGS) $@

    i chcę dodać dwa pliki LCD.h i LCD.c.
    Oczywiście LCD.h inkluduje w programie głównym.
    Natomiast nie wiem za bardzo gdzie dodać LCD.c.
    próbowałem przy SRC i program się kompiluje natomiast nie działa.
    Gdzie to dodać? Ewentualnie czy manie jakiś "lepszy" makefile?
    Sorry że bez SYNTAX ale po prostu nie wiem który dać :)
  • #7 18841408
    Scyś
    Poziom 3  
    Mam takiego makefila

    #Main application file name
    MAIN_APP = Zegar
    #Main hex file path in windows format
    MAIN_HEX_PATH = D:\AVR\Projekty\Zegar\$(MAIN_APP).hex

    # Compiler and other Section
    CC = avr-gcc
    OBJCOPY = avr-objcopy.exe
    AVRDUDE := avrdude

    #Options for avr-gcc
    CFLAGS = -g -Os -o

    #Linking options for avr-gcc
    LFLAGS = -Os -mmcu=atmega8 -o

    #Options for HEX file generation
    HFLAGS = -j .text -j .data -O ihex

    #Options for avrdude to burn the hex file
    #MMCU model here according to avrdude options
    DUDEFLAGS = -c
    DUDEFLAGS += usbasp
    DUDEFLAGS += -p
    DUDEFLAGS += m8
    DUDEFLAGS += -P
    DUDEFLAGS += COM3
    DUDEFLAGS += -b
    DUDEFLAGS += 19200
    DUDEFLAGS += -U flash:w:$(MAIN_HEX_PATH):i

    # Sources files needed for building the application
    SRC = $(MAIN_APP).c
    SRC +=

    # The headers files needed for building the application
    INCLUDE = -I.
    INCLUDE +=

    # commands Section
    Burn : Build
    $(AVRDUDE) $(DUDEFLAGS)

    Build : $(MAIN_APP).elf
    $(OBJCOPY) $(HFLAGS) $< $(MAIN_APP).hex

    $(MAIN_APP).elf: $(MAIN_APP).o
    $(CC) $(SRC) $(INCLUDE) $(LFLAGS) $@

    $(MAIN_APP).o:$(SRC)
    $(CC) $^ $(INCLUDE) $(CFLAGS) $@

    i chcę dodać dwa pliki LCD.h i LCD.c.
    Oczywiście LCD.h inkluduje w programie głównym.
    Natomiast nie wiem za bardzo gdzie dodać LCD.c.
    próbowałem przy SRC i program się kompiluje natomiast nie działa.
    Gdzie to dodać? Ewentualnie czy manie jakiś "lepszy" makefile?
    Sorry że bez SYNTAX ale po prostu nie wiem który dać :)

    Dodano po 1 [godziny] 29 [minuty]:

    Zamykam!
    Mój błąd zmieniłem podłączone piny wyświetlacza i o tym zapomniałem to sprawił że nie działało.
    Po Ponownym zdefiniowaniu pinów wszystko działa.
REKLAMA