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

Jak obsłużyć timer i przerwania w Atmega8a w C++?

dexter1 06 Mar 2014 14:37 1842 13
REKLAMA
  • #1 13375754
    dexter1
    Poziom 14  
    Witam!
    Proszę o pomoc, buduję zegarek na Atmega8a.
    Problem stwarza mi obsługa timera w przerwaniu. Właściwie to nie mogę znaleźć nic konkretnego.
    Jak włączyć timer? Gdzie ustawia się flaga przepełnienia? Czy flagę trzeba wyzerować ręcznie? Jak to wygląda z perspektywy kodu C++?
    Dziękuję serdecznie za pomoc :)
  • REKLAMA
  • #2 13375790
    laki_17
    Poziom 17  
    Witam. Jesteś pewny, że program, który piszesz to piszesz go w C++? A nie w C? Poszukaj w dokumentacji uC, ustawień rejestrów Timera, jest tam wszystko opisane. A jeśli piszesz w C to podeślę Ci za moment linka z polską dokumentacją i sensownym tutorialem.
  • REKLAMA
  • #3 13375948
    dexter1
    Poziom 14  
    Będę wdzięczny.
  • REKLAMA
  • #5 13377674
    Tomq
    Poziom 38  
    Timery krok po kroku: http://diycenter.acid19.linuxpl.com/readarticle.php?article_id=3


    Cytat:
    Jak włączyć timer?

    Jak wszystkie peryferia atmegi, timer aktywuje się poprzez ustawienie odpowiednich bitów w odpowiednich rejestrach - informacje na ten temat znajdziesz w dokumentacji na stronach 69-120.

    Cytat:
    Gdzie ustawia się flaga przepełnienia?

    To zależy którego licznika używasz. Dla Timera1 jest to bit OCF1A w rejestrze TIFR.

    Cytat:
    Czy flagę trzeba wyzerować ręcznie?

    To zależy od tego jakiego trybu używasz. Oczywiście najwygodniej jest generować przerwanie za pomocą licznika - nie dość, że nie trzeba ręcznie zerować flag, to jeszcze odpowiedni fragment kodu (zawartość przerwania) wykona się dokładnie wtedy kiedy tego chcesz.


    Zegarek to wbrew pozorom dość ambitny projekt (zwykle ciężko o satysfakcjonująca dokładność). Najsensowniej zapoznać się z timerami przez zabawę z migającą diodą.
  • REKLAMA
  • #6 13379617
    dexter1
    Poziom 14  
    Kupiłem książkę pana Tomasza Francuza :)
  • #7 13389629
    dexter1
    Poziom 14  
    Nie mogę znaleźć informacji. Chciałbym wiedzieć ile taktów zegarowych trwa cykl maszynowy.
  • Pomocny post
    #8 13389645
    BlueDraco
    Specjalista - Mikrokontrolery
    Jeden. :) I koniecznie coś trzeba dopisać, bo inaczej nie da się wysłać odpowiedzi.
  • #9 13390759
    dexter1
    Poziom 14  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Nie działa timer. Nie wiem dlaczego.
  • #11 13390818
    BlueDraco
    Specjalista - Mikrokontrolery
    Na moje oko, to w tym programie nic nie działa poprawnie - deklarujesz stałe w procedurach jako zmienne lokalne,a więc procesor musi je tworzyć od nowa przy każdym wejciu w procedurę, odświeżasz wyświetlacz w takim tempie, że nie zdąży zaświecić - kolejne zapisy różnych danych do portów. Sekundy odliczasz od -1. Przerwanie chcesz zgłaszać co 43 cykle, a jego obsługa zajmuje znacznie więcej.
  • #12 13390877
    gaskoin
    Poziom 38  
    Bo w tym trybie timer liczy do OCR1A a nie do ICR1
  • #13 13390903
    el2010tmp
    Poziom 25  
    Potrójny for w funkcji wywoływanej w przerwaniu to zły pomysł. Spróbuj na początek pomigać diodą z f=1Hz za pomocą timera. Reszta pójdzie z górki :)
  • #14 13393115
    dexter1
    Poziom 14  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Rozwiązałem problem. Trzeba było ustawić bit OCIE1A.
    Jak policzyć odmierzany czas? X=11059200 Hz
REKLAMA