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

[Rozwiązano] Działanie rejestru ICR1 Timera1 - liczenie taktów między zboczami

Jacek212 07 Maj 2019 23:03 564 13
REKLAMA
  • #1 17949411
    Jacek212
    Poziom 13  
    Chciałem zapytać jak on działa. Załóżmy że do ICR1 wpisywana jest wartość przy zboczu narastającym. Zbocze wystąpiło przy wartości 100 w ICR1 a kolejne przy wartości 1100, różnica między nimi to 1000. Czy ta wartość 1000 to 1000 taktów zegara procesora?
  • REKLAMA
  • Pomocny post
    #2 17949426
    excray
    Poziom 41  
    Do ICR przepisywana jest wartość TCNT w momencie wystąpienia zdarzenia. To czy 1000 to 1000 taktów zegara czy 8000 taktów zegara, to już zależy tylko od tego jak skonfigurowałeś licznik T1.
  • REKLAMA
  • Pomocny post
    #4 17949455
    excray
    Poziom 41  
    Normalnie. Obliczy Ci różnicę między nimi: 200 - 65336 = 400. Oczywiście pod warunkiem, że będziesz używać przy obliczeniach typu unsigned int.
  • Pomocny post
    #6 17949482
    excray
    Poziom 41  
    A słyszałeś o tym, że w samochodzie można przekręcić licznik? Jeśli kupiłeś auto które ma na liczniku 999500km i po pewnym czasie zauważasz na liczniku 300km to ile Ty przejechałeś tym autem? 800km - zgadza się? Tak samo to wygląda tutaj. Dojeżdżasz do 65535 i w następnym takcie zamiast 65536 masz 0 - licznik zeruje się. Niemniej różnica między 65336 a 200 to jednak 400 taktów licznika, tak jak u Ciebie różnica między 999500 a 300 to 800 przejechanych kilometrów.
  • REKLAMA
  • #7 17949612
    dondu
    Moderator na urlopie...
    Wyprostować jeszcze należy to:

    Jacek212 napisał:
    Czy ta wartość 1000 to 1000 taktów zegara procesora?

    Nie procesora tylko timera, bo to zależy jaki preskaler dla niego ustawiłeś: http://mikrokontrolery.blogspot.com/2011/03/prescaler-postscaler-co-to.html

    Jeśli timer ma wybrany preskaler 1, to w tym jedynym przypadku będzie to także ilość taktów procesora.

    Przykład liczenia ilości taktów z uwzględnieniem przepełnień znajdziesz tutaj:
    http://mikrokontrolery.blogspot.com/2011/03/S...omierz-monitorowanie-przez-RS232-SimPlot.html
  • #8 17949906
    Jacek212
    Poziom 13  
    Czyli: jeżeli mam ustawioną reakcje na zbocze narastające, TIMER1 w trybie normal, i preskaler ustawiony na 1, to licznik TCNT1 cały czas się zwiększa, w momencie wystąpienia zbocza narastającego na ICP1 rartoś jaka była w liczniku jest przepisywana do ICR1 którą przypisuję do zmiennej. W momencie wystąpienia kolejnego zbocza narastającego wartość z TCNT1 znów jest przepisywana do ICR1. I jeśli teraz od aktualnej wartości ICR1 odejmę wartość którą przypisałem do zmiennej otrzymam (znając taktowanie µC) czas pomiędzy zboczami. A to że licznik TCNT1 się przepełnił nie ma żadnego znaczenia dla poprawności wyniku? I co jeżeli przepełni się więcej niż jeden raz?
  • Pomocny post
    #9 17950023
    dondu
    Moderator na urlopie...
    Jacek212 napisał:
    Czyli: jeżeli mam ustawioną reakcje na zbocze narastające, TIMER1 w trybie normal, i preskaler ustawiony na 1, to licznik TCNT1 cały czas się zwiększa, w momencie wystąpienia zbocza narastającego na ICP1 rartoś jaka była w liczniku jest przepisywana do ICR1 którą przypisuję do zmiennej. W momencie wystąpienia kolejnego zbocza narastającego wartość z TCNT1 znów jest przepisywana do ICR1.

    Dotąd wszystko się zgadza.

    Jacek212 napisał:
    I jeśli teraz od aktualnej wartości ICR1 odejmę wartość którą przypisałem do zmiennej otrzymam (znając taktowanie µC) czas pomiędzy zboczami.

    Tak, pod warunkiem, że pomiędzy pierwszym, a drugim odczytaniem ICR1 licznik się nie przepełnił.

    A to już jest złe:
    Jacek212 napisał:
    A to że licznik TCNT1 się przepełnił nie ma żadnego znaczenia dla poprawności wyniku?

    ale generalnie problem rozumiesz, bo zadajesz słuszne pytanie:

    Jacek212 napisał:
    I co jeżeli przepełni się więcej niż jeden raz?


    Przeanalizuj (policz) jaki powinien być wynik gdy:
    - pierwszy odczyt ICR1 dał 65000,
    - drugi odczut ICR1 dał 500,
    - przepełnienie wystąpiło raz

    i drugi przypadek:
    - pierwszy odczyt ICR1 dał 1000,
    - drugi odczyt ICR1 dał 1000,
    - przepełnienie wystąpiło 10 razy.
  • REKLAMA
  • #10 17952146
    Jacek212
    Poziom 13  
    Skoro ma znaczenie że przepełnił się licznik TCNT1 to myślę że:
    dondu napisał:
    Przeanalizuj (policz) jaki powinien być wynik gdy:
    - pierwszy odczyt ICR1 dał 65000,
    - drugi odczut ICR1 dał 500,
    - przepełnienie wystąpiło raz

    wartość 500 w ICR1 z drugiego odczytu jest traktowana tak jak by przerwanie od zbocza nastąpiło po raz pierwszy, więc poprzedni odczyt został zignorowany.
    dondu napisał:
    i drugi przypadek:
    - pierwszy odczyt ICR1 dał 1000,
    - drugi odczyt ICR1 dał 1000,
    - przepełnienie wystąpiło 10 razy.

    I tu myśląc analogicznie jak w pierwszym przypadku skoro poprzednie odczyty z ICR1 zostały zignorowane więc ostatnie przerwanie jest potraktowane tak jak by to było pierwsze.

    Chyba że jest jeszcze jakiś dodatkowy rejestr który zlicza liczbę przepełnień TCNT1, wtedy była by możliwość zliczenia rzeczywistej różnicy pomiędzy pomiędzy przerwaniami.
  • Pomocny post
    #11 17952161
    dondu
    Moderator na urlopie...
    Żadne przerwanie nie zostało zignorowane :)
    Żaden odczyt nie może zostać zignorowany :)

    To może inaczej:
    Jeżeli kupiłeś używany samochód z 5 cyfrowym licznikiem kilometrów, który się przepełnił i wskazuje aktualnie 500, to ile kilometrów od nowości przejechał ten samochód?


    Poza tym nie przeanalizowałeś przykładu, który Ci wskazałem, a kod w nim jest dobrze opisany.
  • #12 17952841
    Jacek212
    Poziom 13  
    No to chyba teraz zrozumiałem to o co pytałem. W programie musi być procedura obsługi przerwania TIMER1_OVF_vect czyli przerwanie od przepełnienia. Jeżeli TIMER1 osiągnie wartość 65535 to wtedy jest wywoływane to przerwanie w którym jest inkrementowana zmienna zliczająca przerwania. I mając wartość ICR1 i ilość przepełnień TIMERA1 łatwo już policzyć różnicę pomiędzy ostatnim a poprzednim przerwaniem.
    Czy jeszcze coś źle zrozumiałem?
REKLAMA