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

Atmega8, C - Jak mierzyć czas z dokładnością 1ms w trybie asynchronicznym?

harmichalh 17 Kwi 2013 22:01 2184 7
REKLAMA
  • #1 12211408
    harmichalh
    Poziom 12  
    Witam, muszę mierzyć czas z dokładnością do 1ms w Atmgedze8. Stwierdziłem, że najlepiej będzie jak użyję do tego timera2 w trybie asynchronicznym. Zacząłem przeglądać datasheet i pojawiły się wątpliwości.

    1. Czy mogę użyć kwarcu innego niż 32,768kHz?
    2. Jeśli nie, to jak ustawić rejestr porównania i preskaler?
    Bo muszę wywoływać przerwanie 1000razy, a 32768Hz/1000 = 32,768 więc zawsze wartość dla porównania będzie nie całkowita, a mi zależy na dużej dokładności.
    3. Jeżeli nie da się tego zrobić, to jak inaczej mierzyć czas z taką dokładnością?
  • REKLAMA
  • #2 12211511
    excray
    Poziom 41  
    Kolego w poprzednim temacie zrobiłeś taki licznik. Tyle że zamiast stosować wbudowany generator RC musisz zastosować zewnętrzny kwarc 8MHz. Tylko tyle. Pisałem Ci o tym w tamtym temacie. Dokładność takiego układu wcale nie będzie gorsza aniżeli przy kwarcu 32768kHz.
  • REKLAMA
  • #3 12211518
    BlueDraco
    Specjalista - Mikrokontrolery
    Użyj timera w trybie zwykłym i dowolnego kwarcu o "okrągłej" częstotliwości, np. 8 MHz. Preskaler np. 8, timer w trybie CTC zliczający do 999 i masz przerwanie co 1 ms.
  • #4 12211682
    Jeżyk-1
    Poziom 25  
    To nie lepiej zastosować timera jak autor zasugerował, ustawić flagę przepełnienia i preskaler na 128.
    W tedy licznik 8 Bitowy liczący od od 0 do 255 czyli jak dojdzie do 255 będzie równa 1s.

    I np w taki sposób kolega mógłby włączyć takiego timera:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i jakieś tam przerwanie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #5 12211700
    excray
    Poziom 41  
    Jeżyk-1 napisał:
    To nie lepiej zastosować timera jak autor zasugerował, ustawić flagę przepełnienia i preskaler na 128.
    W tedy licznik 8 Bitowy liczący od od 0 do 255 czyli jak dojdzie do 255 będzie równa 1s.

    Ale on chce 1ms.
  • REKLAMA
  • #6 12212010
    Jeżyk-1
    Poziom 25  
    Aj to źle zauważyłem. To może kwarc 1,8432MHz, preskaler 1024 i CTC na 180 Co da równo 1ms ?
  • #7 12212207
    Sparrowhawk
    Poziom 22  
    Przede wszystkim nie wiemy, jak bardzo dokładna ma być ta 1 ms?
  • #8 12212421
    tmf
    VIP Zasłużony dla elektroda
    Sparrowhawk napisał:
    Przede wszystkim nie wiemy, jak bardzo dokładna ma być ta 1 ms?


    A to 1 ms różni się dokładnością od innej ms?

    Przede wszystkim opisz o co tak naprawdę ci chodzi. Czy o stworzenie licznika odliczającego czas z rozdzielczością 1ms, czy o pomiar czasu jakiegoś zdarzenia zewnętrznego z dokładnością lub rozdzielczością 1ms? Jeśli to pierwsze to można wykorzystać RTC lub timer z odpowiednim preskalerem. Przy czym dla uzyskania dokładnie 1ms kwarc 32768Hz się nie nadaje, więc lepiej zastosować timer wykorzystujący zegar systemowy. RTC można taktować inną częstotliwością, przy czym kwarców 32000Hz o ile się nie mylę i tak nie ma, można spróbować nieco "przeciągnąć" kwarc zegarkowy kondensatorem.
    Jeśli chodzi ci o pomiar czasu zdarzenia zewnętrznego, to w tym celu należy użyć wejść ICP timera.
REKLAMA