Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

F_CPU Dodatkowe opcje L U

xamrex 20 Jun 2011 18:57 4068 15
Computer Controls
  • #1
    xamrex
    Level 28  
    Witam
    Spotkałem się z tym, że ludzie definiują prędkość zegara w pliku
    np.:
    Code: c
    Log in, to see the code

    Widziałem również:
    Code: c
    Log in, to see the code

    Oraz
    Code: c
    Log in, to see the code


    Może mi ktoś wytłumaczyć po co są dodatkowe literki U oraz L ?
  • Computer Controls
  • #2
    michalko12
    MCUs specialist
    Unsigned Long bez tego kompilator potraktuje literał jako int a to może powodować problemy jesli literał będzie poza zakresem.
  • Computer Controls
  • #3
    xamrex
    Level 28  
    To trzeba w projekcie dodawać te litery UL, czy można je pominąć?
  • #4
    michalko12
    MCUs specialist
    Dla dużych wartości musisz je dodawać
  • #5
    xamrex
    Level 28  
    Dla dużych..
    Ile to jest dużo?
    Czyli coś takiego?
    #define F_CPU 1000000
    Jest błędne (przecież 1M, to chyba dużo)
  • #6
    tadzik85
    Level 38  
    A jaki zakres wartości ma int? Zastanowiłeś się?
  • #7
    nsvinc
    Level 35  
    "dużo" to jest zakres liczb które może trzymać typ int, i jest to zależne od platformy. Z tego co wiem, int na AVR jest 16bitowy. Inne procki jak dsPIC czy ARM traktują mają 32bitowy int.
    Kolejna istotna rzecz, to kwalifikator unsigned. Bez niego, twój 16bitowy int przyjmie wartość max. 32767. Z nim - 65535.
    Dla 32bitowego inta, max to jest 2.147.483.647, dla unsigned inta 4.294.967.296

    Na AVR typ long jest 32bitowy (mogę sie mylić, ale załóżmy że tak jest), więc literał tego typu jest w stanie pomieścić np. 1000000 (milion). 16bitowy int już nie...

    Stąd też, jeśli masz literał 8000000 (8 mln), to musi on być long. Kwalifikator unsigned będzie ci potrzebny, jeśli będziesz wymagać liczb większych niż 2.147.483.647, stąd

    #define F_CPU 8000000unsignedlong jest ok
    #define F_CPU 8000000long też jest ok

    ale

    #define F_CPU 8000000 już jest lipa, bo liczba jest wieksza niz domyslny typ int na 8bitowym AVRrze, tak samo jak
    #define F_CPU 8000000unsigned, bo unsigned nadal nie gwarantuje ci pomieszczenia liczby na 16 bitach...

    -------------------------
    Disclaimer
    Mogłem się pomylić co do szerokości bitowej typów na AVR. Jeśli tak, proszę o poprawkę ;]
  • #8
    michalko12
    MCUs specialist
    Jak literał składa się z co najmniej 5 cyfr stosuj te sufixy i będzie bezpiecznie. Wielkość liter nie ma znaczenia może być ul jak i UL
  • #9
    xamrex
    Level 28  
    No ok będę stosował.

    Załóżmy, że jestem początkujący..
    Co robię?
    Pisze w googlach kurs c avr
    Wchodzę na stornę, gdzie jest przykładowy kod do mrugania diodami:
    Code: c
    Log in, to see the code


    #define F_CPU 1000000L


    I setki osób próbuje ten kod.
    I co się okazuje?
    Kod działa, a brakło tam literki U

    Ja też zrobiłem sobie małą próbę:
    Mam kwarc zew. 11,0592
    Napisałem kod:
    Code: c
    Log in, to see the code


    No i działa, a nie ma literałów UL,
    Czyli jeśli je pominę to nic wielkiego się nie stanie, tylko po prostu tak nie powinno się robić?
    Mam rację?
  • #10
    tadzik85
    Level 38  
    Zacznijmy od tego ze to F_CPU powinno definiować się w makefile.

    To główna zasada której powinieneś się trzymać.
  • #11
    xamrex
    Level 28  
    Tylko AVR Studio w wersji 5,
    generuje sam makefile a w opcjach nigdzie nie wadziłem możliwości definiowania zegara
    Więc jedyna opcja to dodanie tej definicji do pliku.
  • Helpful post
    #12
    mirekk36
    Level 42  
    xamrex wrote:
    Tylko AVR Studio w wersji 5,
    generuje sam makefile a w opcjach nigdzie nie wadziłem możliwości definiowania zegara
    Więc jedyna opcja to dodanie tej definicji do pliku.


    Mylisz się jest możliwość ;) właśnie w pełnej wersji AVR Studio 5 .

    F_CPU Dodatkowe opcje L U

    oczywiście sam jeszcze szukałem parę minut tego miejsca. Wprawdzie Eclipse też ma milion opcji - ale jednak pod niektórymi względami jest nadal wygodniejsze od AVR Studio. Chociaż te podpowiedzi z kolei w AVR Studio są też fajne bo w Eclipse jakoś nie zawsze działają niestety.
  • #13
    xamrex
    Level 28  
    Gdzie?
    Ściągnąłem AVR Studio 5 i nie mogę znaleźć.
  • #15
    tmf
    Moderator of Microcontroller designs
    Poza tym stałe można definiować przekazując odpowiednie parametry do gcc:
    -DF_CPU=
    A to już łatwo wprowadzić w opcjach projektu.
  • #16
    michalko12
    MCUs specialist
    xamrex wrote:
    No i działa, a nie ma literałów UL,
    Czyli jeśli je pominę to nic wielkiego się nie stanie, tylko po prostu tak nie powinno się robić?
    Mam rację?


    Wszystko zależy od tego z czym taki literał użyjesz, może tez zależęc od kompilatora..
    Jeśli taki literał użyjesz ze zmiennymi typu long to to zadziała, jeśli użyjesz z int to może nie zadziałać jak trzeba.

    Code: c
    Log in, to see the code


    Zobacz na jakich typach pracują funkcje delay: