Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8 i counter0, prescaler, przepełnienie licznika, wyliczenie 1 s.

30 Gru 2006 14:04 1848 3
  • Poziom 19  
    Witam. Mam parę nurtujących mnie pytań od pewnego czasu. Niedawno zacząłem się bawić licznikami w atmedze8. Chciałbym zacząć od zupełnych podstaw w tej dziedzinie. Zajmuje się teraz counterem0. Z tego co udało mi się wyczytać z manuala to są 4 podstawowe tryby pracy tego licznika:
    -brak pracy :]
    -praca
    -praca z prescalerem
    -zewnętrzne taktowanie
    Tutaj już nasuwa mi się pierwsze pytanie, co to jest ten prescaler. Mniej więcej wiem o co chodzi, ale dobrze by było jeszcze raz się dowiedzieć.
    Jak na razie próbuję coś zrobić z normalną pracą licznika. I tutaj znowu kilka pytań:
    -jeśli ustawię sobie przepełnienie to jak ono nastąpi będę miał 1 w TOIE0, a czy po takim zdarzeniu (po przepełnieniu) licznik zresetuje mi się i będzie naliczał od początku?
    -jak można za pomocą takiego licznika wyliczyć :) sobie 1 sekundę. Pytanie może głupie i naiwne, ale nie chodzi mi tutaj o kod, który by to robił, tylko o wzór, z którego przy danej częstotliwości atmegi będę mógł wyliczyć ile takich przepełnień musi nastąpić, aby upłynęła ta jedna sekunda?
    -zastanawia mnie jedna rzecz, bit TOIE0 zostanie ustawiony po przepełnieniu i sam zostanie 'wyłączony' przez atmegę. Co będzie jak ominę ten moment odczytania wartości tego bitu, muszę go przecież odczytać w określonym czasie?
  • Poziom 16  
    Witam.
    Prescaler jest to dzielnik częstotliwości. Jeżeli użył byś kwarcu 8 MHz oraz timera 0 przepełnił by ci się on 31250 razy.Aby zmniejszyc częstotliwość wyrzucanych przerwań używa sie prescalera. Np ustawiając prescaler 64 uzyskasz przerwanie co 0,00204800 s.
    Co do drugiego pytania to w BASCOM'ie licznik się zeruje chyba że wpiszesz mu jakąś wartość.
    Zakładając że używamy PMHz kwarcu i ustawimy pleskarel 64 i zaczniemy zliczać od 131 to uzyskamy przerwanie co 0,001s czyli po 1000 wyrzuconych przerwań otrzymamy 1 sek.(8000000/64=125000 (bo timer0 jest 8 bitowy)256-125=131

    Mam nadzieję że nie namieszałem :D
  • Poziom 42  
    y0yster napisał:
    -jak można za pomocą takiego licznika wyliczyć :) sobie 1 sekundę.


    np jeśli użyłbyś sobie kwarcu zegatkowego 32,768kHz to jeśli chciałbyś za pomocą Timera0 uzyskać przerwanie (czyli przepełnienie licznika) co 1 sekundę to obliczasz to tak:

    32768(częstotliwość twojego rezonatora) podzielić przez 1024 (to wartość preskalera jaką możesz ustawić dla tego Timera) = 32Hz to czętotliwość z którą Timer0 będzie zwiększał wartość swojego licznika , a zlicza od 0 do 255. Więc jeśli chcesz aby przerwanie było co 1s czyli 1Hz to musisz tak ustawiać zawartość rejetru tego licznika aby zliczał do 32 i się przepełniał generując jednocześnie przerwanie równo raz na sekundę. Jaką więc wartość musisz wpisywać do licznika (w przerwaniu) 255 - 32 = czyli 223 w związku z tym licznik będzie zaczynał zliczać nie od 0 tylko od 223 do 255. Dzięki temu raz na sekundę nastapi jego przepełnienie bo:

    32769 / 1024 / 32 = 1

    teraz już się rozjaśniło troszkę ? ;)

    co do bitu TOIE0 to oczywiście jeśli nie będziesz korzystał z przerwania to musisz w programie głównym śledzić jego wartość, i jeśli zmieni stan to znaczy, że licznik własnie zliczył do zadanej wartości i się przepełnił. Ponownie będziesz go musiał załadować i odpalić ;)

    lepiej wtedy użyć przerwań, które są wyzwalane własnie autoamtycznie gdy następuje przepełnienie, wtedy w procedurze i obsługi przerwania ustawiasz tylko ręcznie wartość licznika na taką jak chcesz.

    można to też w pełni zautomatyzować gdybyś chciał aby licznik np generował co 1 sek impuls na zewnątrz do sterowania diody LED, wtedy trzeba skorzystać z innego trybu licznika gdzie można zdefiniować automatycznie wartość do porówniania itp
  • Poziom 19  
    Dzięki za zainteresowanie tematem. Chociaż mirekk36 chyba nie zrozumiałeś mnie. Chodziło mi o to jak uzyskać jedną sekundę ale bez prescalera. A co więcej jeśli się nie mylę to podłączałeś do swojej atmegi kwarc, ja chciałbym uzyskać tą upragnioną :) sekundę bez prescalera, jak tego dokonać? Prosił bym także abyś wysłał mi swoje gg na pw ponieważ chciałbym nieć trochę szybszy kontakt.