Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Zegar na Atmega8 spóźnia się

ariel440 04 Maj 2008 19:36 2962 10
  • #1 04 Maj 2008 19:36
    ariel440
    Poziom 9  

    witam, napisałem prosty zegar który niestety spóźnia się około 4sek na dobe,
    program pracuje na Atmega8 z zewnętrznym kwarcem i kondensatorami 33pF,
    próbowałem ten sam program z dwoma kwarcami 8MHz i 7,3728MHz z takim samym efektem,
    kwarce są w metalowych obudowach, kondensatory podpięte do masy,
    oczywiście Atmega8 przestawiony jest na prace z zewnętrznym kwarcem,
    układ zasilany jest stabilizowanym napięciem 5V,
    tak oto wygląda program z kwarcem 7,3728MHz

    Code:

    $regfile = "m8def.dat"
    $crystal = 7372800

    Dim S As Byte
    Dim M As Byte
    Dim G As Byte

    Dim K As String * 8

    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config Lcd = 16 * 2
    Cursor Off
    Cls

    Config Timer1 = Timer , Prescale = 256
    Enable Interrupts
    Enable Timer1
    On Timer1 Czas

    Cursor Off
    Cls
    Locate 2 , 1
    Lcd "Godzina "

    Do
    Locate 2 , 9
    If G < 10 Then Lcd "0"
    Lcd G ; ":"
    If M < 10 Then Lcd "0"
    Lcd M ; ":"
    If S < 10 Then Lcd "0"
    Lcd S
    Loop

    Czas:
    '7372800 / 256 = 28800
    '65536 - 28800 = 36736
    Timer1 = 36736
    If S = 59 Then
     S = 0
     If M < 59 Then : Incr M
     Else
      M = 0
      If G < 23 Then : Incr G
      Else : G = 0
      End If
     End If
    Else
     Incr S
    End If
    Return


    z kwarcem 8MHz program różni się tylko takimi liniami

    Code:

    $crystal = 8000000

    ...

    '8000000 / 256 = 31250
    '65536 - 31250 = 34286
    Timer1 = 34286


    moim zdaniem spóźnienie 4sek na dobe to jednak dużo,
    czy ktoś mógłby podpowiedzieć mi czym może być to spowodowane?

    0 10
  • #2 04 Maj 2008 19:57
    voytaschec
    Poziom 24  

    Nie zbudujesz dokładnego zegara bez układu RTC lub przynajmniej z wykorzystaniem kwarcu 32,768kHz. ATmegi podobno nie można podłączyć do takiego kwarcu (sam nie próbowałem, choć niektórym się to podobno udaje).
    Można wykorzystać wejście XCK (do zewnętrznego oscylatora USART) i podłączyć pod niego kwarc zegarkowy (32,768kHz), można też podłączyć ten kwarc pod któreś z przerwań (mało efektywne). Ale najlepszym rozwiązaniem będzie dodanie układu RTC np. PCF8583 (jeśli masz już gotową płytkę i nie chcesz dużo przerabiać to możesz dołączyć nawet w pająku) i napisać obsługę interfejsu I2C. Do tego jeśli dołożysz baterię do tego układu to będziesz miał podtrzymanie zegara przy braku zasilania głównego.

    0
  • #3 04 Maj 2008 20:00
    don diego
    Poziom 32  

    Wykorzystaj Timer2 w trybie asynchronicznym z kwarcem 32,768kHz.

    0
  • #4 04 Maj 2008 20:10
    asembler
    Poziom 32  

    4 sek na dobę to rewelacyjny wynik. Ja mam 38 sek na dobe w trybie asynchrownicznym na kwarcu 32768. Programowa korekcja raz dobe i po sprawie.

    0
  • #5 04 Maj 2008 20:17
    teedd
    Poziom 18  

    Potwierdzam - kwarc zegarkowy 32768 to nie jest recepta na wszystko.
    teedd

    0
  • #6 04 Maj 2008 20:21
    elektrofil
    Poziom 17  

    potwierdzam, mam system rejestracji czasu pracy, w terminalach kwarc 32... na timer asynchr. opóźnienie do 6-ciu sekund na dobę, o północy synchronizuje 18 terminali i jest sekunda różnicy o 6-tej rano.
    4 sekundy to dobry wynik.
    na zegarkowym bez korekty trymerkiem i chuchaniem/dmuchaniem (czyli stabilizacji temperatury) to sie musi rozjechać.
    nawet budowane rtc trzeba kalibrować.

    0
  • #7 04 Maj 2008 20:22
    ariel440
    Poziom 9  

    ok, już rozumiem, bardzo dziękuję za szybkie i konkretne odpowiedzi,
    temat może zostać zamknięty

    pozdrawiam

    0
  • #8 05 Maj 2008 15:06
    hunterhouse
    Poziom 26  

    witam

    problem w tym że wejście do przerwania i wpisanie nowej wartości do timera trwa kilka taktów i przez to powstają te przekłamania

    zamiast próbować z dziwnymi poprawieniami danych wykorzystaj przerwanie "compare" i ustaw automatyczny reset wartości timera.

    wtedy wszystko było by automatycznie.... ;)

    pozdrawiam

    0
  • #9 05 Maj 2008 17:25
    mass85
    Poziom 10  

    Jest latwiejszy sposob, zaczerpniety z ksiazki Marcina Wiazani.

    Zamiast

    Code:
    Timer1 = 36736

    powinno byc
    Code:
    Timer1 = Timer1 + 36736


    To Ci uwzgledni gubione takty. W momencie przepelnienia Timer1 = 0, ale czas nadal biegnie, wiec licznik rowniez zlicza takty zegara. Zanim dojdzie do linijki, w ktorej ustawiasz ponownie wartosc timera, minie kilka-kilkanascie taktow.

    Choc te gubione takty nie powinny powodowac opoznienia az o kilka sekund...

    1
  • #10 19 Lip 2010 14:28
    Mateo18
    Poziom 11  

    Kwarc zegarkowy i atmega 8 to nic złego bo atmega i tak pracuje na wewnętrznym a co do kalibracji tego układu to musisz dodać trymer koło kwarcu i wykazać się odrobina cierpliwości by to ustawić a co do PCF-a to tez jakieś rozwiązanie ale i tak jest potrzebny kwarc 32...

    pozdrawiam wszystkich.

    0
  • #11 19 Lip 2010 21:55
    shg
    Specjalista techniki cyfrowej

    Da się zrobić dokładnie na normalnym kwarcu 8 MHz (i wielu innych).
    Hunterhouse napisał jak i jest to jedynie słuszne rozwiązanie w tym wypadku. Robiłem tak wielokrotnie i błąd był rzędu 1-3 sekund na dobę.
    Te wszystkie patenty z ręcznym przeładowaniem licznika można o kant d.. potłuc.

    0
TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo