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

[AVR] Dokładność kwarcu 16MHz: F_CPU 16000000UL czy 16777216UL?

stachu_15 06 Cze 2012 19:23 2333 7
REKLAMA
  • #1 10974279
    stachu_15
    Poziom 12  
    Witam wszystkich, próbowałem znaleźć odpowiedź na mój problem, lecz na nic konkretnego nie natrafiłem. Moje pytanie brzmi: czy kwarc 16MHz to dokładnie 16.000.000 Hz? Chodzi mi o sposoby liczenia parametrów dla Timerów w AVRach. Czy podczas obliczeń za wartość F_clk powinienem brać właśnie 16000000 czy może 16777216? Czy definiując podczas programowania wartość F_CPU powinienem używać wielkości 16000000UL czy może właśnie 16777216UL ? Proszę o odpowiedź na moje banalne pytanie. Pozdrawiam!
  • REKLAMA
  • #2 10974367
    sweter_007
    Poziom 14  
    16.000.000 Hz / 16000000UL
  • REKLAMA
  • #3 10974515
    mirekk36
    Poziom 42  
    16MHz to przecież 16 mln Hz .... przecież to tylko najzwyklejsza zamiana jednostek.

    Jak może być 16MHz = 16777216? skąd ci to przyszło do głowy ?

    16777216Hz = 16,777216MHz

    A parametru F_CPU nigdy nie definiuj w kodzie. To robi się w makefile albo najczęściej w ustawieniach projektu jeśli posługujesz się jakimś normalnym środowiskiem a mam tu na myśli: Eclipse, stare AVR Studio 4.xx czy CodeBlocks a nie kocie AVR Studio 5/6. Przez to definiowanie w kodzie będziesz miał za chwilę sporo innych problemów o które będziesz pytał na forum. Zresztą sam zobacz:

    http://mirekk36.blogspot.com/2011/11/dlaczego-eclipse-zamiast-avr-studio.html
  • REKLAMA
  • Pomocny post
    #4 10974931
    dondu
    Moderator na urlopie...
    Jeżeli używasz oryginalnych środowisk programistycznych Atmela, to definiuj zegar zawsze w opcjach (właściwościach): F_CPU – gdzie definiować?

    A w kodzie zawsze zostawiaj tylko na wszelki wypadek info o zegarze, byś wiedział dla jakiego zegara program był przygotowany.

    BTW: UL oznacza Unsigned Long i tak powinieneś oznaczyć gdybyś się uparł definiować F_CPU w kodzie.
  • REKLAMA
  • #5 10974971
    marcin1990
    Poziom 14  
    Kwarc 16MHz to oczywiście nie dokładnie 16000000 Hz, z racji tego, że standardowo dokładność kwarców jest na poziomie 50ppm będzie to 16000000 +/- 50Hz .W najgorszym wypadku przyjmuje +- 100ppm. Do obliczeń timerów przyjmujemy oczywiście 16 MHZ
  • #6 10974984
    stachu_15
    Poziom 12  
    Oki dzięki wszystkim za odpowiedzi. Najbardziej pomógł mi dondu :) owa dziwna wartość 16M wzięła mi się stąd: 16*1024*1024 :) przy obliczeniach timerów wychodziły jakieś sensowniejsze liczby dla tej wartości. Ale ok już wszystko rozumiem i poradziłem sobie z moim kodem :) dzięki jeszcze raz!
  • #7 10977757
    excray
    Poziom 41  
    marcin1990 napisał:
    Kwarc 16MHz to oczywiście nie dokładnie 16000000 Hz, z racji tego, że standardowo dokładność kwarców jest na poziomie 50ppm będzie to 16000000 +/- 50Hz

    Chyba raczej 16MHZ+/- 800Hz. Kolega chyba nie zrozumiał co oznacza skrót ppm. W przypadku oscylatora 16MHz 50ppm to właśnie +/- 800Hz. Poza tym zwykłe kwarce mają błąd na poziomie zazwyczaj 10ppm czyli tutaj +/- 160Hz
  • #8 11229352
    stachu_15
    Poziom 12  
    Problem rozwiązany :)
REKLAMA