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

KAMAMI ZL3 AVR, Atmega32-16PU, TIMER0 - Częstotliwość przed i po preskalowaniu

bq666 25 Mar 2017 23:37 1266 12
  • #1 16371793
    bq666
    Poziom 5  
    Witam
    Układ jak w opisie, a mam parobem ze zrozumieniem jaka jest częstotliwość przed preskanem, z lektur wynika że to częstotliwość zegara procka (czyli w tym wypadku 16M). Natomiast po:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Otrzymuję na pinie PB3 30,6 Hz.

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

    Otrzymuję na pinie PB3 31,2 kHz.

    Po ustawieniu i podaniu na PIN T0 1MHz:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Otrzymuję na pinie PB3 1,95 kHz.

    Gdzie popełniam błąd ? Na wszelki wypadek cały listing "programu" załączam:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #2 16371910
    dasej
    Poziom 32  
    Witam.

    Wybacz ale chce mi się rozpisywać. Ustawianie 1 sekundy dla zegara 16MHz

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


    to co wychodzi z prescalera "dzielimy" przez wartość zapisaną w OCR1A
  • Pomocny post
    #3 16371962
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #4 16372015
    kamyczek
    Poziom 38  
    W pdf jest napisane wszystko . Może napiszesz czego oczekujesz a co wychodzi . Pewnie w obliczeniach zapomniałeś o samym liczniku i wychodzi 256 razy mniej . Wielu początkujących robi taki błąd , ze zapomina o tym ze aby licznik się przepełnił musi policzyć tyle impulsów ile ma jego pojemność a w niektórych trybach ta wartość się jeszcze zmienia . Napisz jaką wartość chcesz uzyskać to pewnie ktoś przedstawi przykład jak to zrobić . Poza tym w sieci jest wiele kalkulatorów ,które liczą zadaną częstotliwość lub okres dla każdego trybu i zadanych parametrów .
  • #5 16373204
    bq666
    Poziom 5  
    Witam,
    dasej: Dzięki za pomoc, po wpisaniu Twojego programu 100% działa. Powinno być chyba zamiast TIMSK1 ---> TIMSK, z kalkulacji miało wyjść 1Hz i tak jest. Tylko że usiłuję to zrobić bez wykorzystywania przerwań i z dużo wyższymi częstotliwościami.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    emarcus, kamyczek: Wydaje mi się że faktycznie "zapomniałem" jeszcze policzyć licznika TCNT0, czy takie rozumowanie jest słuszne ? :
    "//clkI/O/1024 (From prescaler) 16000000/1024/255=61,2745098039 i jeszcze dzielone przez 2 co daje 30,5 Hz i to jest Dobrze ? Mi by się zgadzało :)"

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #6 16373248
    dasej
    Poziom 32  
    Mój algorytm jest od AtMega328 stąd różnice.

    To skąd będziesz wiedział że upłyną określony czas.
    Masz zamiar stale sprawdzać rejestry.

    Jaką chcesz uzyskać częstotliwość.
  • #7 16373360
    bq666
    Poziom 5  
    Ostatnie pytanie i już nie "nudzę".
    Wzór na częstotliwość przy "Toggle OC0 on compare match" który do wartości OCR 1 jest idealny to: F_CPU/((OCR+1)*2N), N to preskaler.
    Przy OCR 2 otrzymuję ze wzoru i na pinie idealne 2,66 MHz, natomiast przy OCR 1 ze wzoru i na pinie idealne 4MHz. Przy OCR 0 tu i tu 8 MHz. Wzór znalazłem u jednego z autorów książek o tematyce AVR.
    A moje pytanie, czy przy takim algorytmie, pomimo tego że nie wykorzystuje przerwań a na pinie mam częstotliwość którą chciałem procesor będzie miał jeszcze "czas" na po prostu realizację programu ? Czy tak skonfigurowany timer wykorzystuje procesor ?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 16373400
    trol.six
    Poziom 31  
    bq666 napisał:
    Czy tak skonfigurowany timer wykorzystuje procesor ?

    Wszystkie peryferia do pewnego stopnia są niezależne od rdzenia CPU. Czyli np, licznik będzie działać, ale zawsze w ten sam sposób.
    Trzeba by też zerknąć do noty, ponieważ w zależności od trybu SLEEP (czyli oszczędzania energii), gdybyśmy chcieli skorzystać, czasem niektóre peryferia nie będą działać, ponieważ potrzebują głównego zegara.
  • #9 16374085
    kamyczek
    Poziom 38  
    Licznik działa autonomicznie nie korzysta z mikrokontrolera do momentu gdy zgłosi przerwanie , które musi obsłużyć mikrokontroler . Jeśli planujesz budowę zegarka poczytaj o pracy asynchronicznej zegara wtedy używasz rezonatora zegarkowego 32.768KHz jest on znacznie bardziej wygodny i możesz zrezygnować z rezonatora głównego na rzecz oscylatora RC za dokładność zegarka odpowiada kwarc zegarkowy reszta dokładności wielkiej już nie wymaga . Zachęcam do ściągnięcia i przeczytania dokumentacji tam są prawidłowe dla układu wzory , nazwy rejestrów i uwagi o błędach które czasem się zdarzają .
  • #11 16374491
    trol.six
    Poziom 31  
    dondu napisał:
    kamyczek napisał:
    Zachęcam do ściągnięcia i przeczytania dokumentacji tam są prawidłowe dla układu wzory , nazwy rejestrów ...

    Niestety także w dokumentacji czasami bywają błędy

    Błędy bywają w wielu miejscach, znalazłem ostatnio wpis ze złym adresem przerwania w pliku nagłówkowym.

    Poza tym kompilator kompilując kod, korzysta nie z dokumentacji, lecz właśnie z plików nagłówkowych z opisami rejestrów.
    I choć opisy powinny być te same co w nocie, zdarzyło mi się (już nie pamiętam przy czym) że zmienna miała dopisane 0.

    Tak że, warto czasem sprawdzić czy te wpisy są właściwe.
  • Pomocny post
    #12 16375098
    Konto nie istnieje
    Poziom 1  
  • #13 16382121
    bq666
    Poziom 5  
    Dzięki śliczne za pomoc. Dzięki Waszym postom udało mi się co planowałem :) Czyli zrozumiałem zasadę działania, reszta faktycznie już z datasheet.
REKLAMA