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

Bascom AVR: Czy Timer1 w ATmega8 dokładnie odmierza 250ms przy 4MHz?

Pfemek 22 Lis 2005 11:28 1215 7
REKLAMA
  • #1 2014517
    Pfemek
    Poziom 24  
    Posty: 1038
    Pomógł: 83
    Ocena: 342
    Witam. Nie znalazłem informacji na ten temat więc piszę. Na ile w bascomie prawdopodobne jest że odmierzenie czasu 250ms za pomocą Timer1 jest prawdziwe? Kwrac 4000000, atmega8.

    Config Timer1 = Timer , Prescale = 64
    Enable Interrupts
    Enable Timer1
    on timer1, 250ms
    timer1=46875

    do
    loop

    250ms:
    timer1=46875
    'program co 250ms
    return

    Dobry jest ten przykład? :) W programie potrzebuję co 1/4 sekundy wykonywać kilka instrukcji...
  • REKLAMA
  • #2 2014702
    wicy
    Poziom 22  
    Posty: 670
    Pomógł: 30
    Ocena: 111
    Cytat:
    Na ile w bascomie prawdopodobne jest że odmierzenie czasu 250ms za pomocą Timer1 jest prawdziwe?


    Odp. prawdopodobieństwo 99,99999 %

    Na Timer1=46875 procesor też potrzebuje bodajże ze 2 takty zegara, więc właściwe polecenia następne zostaną wykonane co 250ms + 0,5us.
  • REKLAMA
  • #3 2014745
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    A skąd wytrzasnąłeś te 46875 :?:
    Pisano o tym setki razy , ale powtórzę ;)
    przyklad w Bascomie:
    
    $Crystal = 4000000
    Const T1_value = 65536 - ( _xtal / 64 / 4)
    ...
    Timer1 = T1_value
    

    Zważywszy , że Bascom generuje procedury przerwania ... powiedzmy nieciekawie , to proponuję zmodyfikować stałą T1_value do postaci Const T1_value = 65536 - ( _xtal / 64 / 4) +1 i masz "dość precyzyjne" przerwanie , co 250 ms(do zegarka sie nie nada).

    Piotrek

    PS
    Dla 46875 przy 4MHz kwarcu , to ~300ms
    Poczytaj o trybie CTC dla timera(ów)
  • REKLAMA
  • #4 2014951
    Pfemek
    Poziom 24  
    Posty: 1038
    Pomógł: 83
    Ocena: 342
    Już wszystko kapuję. Wstyd się przyznać ale zapomniałem do ilu zlicza 16bitowy Timer... :) Mam jeszcze jedno pytanie. Czy w takiej formie:

    timer1=0
    do
    if timer1=15625 then
    'lista rozkazów
    timer1=0
    end if
    loop

    bedę miał bardzo blisko 250ms przy ustawieniu timera jak w listingu z pierwszego postu? Moje obliczenia do tego: 4000000/64/4=15625
  • REKLAMA
  • #5 2014998
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Pfemek napisał:

    ...
    bedę miał bardzo blisko 250ms przy ustawieniu timera jak w listingu z pierwszego postu? Moje obliczenia do tego: 4000000/64/4=15625

    Przy takim warunku If Timer1=15625 Then... , to na jego spełnienie możesz czekać 250ms ale i 250 minut,godzin,dni, a może nawet lat ;)
    Nie zapominaj ,że timer ciągle zmienia swoją wartość i musiał byś się idealnie "wstrzelić" , by odczytać akurat 15625.Zmień lepiej na If Timer1=>15625 Then... lub If Timer1>15624 Then....

    Piotrek
    PS
    Może lepiej wykorzystać do tego zadania flagę TOV1 :?:
    
    'przykład dla ATTint2313
    ...
    Timer1=65536-15625
    Do
       Set TIFR.7   'Skasuj TIFR.TOV1
       While TIFR.7 = 0 : Wend
       'zrób coś
       Timer1=65536-15625
    Loop
    ...
    
  • #6 2015056
    Pfemek
    Poziom 24  
    Posty: 1038
    Pomógł: 83
    Ocena: 342
    Program działa i nawet licznik się zatrzymuje tylko jaką mam pewność że jest to 250ms? chodzi mi o to żeby uzyskać jak największą dokładność. Dzięki za ten przykład, spróbuję...
  • Pomocny post
    #7 2015101
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Pfemek napisał:
    Program działa i nawet licznik się zatrzymuje tylko jaką mam pewność że jest to 250ms? chodzi mi o to żeby uzyskać jak największą dokładność. Dzięki za ten przykład, spróbuję...

    Nie wiem dokładnie , do czego Ci to potrzebne ale przykład z przerwaniem , który podałem wcześniej działa z dokładnością do ~2 cykli zegara(500)ns.Czy to niezbyt dokładnie :?:

    Piotrek
  • #8 2015112
    Pfemek
    Poziom 24  
    Posty: 1038
    Pomógł: 83
    Ocena: 342
    Dzieki, takiej odpowiedzi potrzebowałem, wykorzystam przerwanie. :)

    Pozdrawiam...

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy dokładności odmierzania czasu 250 ms za pomocą Timer1 w mikrokontrolerze ATmega8 przy częstotliwości zegara 4 MHz i preskalerze 64 w środowisku Bascom AVR. Wskazano, że wartość 46875 dla Timer1 jest niepoprawna i odpowiada około 300 ms, a prawidłowa wartość do ustawienia przerwania co 250 ms to 65536 - (4000000 / 64 / 4) = 15625. Zwrócono uwagę, że Timer1 jest 16-bitowy i liczy od 0 do 65535, dlatego należy odpowiednio ustawić wartość startową. Zalecane jest użycie warunku sprawdzającego, czy Timer1 osiągnął lub przekroczył wartość 15625, zamiast dokładnego porównania, aby uniknąć pominięcia momentu przerwania. Sugerowano także wykorzystanie flagi przepełnienia TOV1 do precyzyjnego odmierzania czasu. Przerwania generowane przez Bascom mają dokładność rzędu około 2 cykli zegara (około 500 ns), co jest wystarczające do realizacji zadania wykonywania instrukcji co 1/4 sekundy. Wskazano również możliwość użycia trybu CTC dla timerów w celu poprawy precyzji odmierzania czasu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA