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

Resetowanie timera w Atmega8 - jak wyzerować licznik do zera?

Templarious 15 Sty 2015 12:15 1032 9
REKLAMA
  • #1 14332452
    Templarious
    Poziom 22  
    Witam,

    Zbudowałem swojego czasu timer odliczający sekundy na Atmega8 ale zauważyłem, że jak zatrzymuje go przyciskiem kilk razy i włączam, to sekunda jest niepełna. Zapewne jest to spowodowane zapisem jego wartości w jakimś rejestrze i chciałbym móc go kasować do końca...

    mój kod jest dostępny tutaj: http://mikrokontrolery.blogspot.com/2011/03/D...nikow-rakietowych-ATmega8-by-Templarious.html
  • REKLAMA
  • Pomocny post
    #2 14334935
    dondu
    Moderator na urlopie...
    Wystarczy wpisać do rejestru licznika zero oraz wyzerować preskaler.
    Na przykład Timer0:
    1. TCNT0 ustawiasz na zero
    2. ustawiasz bit PSR10 w rejestrze SFIOR.

    Ale uwaga! W tym przypadku PSR10 zeruje także preskaler Timer1.
    Szczegóły w datasheet.

    Jak już poprawisz program to napisz proszę w komentarzu do artykułu. :)
  • #3 14334938
    Templarious
    Poziom 22  
    Bardzo dziękuję :)
    W weekend sprawdzę, czy faktycznie to jest rozwiązaniem problemu :)

    // z edytuje pozniej artykuł jak bedzie ok:)
  • REKLAMA
  • #4 14334967
    tadzik85
    Poziom 38  
    dondu napisał:
    Wystarczy wpisać do rejestru licznika zero oraz wyzerować preskaler.
    Na przykład Timer0:
    1. TCCR0 ustawiasz na zero
    2. ustawiasz bit PSR10 w rejestrze SFIOR.



    Poprawniej zdaje się byłoby zrobić to w odwrotnej kolejności.
  • REKLAMA
  • Pomocny post
    #5 14334996
    dondu
    Moderator na urlopie...
    To zależy. Z opisu autora (nie analizowałem kodu) wynika, że timer jest zatrzymany, stąd kolejność nie ma znaczenia.

    Przy okazji mała poprawka, bo zamiast TCNT0 podałem TCCR0.
    Zerując TCCR0 zatrzymamy timer ponieważ w tym mikrokontrolerze są tam tylko bity preskalera.
  • #6 14335356
    Templarious
    Poziom 22  
    Mam to już zrobione...
    Chodzi mi o resztki, tzn. Wiem że ten timer porównuje mi się z wartością OCR1A = 31250; i tutaj jest myk. Gdzie jest ta druga wartość ? coś == OCR1A, te "coś" chce wyzerować.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #8 14335443
    Templarious
    Poziom 22  
    Coś takiego ?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #9 14335472
    szczywronek
    Poziom 28  
    Prawie. Cytat z datasheet'a:

    m8 datasheet napisał:
    (opis bitu PSR w SFIOR) When this bit is written to one, the Timer/Counter1 and Timer/Counter0 prescaler will be reset. The bit will be cleared by hardware after the operation is performed. Writing a zero to this bit will have no effect.
  • #10 14335477
    Templarious
    Poziom 22  
    Racja !

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