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

Atmega16 odliczanie czasu CTC i timer0 Bascom

tengu 08 Lis 2010 14:53 3042 8
REKLAMA
  • #1 8717735
    tengu
    Poziom 21  
    Czy ktoś mógłby mi łopatologicznie wytłumaczyć o co w tym chodzi?

    Napisałem prosty program do odliczania 1 sekundy i albo się spieszy, albo spóźnia ok 3 sek na 5min. Próbowałem już wielu ustawień tccr0 dla ctc i z identycznym skutkiem...

    Procek to Atmega16, kwarc zewnętrzny 8MHz, prescaler 64, odliczam 125 lub 124 i ciągle wariacje.

    Jak powinienem poustawiać te bity do prawidłowej pracy w trybie ctc? z góry dziękuję za pomoc.
  • REKLAMA
  • #2 8717743
    korrus666
    Poziom 40  
    A nie pomyślałeś że kwarc to nie ma równo 8MHz tylko ma jakąś odchyłkę. Musisz to uwzględnić i sobie ustawić liczbę zliczanych impulsów. Jak odliczasz 125 to masz 1000 przerwań na sek (teoretycznie). W praktyce będzie to trochę mniej lub więcej. Zależy to jeszcze w jakimś stopniu od temperatury otoczenia.
  • #3 8717747
    tengu
    Poziom 21  
    Zgadza się, ale aż 3sek w ciągu 5min? To chyba za dużo?
  • REKLAMA
  • REKLAMA
  • #5 8717848
    tengu
    Poziom 21  
    Super. A mam dokonywać pomiaru z dokładnością do 1/100sek... Teraz doszedłem do 2sek na 12min... Może ktoś ma sprawdzone ustawienia tego tccr0 i wszystkiego co potrzebne do w miarę dokładnej pracy. Czytałem forum kilka razy i nic nie mogłem konkretnego wyszukać. Z tego co czytałem to można uzyskac 2 sek na dobę, tylko jak?
  • REKLAMA
  • Pomocny post
    #6 8717886
    korrus666
    Poziom 40  
    Musisz naleźć takie wartości do zliczania przerwań z zegara przy których uzyskasz największą dokładność. Możesz też spróbować użyć rezonatorów zegarkowych:
    32.768kHz
    4.194304MHz.
    W nich częstotliwość jest potęgą dwójki stąd łatwo się dzieli do uzyskania 1Hz. Może będą też dokładniejsze ale kto wie.
  • #7 8719753
    tengu
    Poziom 21  
    Na częstościomierzu wyszło mi, że kwarc działa z częstotliwością 8000001więc chyba aż takiej odchyłki nie powinno być? Kombinuję już na wszystkie sposoby (mi znane)...
  • #9 8720683
    tengu
    Poziom 21  
    
    
    $regfile = "m16def.dat"
    
    $crystal = 8000000
    
    
    Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
    Config Lcd = 20 * 4
    
    
    Set Tccr0.wgm01
    Set Tccr0.com01
    
    Config Timer0 = Timer , Prescale = 64 , Clear Timer = 1
    
    Ocr0 = 125
    
    
    
    
    '****Zmienne****
    Dim W_bcd As Byte
    Dim Zezw_wys As Bit
    Dim Odsw_wys As Byte
    Dim 1sek As Byte
    Dim 1min As Byte
    Dim 1sek_p As Byte
    Dim 1min_p As Byte
    Dim 1dzies_p As Byte
    Dim Licz_1ms As Byte
    Dim Licz_1ms_p As Byte
    
    Dim Licz_10ms As Byte
    Dim Licz_1s As Byte
    
    
    Dim Odczyt_adc As Word
    
    
    
    Declare Sub W_menu
    Declare Sub W_menu_l
    Declare Sub W_odczyt
    
    
    Deflcdchar 0 , 31 , 16 , 16 , 30 , 16 , 16 , 31 , 2
    
    
    
    
    
    
    Enable Interrupts
    On Oc0 1s
    Enable Oc0
    
    
    Cls
    Cls
    
    
    
    
    Do
    
    Home
      Lowerline
                              Lcd "CZAS:"
                              Locate 2 , 9
                              W_bcd = Makebcd(1min_p)
                              Lcd Bcd(w_bcd) ; ":"
    
                              Locate 2 , 12
                              W_bcd = Makebcd(1sek_p)
                              Lcd Bcd(w_bcd) ; ":"
    
                              Locate 2 , 15
                              W_bcd = Makebcd(1dzies_p)
                              Lcd Bcd(w_bcd)
    
    Loop
    End
    
    
    
    1s:
    
    Incr Licz_1ms
    
       If Licz_1ms = 10 Then
          Licz_1ms = 0
    
        Incr 1dzies_p
         If 1dzies_p = 100 Then
            1dzies_p = 0
         Incr 1sek_p
          If 1sek_p = 60 Then
            1sek_p = 0
          Incr 1min_p
          If 1min_p = 60 Then
             1min_p = 0
          End If
         End If
        End If
       End If
    Return
    


    Dodano po 2 [godziny] 42 [minuty]:

    Wygląda na to, że winowajcą był ipod i jego stoper... Kwarc też wariował. Dziękuję za pomoc. Temat uważam za zamknięty.
REKLAMA