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

ATmega8 i pomiar czasu pojedynczych impulsów dodatnich.

delta85 15 Wrz 2006 21:34 3191 7
REKLAMA
  • #1 3023998
    delta85
    Poziom 16  
    Posty: 327
    Ocena: 9
    Witam
    Potrzebuje mierzyc czas pojedynczych impulsow dodatnich o czasie trwania od 0 do okolo 5 s podawanych na jedna z koncowek ATmega8 z kwarcem 4MHz. Moge zastosowac tylko Timer2. Jak wlaczyc ten timer po pojawieniu sie tego impulsu i jak go potem wylaczyc po jego zakonczeniu. No i jakich dokonac obliczen, aby czas trwania tego impulsu wyswietlic na wyswietlaczu LCD ? Zadowole sie dokladnoscia rzedu 1ms. Dodam jeszcze ze chodzi o Bascom i przepraszam jesli uznacie ze za duzo wymagam. Licze na jakas pomoc.
    Pozdrawiam
  • REKLAMA
  • #2 3024493
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Musze cie zmartwic. Timer 2 jest tylko 8 bitowy i przy maksymalnym czasie 5 sek dokladnosci 1ms nie uzyskasz. Maksimum 19 ms z chakiem.
    Jedynym rozwiazaniem to musisz ten licznik wydluzyc o jeden bajt zatrudniajac do tego przerwanie od Timet2, wtedy jest ta dokladnosc mozliwa do uzyskania.
  • REKLAMA
  • #4 3025422
    Platon
    Poziom 42  
    Posty: 9185
    Pomógł: 744
    Ocena: 170
    GienekS - a ilość przepełnien timera nie mozna zliczac sobie w jakims rejestrze/zmiennej?

    delta85 - jeżeli timer zlicza zegar procesora i jest 8 (nie wiem) bitowy, to kazdy takt to jest 1/4000000 sekundy. W 8 bitowym masz 256wartosci, czyli co 256*1/4000000sek (lub mniej niż 256 - to sobie dobierasz) masz przerwanie. Teraz liczysz sobie ile było przerwan i majac czas co jaki jest przerwanie, wiesz ile uplynelo czasu.
    Byc może da sie jeszcze uzyc jakiegos dzielnika z tym zegarem, wiec zamiast liczyc takty 1/4000000, bedize liczyl co 2, 8, 16 (zalezy jakie dzielniki)
  • REKLAMA
  • #5 3025969
    delta85
    Poziom 16  
    Posty: 327
    Ocena: 9
    Platon - rzeczywiscie masz racje.
    Wygladaloby to chyba tak : przy kwarcu 4MHz jeden takt zegara trwa 0.25us, co daje przerwanie po 64us (0.25us * 256 taktow, przy Preskale = 1). W obsludze przerwania nastepuje np. inkrementacja jakiejs zmiennej. Po zakonczeniu impulsu i zatrzymaniu timera2 trzeba pomnozyc wartosc tej zmiennej przez te 64us. I to bylby czas trwania impulsu. Czy tak ? Jeszcze tylko pozostaje jak w programie uchwycic ten moment poczatku i konca mierzonego impulsu, czyli kiedy ma zostac uruchomiony i zatrzymany timer. Myslalem uzyc instrukcji IF...Then ? A moze wiesz czy i jak moznaby zastosowac przerwania INT0 czy INT1 ?
    Dzieki z odzew, pozdrawiam
  • #6 3027364
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 131
    Wejścia przerwań możesz skonfigurować jako aktywne stanem niskim lub opadającym ewentualnie narastającym zboczem. Ustawiasz najpierw na zbocze narastające, teraz w obsłudze przerwania przestawiasz na aktywne zbocze opadające i włączasz licznik impulsów.
  • REKLAMA
  • #8 3033107
    delta85
    Poziom 16  
    Posty: 327
    Ocena: 9
    Witam ponownie
    Zrobilem tak : ustawiam jedna z koncowek portu procesora, co jest sygnalem dla pozostalej czesci ukladu do rozpoczecia generowania impulsu. W tym samym czasie uruchamia sie Timer2 zaczyna sie zliczanie przepelnien. Po zakonczeniu impulsu jego opadajace zbocze jest zrodlem przerwania INT1, co powoduje zatrzymanie Timer2. Teraz mnoze ilosc przerwan razy 256 oraz razy 0.25us. w wyniku otrzmuje czas trwania impulsu. Dzieki za pomoc.
    Pozdrawiam

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy pomiaru czasu trwania pojedynczych impulsów dodatnich o długości do około 5 sekund za pomocą mikrokontrolera ATmega8 z kwarcem 4 MHz, wykorzystując wyłącznie Timer2. Timer2 jest 8-bitowy, co ogranicza bezpośredni pomiar do około 19 ms przy rozdzielczości 1 ms. Rozwiązaniem jest rozszerzenie licznika o dodatkową zmienną, która zlicza przepełnienia timera w przerwaniu. Przy kwarcu 4 MHz jeden takt trwa 0,25 µs, a przy preskalerze 1 timer przepełnia się co 64 µs (256 taktów). W obsłudze przerwania Timer2 inkrementuje się zmienną zliczającą przepełnienia. Pomiar rozpoczyna się na narastającym zboczu impulsu, które wyzwala przerwanie zewnętrzne (INT0 lub INT1), a timer jest uruchamiany. Po zakończeniu impulsu, na opadającym zboczu, wyzwalane jest kolejne przerwanie, które zatrzymuje timer. Czas trwania impulsu oblicza się mnożąc liczbę przepełnień przez 256 i przez 0,25 µs. Konfiguracja przerwań może być dynamicznie zmieniana w trakcie działania programu, co umożliwia pomiar impulsów o długości do kilku sekund z dokładnością około 1 ms. Implementacja jest realizowana w Bascom.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA