Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

timery

zibi11 18 Apr 2004 20:54 1749 7
  • #1
    zibi11
    Level 19  
    Witajcie mam pytania i tak
    mam 90s8515 z kwarcem 8M
    są dwa timery chciałbym żeby ich wartości zmieniały się co 1 sekunde
    i jak zrobic żeby timer0 liczył większe wartości niż 255
    dlaczego timer0 liczy z inną prędkością niż timer1?

    $regfile = "8515def.dat"
    $crystal = 8000000
    Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portb.5 , Rs = Portb.6
    Config Lcd = 24 * 2 'configure lcd screen
    Config Timer0 = Timer , Prescale = 8
    Config Timer1 = Timer , Prescale = 8
    Dim W As Word
    Declare Sub Licz100
    Do
    Cls
    Timer1 = W
    W = Timer1
    Lcd Tcnt0
    Lowerline
    Lcd W

    Waitms 255
    Waitms 255
    Loop
  • #2
    GienekS
    Level 32  
    To ze te timery licza Ci inaczej to znaczy ze masz rozno ustawione preskalery do tych liczników. Jednej sekundy na takim kwarcu nie uzyskasz. Bedziesz musiał albo zastosować sygnał zewnętrzny albo licznik programowy dla timerów.
  • #3
    zibi11
    Level 19  
    w jaki sposób zrobić sygnał zewnętrzny jaki kwarc gdzie go podpiąć
  • #4
    fantom
    Level 31  
    Albo odmierzac mniejsze jednostki czasu np 10ms i zmieniac zmienna ktora podaje ich ilosc.Jesli ta zmienna osiagnie wartosc 100 to wowczas zmieniasz zmienna przechowujaca sekundy.Tak sie to robi w praktyce.
  • #5
    zibi11
    Level 19  
    może jakiś przykład??? :(
  • #6
    sokmarcin
    Level 20  
    czesc

    w zalaczniku masz fajny program do obliczania czsow przerwan dla procesorow AVR

    w praktyce wyglada to np tak:
    ustawiasz timer0 tak zeby przerwanie wystepowalo co 2 ms

    config timer0 = timer, prescale = 64
    ...
    ...
    counter0 = 6
    start timer0

    przy kwarcu 8MHz, timerze0 (8 bitow) i preskalerze 64, timer zwiekszany jest co 8 us
    256 - 6 = 250 :)
    250 * 8 us daje 2 ms

    teraz wykozystujesz dowolna zmienna ktora zwiekszasz o jeden po wystapieniu przerwania
    tworzysz warunek ze jezeli ta zmienna bedzie wynosila 500 ( 500 * 2 ms = 1 s) to zwiekszasz nastepna zmienna, ta zerujesz i zaczynasz od poczatku

    przykladowy program moze wygladac tak:


    config timer0 = timer , prescale = 64

    dim setne as word
    dim sekundy as byte

    enable interrupts
    enable timer0

    on timer0 setne

    counter0 = 6
    start timer0

    do
    loop

    setne:

    counter0 = 6
    start timer0

    inrc setne

    if stetne = 500 then

    inrc sekundy
    setne = 0

    else
    end if

    return

    jak chcesz minuty zliczasc to trzeba wykozystac jeszcze jedna zmienna i tak dalej
  • #7
    zibi11
    Level 19  
    Wielkie dzięki
    Witajcie a jak zrobić żeby można wyświetlać oba liczniki naraz???
    coś rzem mi nie idą osobno tak liczniki co 1 sekunde

    $crystal = 8000000
    Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portb.5 , Rs = Portb.6
    Config Lcd = 24 * 2 'configure lcd screen
    Config Timer0 = Timer , Prescale = 64
    Config Timer1 = Timer , Prescale = 64
    Dim Setne As Word
    Dim Sekundy As Byte
    Dim Setne1 As Word
    Dim Sekundy1 As Byte
    Enable Interrupts
    Enable Timer0
    Enable Timer1
    On Timer0 Setne
    On Timer1 Setne1
    Counter0 = 6
    Start Timer0
    Counter1 = 3036
    Start Timer1
    Do
    Cls
    Lcd Sekundy
    Lowerline
    Lcd Sekundy1
    Loop

    Setne:
    Counter0 = 6
    Start Timer0
    Incr Setne
    If Setne = 500 Then
    Incr Sekundy
    Setne = 0
    Else
    End If
    Return

    Setne1:
    Counter1 = 3036
    Start Timer1
    Incr Setne1
    If Setne1 = 2 Then
    Incr Sekundy1
    Setne1 = 0
    Else
    End If
    Return