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

Dokładne odmierzanie czasu w Bascom

aabbaa11 10 Cze 2009 17:09 3527 3
REKLAMA
  • #1 6639428
    aabbaa11
    Poziom 11  
    Witam wszystkich! Mam pewien problem i nie wiem jak go rozwiązać. Potrzebuję w bascomie program do odmierzania 10 minut. Funkcją wait nie da się dokładnie odmierzyć takiego czasu (błąd na 10 minutach wynosi ok.30s). Jestem początkujący lecz napisałem program odmierzający 10 minut. Problem wygląda następująco: Dlaczego poniższy program nie odmierza mi dokładnie 600s tylko ok. 615s? Czy takie odmierzenie czasu dokładne jest w ogóle możliwe? Używam do niego kwarca 8MHz kondensatory 27pF Fuse bits są dobrze ustawione.
                   $regfile = "m8def.dat"
                                $crystal = 8000000
    
    
        Config Portd.7 = Output
         Config Portb.2 = Input
         Portd.7 = 0
    
    
    
      Config Timer0 = Timer , Prescale = 256
      On Timer0 Odmierz1s
      Enable Interrupts
    
      Enable Timer0
      Dim Licz8ms As Byte
      Dim Odmierz1s As Word
      Load Timer0 = 250
      Do
      Loop
      End
      Odmierz1s:
      Load Timer0 = 250
      Incr Licz8ms
      If Licz8ms = 125 Then                                     'po 125 przerwaniach czyli 1s nastąpi skok do drugiego podprogramu
    
      Gosub Podprogram
            Licz8ms = 0
    
    
      End If
    
      Return
      Podprogram:
      Incr Odmierz1s
      If Odmierz1s = 600 Then                                   'po 600s włączenie przekaźnika
    
            Portd.7 = 1
            End If
                If Odmierz1s = 1200 Then                        'po 1200s wyłączenie przekaźnika
         Portd.7 = 0
    
              Odmierz1s = 0
    
               End If
               Return
  • REKLAMA
  • #2 6639517
    M. S.
    Poziom 34  
    Jak możesz to zastosuj kwarc 4194304Hz na timerze 16bit przy preskalerze 64. Timer nie niepokojony niczym zgłosi ci przerwanie równo po 1 s.
  • REKLAMA
  • Pomocny post
    #3 6639692
    pixel7
    Poziom 23  
    Możesz użyć kwarc 32768 i podłączyć go jak zwykły kwarc, mege puścić na wewnętrznym. Uruchomić zegar "config clock" i masz dość dokładny zegar. Możesz użyć sectic, Poszukaj w helpie.
  • Pomocny post
    #4 6640099
    janbernat
    Poziom 38  
    Zawsze jak wchodzisz w przerwanie np.On Timer lub w podprogram sub procesor odkłada zawartość pewnych rejestrów na stos (co zajmuje mu ileś us) a po przerwaniu (lub sub-ie) zdejmuje ze stosu (co znowu zajmuje czas).
    Rachunkowo wygląda wszystko dobrze w programie-ale tylko gdy procesor chodzi z nieskończoną prędkością.
    A chodzi ze skończoną.
    A-w tych przerwaniach i podprogramach też coś robi.
    Te błędy się sumują-po kilka-dziesiąt us-ale jednak.
    Możesz obliczyć lub zmierzyć doświadczalnie jak zmienić load timer.
    Możesz też zastosować zewnętrzny zegar RTC DS1307,PCF8583 itp. dać trymer-wprowadzić odczyt lub przerwanie-i błędy się nie sumują.
REKLAMA