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

ATMEGA 8 - Jak ustawić przerwanie timera co 1s z prescalerem 128?

mala.nm 14 Lis 2014 11:01 1350 11
REKLAMA
  • #1 14130235
    mala.nm
    Poziom 9  
    Witam!
    Jestem osobą początkującą i chciałabym prosic o pomoc przy zmianie fragmetu kodu, ponieważ nie bardzo wiem gdzie tego szukać w datasheet.
    Obecnie mam coś takiego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Potrzebuję przekształcic kod w taki sposób aby inicjalizacja przerwania timera była co 1s. Sprawdzałam mkavr kalkulatorem i wartość OCR1A pozostaje dla 1s taka sama jednak zmienia się prescaler z 64 na 128 i nie wiem jak zmienić to w kodzie. Czy mógłby mi ktoś pomóc?
  • REKLAMA
  • #2 14130272
    tmf
    VIP Zasłużony dla elektroda
    Weź notę procka, odszukaj opis rejestru TCCR1B i będziesz miał tam pokazane ustawienia bitów CS dla wybranego preskalera. Niesądzę, aby ktoś pamiętał wszystkie konfiguracje tych bitów, więc i tak, żeby ci odpowiedzieć należałoby zajrzeć do noty...
  • REKLAMA
  • Pomocny post
    #3 14130282
    Steryd3
    Poziom 33  
    W dokumentacji niestety dla licznika 1 nie występuje preskaler 128. Występuje natomiast 256.
    Zakładając, że licznik pracuje w trybie CTC (WGM12 =1) i zakładając 8MHz źródło sygnału zegarowego (tak jak jest w komentarzu w kodzie) należy wpisać do OCR1A= 31249 oraz ustawić preskaler na 256 czyli CS12=1
    A tak na przyszłość ...nota katalogowa. Tam wszystko jest-łącznie z wzorami.
  • #4 14130284
    michalko12
    Specjalista - Mikrokontrolery
    tmf napisał:
    miał

    To nie ta płeć. Nie pomożesz dziewczynie?
  • REKLAMA
  • #5 14130542
    yokoon
    Poziom 29  
    Steryd3 napisał:
    W dokumentacji niestety dla licznika 1 nie występuje preskaler 128. Występuje natomiast 256.
    Zakładając, że licznik pracuje w trybie CTC (WGM12 =1) i zakładając 8MHz źródło sygnału zegarowego (tak jak jest w komentarzu w kodzie) należy wpisać do OCR1A= 31249 oraz ustawić preskaler na 256 czyli CS12=1
    A tak na przyszłość ...nota katalogowa. Tam wszystko jest-łącznie z wzorami.


    Witam.
    A ja myślę, że należy wpisać wartość do OCR1A = 15624.Prescaler = 256/2Hz = 500ms
  • REKLAMA
  • #6 14130570
    Steryd3
    Poziom 33  
    yokoon napisał:
    A ja myślę, że należy wpisać wartość do OCR1A = 15624.Prescaler = 256.

    Nie wykluczając swojej pomyłki...czemu kolega tak wnosi?
    Mnie z dzielenia 8MHz przez 256 wychodzi 31250 czyli tyle impulsów należy zliczyć by uzyskać przerwanie co 1s. Uwzględniwszy stan 0 licznika mnie wychodzi, że do rejestru OCR1A należy wpisać 31249.
    Gdzie popełniam błąd?
  • #7 14130585
    mala.nm
    Poziom 9  
    31249 jest dla preskalera 256 i 1 s i dla częstotliwości wyjściowej 1Hz , natomiast 15624 jest też dla praskalera 256 i 1s ale dla częstotliwości 2Hz
  • #8 14130593
    yokoon
    Poziom 29  
    Witam.
    Nie wziął Kolega jeszcze częstotliwości jaką chcemy uzyskać na wyjściu.
    Moim zdaniem chodzi o 2Hz (500ms) co widać w pierwszym poście autora.
    W moim pierwszy wyjaśniłem. No chyba, że źle zrozumiałem autora pierszego postu.
  • #9 14130616
    Steryd3
    Poziom 33  
    mala.nm napisał:
    31249 jest dla preskalera 256 i 1 s i dla częstotliwości wyjściowej 1Hz , natomiast 15624 jest też dla praskalera 256 i 1s ale dla częstotliwości 2Hz

    To dopiero miszmasz...
    Trzeba uporządkować...moja wersja to przerwanie od timera (gdy wartość rejestru OCR1A zrówna się z stanem licznika) co 1s (1Hz).
    Przy generacji przebiegu(a więc zmieniając stan pinu przy każdym porównani na przeciwny) z wykorzystaniem tych "nastaw" otrzyma się przebieg o okresie 2s a tym samym 0,5Hz.
  • Pomocny post
    #10 14130668
    Kociejsko
    Poziom 14  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #11 14132688
    Konto nie istnieje
    Poziom 1  
  • #12 14193668
    mala.nm
    Poziom 9  
    Dziękuję bardzo za pomoc :)
REKLAMA