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] - problem z timerem

niezly 16 Sty 2010 21:18 1320 7
REKLAMA
  • #1 7546265
    niezly
    Poziom 11  
    Witam.
    Mam taki problem i nie bardzo wiem czemu tak sie dzieje.
    Prosty programik:
    __________________________________________________
    ..........
    Config Portd = &B11111111
    Portd = &B00000111

    Config Timer0 = Timer , Prescale = 64
    On Timer0 Czas
    Enable Interrupts
    Enable Timer0
    Start Timer0

    Do

    Loop
    End

    Czas:

    Timer0 = 254
    Toggle Portd.0

    Return
    ________________________________________________________

    Na porcie D.0 generowana jest pewna częstotliwość. Problem polega na tym iż wszystko działa pięknie i książkowo do pewnej częstotliwości która przy kwarcu 8Mhz wynosi ok 32khz. W tym wypadku wynosi 31250 hz.
    Jeśli teraz próbuje ja zwiększyć poprzez zmniejszenie preskalera np. 8 lub wpisanie do timera np. 255 , tak że według obliczeń na tym porcie powinna być większa częstotliwość .... i tu problem, uparcie nie przekracza 32khz i koniec.
    Może to ktoś wyjaśnić bo nie bardzo rozumiem w czym problem.
  • REKLAMA
  • #2 7546332
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 7546489
    niezly
    Poziom 11  
    Zaspokoiłeś moją ciekawość w 100% i będe spał spokojnie :)
    Domyślałem się że taki może być tego powód choć przyznam że wydawało mi sie iż ta granica będzie odrobine wyżej.
    Dziękuję i pozdrawiam.
  • REKLAMA
  • #4 7548566
    mpo
    Poziom 12  
    Podepnę się pod wątek, bo temat pasuje :D
    atmega8 na wewnętrznym oscylatorze 8MHz i przerwanie zliczające sekundy:

    Config Timer0 = Timer , Prescale = 8 
    Load Timer0 = 100                                           'przerwanie co 0,1ms
    On Timer0 Odmierz_ms
    
    do
    loop
    end
    
    odmierz_ms:
    Load Timer0 = 100                                           
    Incr Licz_ms                                                
    If Licz_ms = 10000 Then                                '10000*0,1ms=1s
       Licz_ms = 0
    end if
    incr sekundy
    return


    Wszystko ok, tylko że zliczenie 10 sekund trwa realnie około 25 sekund.
    Gdzie robię błąd?

    ps.
    Wiem, że wewnętrzny oscylator nie nadaje się do odmierzania czasu, ale dokładność +/-10% nie gra roli.
  • #7 7548752
    mpo
    Poziom 12  
    landy13 napisał:
    Load Timer0 = 100
    Niewłaściwa składnia. Ma być:
    Load Timer0 , 100
    albo


    Faktycznie - pomogło. :D
    Ciekawe dlaczego bascom nie zgłosił błędu składniowego z tej okazji?

    A te sekundy faktycznie wewnątrz if-then. Źle przekleiłem fragment kodu...
  • REKLAMA
  • #8 7959991
    sknerek007
    Poziom 14  
    Przepraszam że odkopuję ten temat ale chciałbym prosić o cały program do timera .
REKLAMA