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

Jak zdefiniować F_CPU w bibliotece LED.h i LED.c dla AVR?

Adix3 08 Mar 2012 22:37 1530 8
  • #1 10652655
    Adix3
    Poziom 13  
    Witam.

    Zrobiłem własną "bibliotekę" składającą się z plków LED.h i LED.c

    I mam taki problem że w pliku głównym (z funkcją main) mam zdefiniowaną wartość F_CPU 8000000MHz. I teraz tak funkcja główna wygląda tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A plik LED.c wygląda tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Działa to tak że podłączone są dwie diody, najpierw miga ta z pętli głównej potem ta z funkcji LED.

    I jest taki problem że dioda z funkcji głównej miga co 1sek a ta z funkcji LED szybciej. Jak się okazało problem tkwi w tym że ta funkcja LED z pliku LED.c nie widzi deklaracji F_CPU w pliku main.c

    Jak to obejść?? tzn. jak zrobić aby w tym pliku LED. była widoczna deklaracja zegara??
  • Pomocny post
    #2 10652714
    janbernat
    Poziom 38  
    A w jakim IDE- czyli środowisku działasz?
    Ja bym radził w AVRStudio4 albo w eclipse.
    I w nich deklarujesz F_CPU w ustawieniach projektu.
    A nie deklarujesz w żadnym pliku.
  • #3 10652779
    Adix3
    Poziom 13  
    A tak przepraszam zapomniałem dodać że obecnie używam AVRStudio 6.0

    Ok dzięki, tak zrobiłem, wszedłem w ustawienia -> AVR/GNU C Compiler -> Symbols i dodałem wpis: F_CPU=8000000. I działa, tak jak powinno. Szkoda że trzeba aż tak głęboko w opcjach grzebać aby to ustawić. Powinni zrobić w edytorze kodu gdzieś na pasku u góry okienko do wpisywania częstotliwości zegara, no ale cóż :/

    Mam jeszcze taki jedno pytanie. Czemu gdy tworze tą własną "bibliotekę" a dokładnie pliki .h i .c to nie wystarczy zainkludować #include "LED.h> tylko trzeba jeszcze dołączać do drzewa projektu osobno plik LED.c?? A nie wystarczy tylko zainkludować pliku LED.h tak ja np. avr/io.h gdzie nie trzeba dodawać żadnego pliku io.c do drzewa??

    Da się jakoś tak zrobić żeby prościej dało się dołączać te własne "biblioteki"??
  • #5 10652848
    tmf
    VIP Zasłużony dla elektroda
    Adix3 napisał:
    Mam jeszcze taki jedno pytanie. Czemu gdy tworze tą własną "bibliotekę" a dokładnie pliki .h i .c to nie wystarczy zainkludować #include "LED.h> tylko trzeba jeszcze dołączać do drzewa projektu osobno plik LED.c?? A nie wystarczy tylko zainkludować pliku LED.h tak ja np. avr/io.h gdzie nie trzeba dodawać żadnego pliku io.c do drzewa??

    Da się jakoś tak zrobić żeby prościej dało się dołączać te własne "biblioteki"??


    Bo to co ty robisz to nie jest żadna biblioteka, to zwykły plik w c, który trzeba każdorazowo kompilować. Biblioteka składa się z prekompilowanych plików obiektowych, które są dołączane na etapie linkowania, a nie kompilacji. Po drugie, io.h to też nie biblioteka, tylko zwykły nagłówek z definicjami, nie zawiera żadnego kodu. Więc wystarczy go dołączyć.
  • #6 10652894
    janbernat
    Poziom 38  
    No cóż- na toolchain z atmela się "nadziałem".
    Zastosowałem w AVStudio4.18 i _delay() poszedł sobie w krzaki.
    AVrStudio5 zainstalowałem i jeszce prędzej odinstalowałem.
    Nie wiem jak jest z VRStudio6 i czy jest poprawiony toolchain i czy korzysta z jakiejś normalnej wersji kompilatora.
    Na razie poczekam na opinie użytkowników.
    Ale- sprawdź Adix3 czy chociaż _delay() działają prawidłowo.
    Bo jak będziesz miał krytyczne czasy przy odczycie jakiegoś DS to dostaniesz cholery.
    Ja jestem konserwatywny i kolorowe bajery na mnie słabo działają.
  • Pomocny post
    #7 10652949
    gaskoin
    Poziom 38  
    Adix3 napisał:

    Mam jeszcze taki jedno pytanie. Czemu gdy tworze tą własną "bibliotekę" a dokładnie pliki .h i .c to nie wystarczy zainkludować #include "LED.h> tylko trzeba jeszcze dołączać do drzewa projektu osobno plik LED.c?? A nie wystarczy tylko zainkludować pliku LED.h tak ja np. avr/io.h gdzie nie trzeba dodawać żadnego pliku io.c do drzewa??

    Da się jakoś tak zrobić żeby prościej dało się dołączać te własne "biblioteki"??


    Możesz zostawić je skompilowane w jednym miejscu a dołączać w projekcie tylko pliki .h. Wymaga to ustawienia ścieżki do biblioteki w opcjach projektu.

    Pliki .c trzeba dołączać bo są one kompilowane i podczas dodawania ich do drzewa projektu w AVR studio, aktualizowany jest plik makefile, w którym to do wywołania kompilatora są dodawane te pliki. Pliku .h nie wystarczy dodać, ponieważ w rzeczywistości nie jest on nijak fizycznie powiązany z plikiem ani .c ani obiektowym. Równie dobrze jeden nagłówek może zawierać deklarację dla zawartych w wielu plikach funkcji/zmiennych. Większość bibliotek jest tak napisana, że ma wiele plików obiektowych a tylko jeden nagłówek dla danej grupy funkcji.
    Żeby nie musieć dodawać plików .c do projektu, musiałbyś sam sobie napisać makefile, tak, żeby przeszukiwany był katalog wywołania make'a lub jakieś jeszcze tam podkatalogi, ale to chyba jeszcze nie czas :)
  • Pomocny post
    #8 10653253
    krru
    Poziom 33  
    Adix3 napisał:

    Mam jeszcze taki jedno pytanie. Czemu gdy tworze tą własną "bibliotekę" a dokładnie pliki .h i .c to nie wystarczy zainkludować #include "LED.h> tylko trzeba jeszcze dołączać do drzewa projektu osobno plik LED.c??


    Krótko mówiąc, po to by kompilator wiedział, że jak zmienisz plik LED.c to też trzeba go przekompilować oraz że wyniki tej kompilacji należy dołączyć do ostatecznego wyniku.
    Jakbyś nie używał IDE, tylko normalnego kompilatora z linii komend i sam szykować procedurę kompilacji (zwykle w postaci makefile) to byś wiedział co tam siedzi pod spodem i dlaczego należy robić tak, a nie inaczej.
  • #9 10653523
    Adix3
    Poziom 13  
    No i o takie wytłumaczenie mi chodziło, teraz przynajmniej wiem o co chodzi ;) Oczywiście zostaję przy tym sposobie jakim robiłem to do tej pory, jakoś łatwiejsze mi się to wydaje ;P

    Co do tego całego IDE to chyba faktycznie przesiądę się na Eclipse. Dzisiaj wieczorkiem pościągam to co potrzeba i zaczynam zabawę :D

    Ok dziękuję za wszelką pomoc w temacie.

    Pozdrawiam.
REKLAMA