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

on timer odmierzanie czasu

Sław1980 01 Maj 2009 14:58 4482 17
REKLAMA
  • #1 6478263
    Sław1980
    Poziom 17  
    Hej!
    Czy ktoś wie jak wykorzystać timer atmegi 8, który w danym momencie programu zacznie odmierzać czas powiedzmy 3minuty (bez wpływu na program główny) i po upływie tego czasu skoczy do jakiegoś podprogramu?
    Szukam i szukam w necie i próbuję i nic z tego. Wydaje mi się, że można wykorzystać w Bascomie polecenie ON TIMER (liczba sekund) GOSUB (procedura do zrobienia) ale nie potrafię tego uruchomić.
    Proszę o pomoc
    Z góry dzieki
  • REKLAMA
  • #3 6478377
    dawid512
    Poziom 32  
    Tyle że kolega chciał w Bascomie :). Polecam help do bascoma. Konfigurujesz timer, uruchamiasz go i gdy zliczy pewną ilość impulsów wywołuje przerwanie.
  • #4 6478517
    Sław1980
    Poziom 17  
    A czy mógłbym prosić o jakiś konkretny przykład? Albo poprawić ten:

    Config Timer0 = Timer , Prescale = 1024
    On Timer(15) Gosub procedura     'czekaj 15sec.
    Timer On
    Do
    Loop
    End
    Procedura:
    Cls
    Lcd "ok"
    Waitms 500
    Return
  • #5 6478716
    dawid512
    Poziom 32  
    Config Timer0 = Timer , Prescale = 64
    On Timer0 Odmierz_1s                                        'podprogram wykonywany podczas wystapienia przerwania
    Dim Licz_8ms As Byte                                        'deklaracja zmiennej
    
    Enable Interrupts                                           'aktywacja globalnego systemu przerwan
    
    Enable Timer0                                               'aktywacja timera0
    
    Counter0 = 131                                              'wpisanie wartosci początkowej do timera0
    
    Dim Sek As Byte                                             'deklaracja zmienna zawierajaca wartosc sekund oraz jej wartosc poczatkowa
    
    
    
    ......
    
    
    '*********** podprogram wykonywany w czasie przerwania ********************************
    Odmierz_1s:
    
    Counter0 = 131
    
    Incr Licz_8ms
    
    If Licz_8ms = 125 Then
    
    Licz_8ms = 0
    
    Incr Sek
    
    End If
    
    Return
  • REKLAMA
  • #6 6478814
    Konto nie istnieje
    Poziom 1  
  • #7 6479053
    Sław1980
    Poziom 17  
    No właśnie nie mogę skumać zasady działania timerów. W programie który napisał "dawid512" odmierzana jest 1s co zrobić żeby odmierzane było 180s a program główny działał normalnie, może counter0=counter0*(jakaś wartość) albo wykorzystać polecenie LOAD?? W moim programie chodzi mi tylko o wygenerowanie na wyświetlaczu napisu co 180Sekund Nic więcej. Skoro timery można wyłączyć i włączyć można to zarobić funkcją Timer on, Timer off w danym miejscu programu głównego?
  • #8 6479361
    Wojtek75
    Poziom 24  
    W kodzie który wrzucił david512 zwróć uwagę na tą linie:
    If Licz_8ms = 125 Then

    Chodzi mniej więcej o to, że jeżeli zmienna Licz_8ms osiągnie wartość 125 to znaczy że została odmierzona 1s (125 x 0.008 = 1). I teraz dla przykładu jeżeli chcesz osiągnąć odcinek czasu o długości 180s to wystarczy że pomnożysz 180 x 125 = 22500 i osiągniesz wartość 180sek.
    Czyli dla twoich potrzeb powinno to wyglądać mniej więcej tak:
    Dim Licz_8ms as Word
    ......
    ......
    If Licz_8ms = 22500 Then

    Oczywiście dobierając odpowiednio wartość prescalera i wartości ładowanej do licznika można tą liczbę zmniejszyć do jakiegoś bardziej optymalnego (czyt. mniejszego) rozmiaru.
    W kodzie davida brakuje mi jeszcze bardzo istotnej wartości oscylatora (rezonatora) dla jakiego obliczana jest wartość 0,008s

    pozdr.

    #edit Dodam jeszcze że sam jestem na etapie nauki więc jeżeli popełniam gdzieś błąd to niech mnie bardziej doświadczeni koledzy wyprostują :)
  • #10 6479685
    _Robak_
    Poziom 33  
    Cytat:
    P.S. używam kwarcu 4MHz

    W takim razie na pewno sie nie uda. Chyba ze bedziesz zliacz przerwania i co ktores wykona sie porgram. Oczywiscie musisz wtedy uwzglednic czas potrzebny na obsluge przerwan i odpowienio zmodyfikowac ilosc zliczanych impulsow. Tylko nie wiem na ile mozna w bascomie liczyc na powtarzalnosc czasu wykonywania kodu.
  • #11 6480109
    dawid512
    Poziom 32  
    Małe sprostowanie obliczenia były dla zegara 8MHz.
    Do autora tematu: nie ma możliwości abyś uzyskał przerwanie co 180s ! Chyba że użyjesz kwarcu 32.768kHz co jednak znacznie spowolni procka. Proponuję abyś zrobił tak jak radzi kolega Wojtek75.
  • REKLAMA
  • #12 6480488
    Konto nie istnieje
    Poziom 1  
  • #13 6488680
    Sław1980
    Poziom 17  
    Dzięki "emarcus" działa wyśmienicie :) teraz muszę to połączyć z moim programem JESZCZE RAZ DZIĘKI! POZDR!

    Dodano po 4 [godziny] 4 [minuty]:

    No i kolejna przeszkoda.... Chcę ten programik dodać do mojego głównego programu i chcę żeby dzałał on w pętli tylko wtedy gdy powiedzmy pind.0=0 niestety nie udaje mi się przerobić go tak aby odliczał czas i pokazał komunikat nie raz, ale za każdym razem w konkretym miejscu. Nie ogarniam czy trzeba za każdym razem wyłaczać timer i przerwania żeby powtórzyć operację odliczania??
  • #15 6508143
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #16 6514034
    Sław1980
    Poziom 17  
    ok czyli taki programik powinien działać?
    
    $regfile = "m8def.dat" 
     $crystal = 4000000
     
    Config portd = input
    Config Portb = Output               'lcd display 
    Const Timer1reload = 62500      ' tyle tikow zegara potrzeba dla 1 sec. 
    Config Timer1 = Timer , Prescale = 64 
    Dim Czas As Byte 
    load timer1 , Timer1Reload 
    on ovf1 Timer1_isr 
    enable timer1 
    start timer1 
    Enable Interrupts 
    
    Cls
    Do
    lcd "czekaj na pind..."
    waitms 200
    If pind.0 = 0 then
    gosub Timer1_ISR
    else
    end if  
    Loop
    end 
    
    Timer1_ISR: 
       load timer1, Timer1Reload 
       Incr Czas 
       If Czas = 180 Then 
       Cls 
       Lcd "TIME OUT- 3 min"
       waitms 200
       Cls 
       End If 
       return
    

    niestety nie działa poprawnie poniważ odlicza czas 3 minut ale tylko raz. Później niby skacze do "Timer1_ISR" ale nie odlicza ponownie czasu 3 minut i nie wyświetla na lcd info TIME OUT. Gdzie twki błąd?

    Kod umieszczamy w znacznikach [code] - proszę o tym pamiętać.
    [zumek]
  • #17 6514781
    Konto nie istnieje
    Poziom 1  
  • #18 6518882
    Sław1980
    Poziom 17  
    Fajniście to pokazałeś "e marcus"! Dzieki! Przerobiłem co nieco jeszcze i teraz w końcu śmiga tak jak chciałem. Gdybym miał jeszcze jakieś wątpliwości to na pewno zapytam. Szkoda że w ksiażkach jest to napisane zawile i niezrozumiale a tu proszę jak ktoś wytłumaczy to od razu inaczej ;D
REKLAMA