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

[atmega] [ATmega][AVR Studio 5][C] F_CPU i problemy z bibliotekami delay.h i LCD

Kuartz 09 Mar 2012 21:33 4924 7
  • #1 10656131
    Kuartz
    Poziom 10  
    Hej wszystkim!

    Mam małe pytanko - tylko do szpeców od AVR i GCC. Napotkałem identyczny problem do opisanego tutaj. Niestety nie podano tam rozwiązania tej kwestii.

    O co konkretnie chodzi? Jeśli nie zdefiniuję F_CPU a używam biblioteki delay.h to kompilator wyrzuca warninga. Wynika to niniejszego kodu - fragmentu biblioteki:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zatem w mainie przed zainkludowaniem pliku h definiuję sobie F_CPU ajk niżej:

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


    Warning znika ale np. nie działają biblioteki do obsługi LCD. Ponownie zaczynają dobrze działać, gdy wyłączy się optymalizację przez co objętość kodu z 10 urasta do ponad 60 % rozmiaru flasha.

    Sytuację da się rozwiązać deklarując F_CPU wewnątrz pliku delay.h. Da się włączyć optymalizację i funkcje do obsługi LCD wciąż działają.

    Mogę zrozumieć, że dyrektywy #define działają lokalnie, wewnątrz danego pliku. Pytanie jednak czemu warningi działają tak myląco. Wygląda bowiem na to, że mimo definicji w main rozpoznanej w pliku h (nie pojawił się warning) wciąż w pliku bibliotecznym widziana jest inna - zamiast tej zdefiniowanej - wartość F_CPU...

    Jakieś pomysły?

    Pzdrwm
  • Pomocny post
    #2 10656162
    gaskoin
    Poziom 38  
    ten warning nie działa myląco. Przecież przed zaincludowaniem pliku nagłówkowego definiujesz swoje F_CPU, ale nie będzie ono widoczne w pliku nagłówkowym wyświetlacza. Rozwiązaniem jest pisanie w każdym pliku definicji F_CPU. Ale tak się nie robi bo jest to mega bez sensu i nigdy tak nie rób.

    Żeby ustawić stałą F_CPU globalnie, trzeba to zrobić w pliku makefile. Nie wiem jak w tym nowym avr studio, ale do opcji kompilacji trzeba dołączyć -D F_CPU=8000000UL dla 8 MHz. Pogrzeb trochę w opcjach, może będzie jakaś linia gdzie można to wpisać, a może będzie do wyboru prędkość, nie wiem, nie używam tegóż.
  • #3 10656607
    mirekk36
    Poziom 42  
    Kuartz napisał:

    Jakieś pomysły?


    Jeden prosty i w 100% sprawdzony pomysł:

    Daj sobie spokój z AVR Studio 5 lub 6 a zamiast tego użyj albo:

    1. AVR Studio 4.xx
    2. najlepiej ECLIPSE
    3. CodeBlocks

    i ustawiaj częstotliwość taktowania we właściwościach projektu w każdym z tych normalnych środowisk. A okaże się że twój problem i dziwne warningi związane z twoim F_CPU (definiowanym w kodzie programu - czego się nigdy nie robi) .... znikną jak ręką odjął, przy okazji rzuć okiem tutaj:Link

    A jak się uprzesz na AVR Studio 5/6 i ciekaw jesteś kolejnych ZONK'ów to doszukaj sobie opcji jak pisał kolega wyżej - gdzie ustawia się parametr -DF_CPU xxxxx ale w makefile dla tego kociego środowiska.
  • Pomocny post
    #4 10657359
    tmf
    VIP Zasłużony dla elektroda
    Nie przesadzaj, czy to jest AS, czy Eclipse, to działa to dokładnie tak samo - kompilator musi mieć przekazaną definicję symbolu F_CPU, czyli w wywołaniu musi się znaleźć -DF_CPU=xxx. Czy masz gotowe okienko, gdzie pisze "Tu ustaw częstotliwość", czy to okienko nazwiemy "Define symbols" to wygląda to tak samo.
    BTW, zonki w AS5 wynikały z toolchaina, a nie z samego IDE. Wystarczyło korzystać z WinAVR (tak jak to robi Eclipse) i po kłopocie. Natomiast Eclipse nie ma symulatora (ani zasadniczo debuggera AVR), więc jest małoprzydatne - 99% problemów można rozwiązać oglądając kod w symulatorze, do pozostałego 1% potrzebny jest JTAG.
  • #5 10657364
    gaskoin
    Poziom 38  
    tmf napisał:
    Natomiast Eclipse nie ma symulatora (ani zasadniczo debuggera AVR), więc jest małoprzydatne - 99% problemów można rozwiązać oglądając kod w symulatorze, do pozostałego 1% potrzebny jest JTAG.


    Jak ktoś ma JTAG to przez OOCD można debugować AVR w Eclipsie.
  • #6 10657568
    tmf
    VIP Zasłużony dla elektroda
    Dlatego napisałem, że zasadniczo nie ma debuggera. DBG to takie dziadostwo, że tylko komuś kogo naprawdę nie lubię bym to polecał.
  • #7 10657795
    mirekk36
    Poziom 42  
    tmf napisał:

    BTW, zonki w AS5 wynikały z toolchaina, a nie z samego IDE.


    Dla mnie zonkiem jest to że nie można we właściwościach projektu ustawić częstotliwości tak jak to było chociażby w AS4, więc nie przesadzam. Wystarczy spojrzeć na elektrodę ale nie tylko na setki różnych forów ile początkujący mają problemów z wpisaniem tego -DF_CPU xxxxxx . To tobie może wydawać się proste, a ilość przypadków wciąż pojawiających się pytań o to samo świadczy o jednym, dla początkujących to koszmarny zonk i to bez dwóch zdań. A jeśli początkujący ma z tym problem, to dla niego podpowiedzi o JTAG'u czy Debugerze będą na etapie kompilacji swoich pierwszych programów jak opowieści o lotach na księżyc. A on nie wie jeszcze jak zacząć jeździć rowerem po ziemii. Jak tylko sobie z tym poradzi i zacznie jeździć samochotem to wtedy już będzie wiedział o co chodzi z -DF_CPU xxxxx. Takie jest moje zdanie, ale nie oznacza to że komuś je narzucam.
  • #8 10657827
    Kuartz
    Poziom 10  
    Witam,

    Tak myślałem, że definiowanie F_CPU we wszystkich plikach to bzdura. Próbowałem to wpisać do makea jak sugerowali koledzy ale nic to nie dało. Po każdym buildowaniu był on jakby odświeżany i wszelkie dopiski znikały. Pogrzebałem więc w opcjach projektu i znalazłem miejsce gdzie się definiuje symbole (-D):

    [atmega] [ATmega][AVR Studio 5][C] F_CPU i problemy z bibliotekami delay.h i LCD

    Teraz do makefile jest automatycznie dodawana definicja F_CPU:

    $(QUOTE)$(AVR_APP_PATH)avr-gcc.exe$(QUOTE) -funsigned-char -funsigned-bitfields -DF_CPU=3686400  


    i wszystko działa jak należy!

    Dzięki za pomoc. Pozdrawiam.
REKLAMA