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

Odmierzanie 1 sekundy przez Timer0 (ATmega8)

adrian408 15 Wrz 2010 11:02 3307 8
REKLAMA
  • #1 8512523
    adrian408
    Poziom 16  
    Witam. Mam pytanie. Jak odmierzyć 1 sekundę przez Timer0 dla określonego kwarcu (np. 18,432 MHz)? Znalazłem pewien temat na elektrodzie ale tam jest opisane odmierzanie 1 sekundy dla Timera1 a o Timer0 jest tylko wspomniane i nic z tego nie rozumiem.
    Oto ten temat: https://www.elektroda.pl/rtvforum/topic1448633.html
    Byłbym wdzięczny za pomoc jak to się wylicza.
  • REKLAMA
  • #2 8512555
    tadzik85
    Poziom 38  
    Podobnie jak w tam. Ale aby uzyskać 1s licznik musi się przepełnić kilka razy. Dlatego np. ustalasz sobie tak by licznik liczył 50ms. w przerwaniu inkrementujesz jakąś zmienną i czekasz aż osiągnie wartość 20.
  • REKLAMA
  • #3 8512617
    adrian408
    Poziom 16  
    Hmm dalej dla mnie to jest czarna magia. Głównie chodzi mi o to skąd wzięła się wartość 58275 w tym podprogramie. Nie umiem tego rozgryźć. Użyty w tym programie Prescaler=1 a crystal=18432000

    Odmierz_1s:                                                'Podprogram dla Timera0 (wyznaczanie 1sek).
    
      Timer0 = 1                                                'Do Timera0 dodaj sześć i zapamiętaj jako Timer0 (zliczy 255).
    
      Incr Liczba_przerwan_tim0                                 'Liczbę przerwań Timera0 powiększ o jeden.
    
      If Liczba_przerwan_tim0 = 58275 Then                      'Jeśli liczba przerwań Timera0 jest równa 58275, to...
    
      'Liczbą 58275 ustalamy dokładny pomiar.
    
      Liczba_przerwan_tim0 = 0                                  'Wyzeruj zmienną.
    
      Wynik_pomiaru = 65536 * Lczba_przep_tim1                  'Zmienną Liczba_przep_tim1 pomnóż przez 65536, a wynik wstaw do zmiennej Wynik_pomiaru.
    
      Wynik_pomiaru = Wynik_pomiaru + Timer1                    'Wynik powyższego działania dodaj do aktualnej zawartości Timera1 i ten wynik wpisz do zmiennej Wynik_pomiaru.
    
      Timer1 = 0                                                'Zeruj Timer1.
    
      Flaga_aktual_lcd = 1                                      'Załącz flagę aktualizacji Lcd.
    
      Lczba_przep_tim1 = 0                                      'Zeruj flagę przepełnień Timera1.
    
       End If                                                   'Koniec uwarunkowania.
    
     Return                                                     'Wróć do programu.
    
  • #4 8512638
    tadzik85
    Poziom 38  
    1s odpowiada częstotliwości 1 Hz.

    F_CPU/preskaler/wartość licznika = 1Hz
  • REKLAMA
  • #5 8512670
    adrian408
    Poziom 16  
    a tutaj jaka jest wartość licznika? Przepraszam za takie proste i dla niektórych oczywiste pytania ale pierwszy raz uczę się obsługiwać Timer'y
  • REKLAMA
  • #6 8512678
    tadzik85
    Poziom 38  
    Tą wartość należy wyznaczyć.
    a tu lektura Link
  • #8 8513090
    gaskoin
    Poziom 38  
    adrian408 napisał:
    Przepraszam za takie proste i dla niektórych oczywiste pytania ale pierwszy raz uczę się obsługiwać Timer'y


    Obsługa jest bardzo skomplikowana. Timer0 posiada tylko konfigurację preskalera + ewentualne włączenie przerwania od przepełnienia. Cała reszta nie ma nic z nim wspólnego.

    Aby odliczyć 1s to trzeba naliczyć 18432000 taktów zegara (przy preskalerze = 1) na co licznik nie pozwoli, bo maksymalnie może policzyć do 255.

    Dla największego preskalera (1024) licznik musi doliczyć do 18000, czego zrobić się nie da. Trzeba więc to rozbić na kilka etapów. Najlepiej 72 razy liczyć do 250 :) Można to zrealizować w przerwaniu (jeżeli chcesz odmierzyć czas) albo w pętli jak chcesz opóźnienie
  • #9 8513176
    adrian408
    Poziom 16  
    Wszystko już zrozumiałem :) Dziękuję wszystkim za pomoc i uważam temat za zamknięty.
    Pozdrawiam
REKLAMA