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

RTC na AT89S52 z kwarcem 12 MHz - niedokładność po kilkunastu minutach

bolcio 24 Gru 2006 01:24 1440 5
REKLAMA
  • #1 3364756
    bolcio
    Poziom 12  
    Posty: 61
    Pomógł: 3
    Ocena: 6
    Witam. Próbuję zaimplementować prymitywny zegar czasu rzeczywistego na mikrokontrolerze AT89S52 taktowanym rezonatorem kwarcowym 12 MHz. Do tego celu wykorzystałem licznik T2 i przerwanie od niego pochodzące. Wartość początkową i do przeładowania po przepełnieniu ustawiłem na 3CAFh. Czyli przerwanie będzie występować co 50 ms (65 535 – 15 535 = 50 000, 50 000 * 1 us = 50 ms). Dodatkowo w procedurze obsługi przerwania zmniejszam za każdym razem rejestr roboczy R0 (zaczynając od 10) i gdy R0 = 0 neguje bit CY. W programie głównym zapalam diodę na porcie P1.0 gdy CY = 0 i gaszę gdy CY = 1. Wynikałoby z tego, że dioda będzie mrugać z częstotliwością 1 Hz. Wszystko ładnie, pięknie ale po kilkunastu minutach pracy dioda jakby „wyprzedzała” czas jaki wskazuje mój komputer.

    Oto listing programu:
    
    ORG 0
    OKRES EQU 10
    LJMP START_PROGRAMU 
    
    ORG 002BH
    LJMP PRZERWANIE
    
    START_PROGRAMU:
    MOV 0CDH, #03CH		;WPISANIE WARTOSCI POCZATKOWEJ DO LICZNIKA T2 (STARSZY BAJT)
    MOV 0CCH, #0AFH		;WPISANIE WARTOSCI POCZATKOWEJ DO LICZNIKA T2 (MLODSZY BAJT)
    MOV 0CBH, #03CH		;WPISANIE WARTOSCI DO PRZELADOWANIA PO PRZEPELNIENIU LICZNIKA T2 (STRASZY BAJT)
    MOV 0CAH, #0AFH		;WPISANIE WARTOSCI DO PRZELADOWANIA PO PRZEPELNIENIU LICZNIKA T2 (MLODSZY BAJT)
    
    SETB 0AFH		;WLACZENIE SYSTEMU PRZERWAN (EA = 1)
    SETB 0ADH		;WLACZENIE PRZERWANIA OD LICZNIKA T2 (ET2 = 1)
    MOV R0, #OKRES
    
    SETB 0CAH		;START LICZNIKA T2 (TR2 = 1)
    
    START:
    JC $
    CLR P1.0
    JNC $
    SETB P1.0
    LJMP START
    
    PRZERWANIE:
    CLR 0CFH		;WYZEROWANIE FLAGI PRZEPELNIANIA LICZNIKA T2
    DJNZ R0, POWROT		;DEKREMENTACJA I SPRAWDZENIE CZY R0 = 0, JEZELI NIE TO SKOK POD 'POWROT'
    MOV R0, #OKRES		;WPISANIE DO R0 WARTOSCI 'OKRES'
    CPL C			;ZANEGOWANIE BITU CY
    POWROT:
    RETI
    
    END
    


    Gdzie i jaki popełniłem błąd w obliczeniach? Liczę na Waszą pomoc.
  • REKLAMA
  • #2 3365033
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Wychodzi na to że timer przeładowywuje sie nie co 50ms a np: 49,5ms
    lub 49ms. Bedziesz musiał zweryfikować nastawy timera i metodą prób i błędów wyznaczyć najbardziej optymalny czas przeładowania. Niesety przy użyciu rezonatora kwarcowego 12Mhz do odmierzania czasu nie uzyskamy dużej dokładności. Do tego są specjalizowane układy, zegary czasu rzeczywistego np: PCF8583.
  • REKLAMA
  • #3 3365042
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Zmień na taki magiczny 7,864320MHz (65536*12) i bez żadnego przeładowywania tajemra dostaniesz przerwanie 10 razy na sekundę.

    W edw kiedyś był przykład jak policzyć wartości dla tajmera przy przeładowywaniu ale i tak autor uwzględnił dobową korekcje w sekundach - widocznie teoria jedno a praktyka drugie
  • REKLAMA
  • #4 3365426
    bolcio
    Poziom 12  
    Posty: 61
    Pomógł: 3
    Ocena: 6
    Zależało mi jednak na tym aby nie stosować specjalnych układów typu RTC. Czy stosując rezonator kwarcowy 24 MHz znacznie poprawię dokładność?
  • REKLAMA
  • #5 3365544
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Im "wyższy" kwarc tym możesz robić mniejsze kroki korekcji przeładowania timera. Zakładając, że kwarc nie ma żadnych odchyłek temperaturowych pozostaje weryfikacja zliczania po dłużej pracy.
    Pomijam fakt, że program musi być tak napisany żeby mu "uciekało" jak najmniej taktów przy zgłoszeniu przerwania z timera. To można zrobić wykorzystując ASM w newralgicznych miejscach programu.
  • #6 3366837
    jony15
    Poziom 25  
    Posty: 604
    Pomógł: 68
    Ocena: 74
    Co forum na inny sposób: timer 1 lub 0. tryb 2 ( automatyczne załadowanie wartości początkowych ) ustawiamy tak aby przerwanie występowało co 250us w przerwaniu liczymy "przerwania" i jeśli doliczymy sie ich 4000 to "upłyneła" jedna sekunda. Zwiększamy zmienną sekundy o jeden; sprawdzamy czy nie 60 jeśli tak do minuty +1 itd. A wszystko to w procedurze obsługi przerwania. P.s. wszystko to na 12MHz
REKLAMA