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]ATmega8 Timer jako licznik

filipo96 27 Paź 2010 09:32 5335 7
REKLAMA
  • #1 8668958
    filipo96
    Poziom 11  
    Cześć.
    Zaczynam programować i potrzebuję obliczyć lub policzyć ile trwa jedna pętla(Do-Loop) w moim programie(wiem tyle, że trzeba wykorzystać Timer tylko nie umiem się nim obsługiwać:cry:).
    Proszę o przykłady i także o brak wypowiedzi typu zajrzyj do help-a(bo patrzyłem).
  • REKLAMA
  • #2 8669048
    nsvinc
    Poziom 35  
    No niestety:
    zajrzyj do helpa. Dokładniej tu, gdzie jest opisane jak:
    - skonfigurować timer
    - włączyć timer
    - wyłączyc timer
    - odczytać stan timera

    Pseudokod:
    
    SKONFIGURUJ TIMER
    ZRESETUJ TIMER
    
    DO
    WLACZ TIMER
    (tu kod ktory sprawdzasz)
    WYLACZ TIMER
    ODCZYTAJ TIMER
    (tu obsluga wartosci wzietej z timera)
    ZRESETUJ TIMER
    LOOP
    

    Zeby takie pomiary były wartościowe, musisz mieć wyłączone przerwania, bo jeśli przerwanie wystąpi ci w trakcie wykonywania 'mierzonego' kodu, będziesz miał przekłamane wyniki...
  • REKLAMA
  • #3 8669055
    filipo96
    Poziom 11  
    Mnie tak dokładniej chodzi o obsługę wartości wziętej z timera i odczytanie.
  • #4 8669104
    nsvinc
    Poziom 35  
    Załóżmy:

    Zegar = 8MHz
    Preskaler = 64
    Obliczenia: 1 / (8MHz / 64) [us]
    Efekt: timer "cyknie" co 8mikrosekund. Przepełnienie timera (przy 8 bitach) będziesz miał co 256x8us = 2048us, czyli trochę ponad 2ms...Na to przepełnienie możesz włączyć przerwanie, a w nim zwiększać niezależny licznik (jakąś zmienną).
    Wtedy wynik:

    CZAS[us] = ( ILOSC_PRZERWAN * 2048 ) + ( BIEZACA_WARTOSC_TIMERA * 8 )

    Gdy odczytasz timer, a od jego resetu do "teraz" timer naliczył np. 120 "cyknięć" a timer nie zdążył się przepełnić, to od startu do teraz minęło 8 x 120 = 960us...
  • REKLAMA
  • #5 8669133
    filipo96
    Poziom 11  
    Mam takie coś.
    Co jest nie tak?

    $regfile = "m8def.dat"
    $crystal = 8000000
    $sim

    Config Timer0 = Timer , Prescale = 64
    Config Portd = Output
    Portd.0 = 0
    Portd.1 = 0
    Portd.2 = 0



    Dim Sekundnik30 As Byte
    Dim Minutnik As Byte
    Dim W As Byte

    Led1 Alias Portd.0
    Led2 Alias Portd.1
    Led3 Alias Portd.2
    Stop Timer0
    Timer0 = 0


    Do
    Start Timer0



    Wait 1
    Led1 = 1
    Wait 1
    Led1 = 0
    Incr Sekundnik30
    Incr Minutnik

    If Sekundnik30 = 30 Then
    Led2 = 1
    Wait 1
    Led2 = 0
    Sekundnik30 = 0
    End If

    If Minutnik = 60 Then
    Led3 = 1
    Wait 1
    Led3 = 0
    Minutnik = 0
    End If
    Stop Timer0
    Timer0 = W




    Loop

    End
  • #7 8669166
    filipo96
    Poziom 11  
    Migają diody.
    Chciałem obliczyć ile trwa pętla, a $sim jest potrzebne, bo nie wrzucam do procesora tylko do symulatora.
  • REKLAMA
REKLAMA