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

ATmega328P: Przerwanie Timera 8-bitowego - Dlaczego pierwszy kod nie działa?

C-z-e-s-i-e-k 17 Wrz 2017 21:15 1320 2
REKLAMA
  • #1 16704996
    C-z-e-s-i-e-k
    Poziom 9  
    Posty: 13
    Korzystając z tego kursu Link nie moge uzyskać migania diody przy modyfikacji kodu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    a gdy zmienie kod na taki to działa:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Dlaczego nie che działać pierszy kod ??
  • REKLAMA
  • #2 16705056
    maly_ninja
    Poziom 14  
    Posty: 78
    Pomógł: 10
    Ocena: 13
    Dawno nie używałem AVR wiec mogę się mylić. Ale timer2_ovf_vect nie jest wywoływany po przepelnieniu TCNT2 (255 -> 0)? Jeśli tak to nie sprawdzisz tam wartości bo zawsze będzie taka sama (0?)
  • #3 16705170
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    Tak jak napisał kolega wyżej przerwanie OVF wykonuje się w momencie, gdy timer się przepełnia, co w tym przypadku oznacza jego wyzerowanie, czyli wyzerowanie rejestru TCNT2.

    W zależności od realizowanego programu moment wejścia w przerwanie może być nieco opóźniony w stosunku do momentu przepełnienia się licznika, a w tym czasie timer zlicza impulsy, bo jest niezależny od wykonania przez program funkcji przerwania. W związku z tym w funkcji przerwania, gdy sprawdzasz wartość TCNT2 może być równa zero lub większa niż zero (w zależności od ustawionego preskalera, czyli częstotliwości impulsów jaka trafia do timera).

    Sam moment wejścia w przerwanie także nieco trwa, ponieważ mikrokontroler musi wykonać np. odkładanie na stosie rejestrów, które użyje w przerwaniu oraz innych niezbędnych.

    Tutaj znajdziesz kurs AVR (i 300 innych artykułów): http://mikrokontrolery.blogspot.com/p/spis-tresci.html

    a w nim: http://mikrokontrolery.blogspot.com/2011/03/led-sterowany-przez-timer.html
REKLAMA