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 735 13
REKLAMA
  • #1 17949411
    Jacek212
    Poziom 13  
    Posty: 292
    Pomógł: 2
    Ocena: 16
    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  
    Posty: 5502
    Pomógł: 739
    Ocena: 657
    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.
  • Pomocny post
    #4 17949455
    excray
    Poziom 41  
    Posty: 5502
    Pomógł: 739
    Ocena: 657
    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.
  • REKLAMA
  • Pomocny post
    #6 17949482
    excray
    Poziom 41  
    Posty: 5502
    Pomógł: 739
    Ocena: 657
    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
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    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  
    Posty: 292
    Pomógł: 2
    Ocena: 16
    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?
  • REKLAMA
  • Pomocny post
    #9 17950023
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    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.
  • #10 17952146
    Jacek212
    Poziom 13  
    Posty: 292
    Pomógł: 2
    Ocena: 16
    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
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    Ż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  
    Posty: 292
    Pomógł: 2
    Ocena: 16
    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?

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy działania rejestru ICR1 w Timerze1, szczególnie w kontekście liczenia taktów między zboczami sygnału. Użytkownik pyta, czy różnica wartości w ICR1 odpowiada liczbie taktów zegara procesora. Odpowiedzi wskazują, że wartość w ICR1 jest zapisywana w momencie wystąpienia zdarzenia, a różnica między odczytami ICR1 zależy od konfiguracji timera, w tym ustawienia preskalera. W przypadku przepełnienia licznika TCNT1, użytkownicy wyjaśniają, że różnice są obliczane w sposób analogiczny do licznika kilometrów w samochodzie, gdzie po przepełnieniu licznik zeruje się. Wskazano również na konieczność obsługi przerwania TIMER1_OVF_vect, aby poprawnie zliczać przepełnienia i obliczać różnice czasowe między zboczami.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA