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

Zegar na 89c2051 z kwarcem 12MHz - opóźnienie 10 minut na godzinę

kjn6000 13 Maj 2004 18:40 1764 7
REKLAMA
  • #1 639635
    kjn6000
    Poziom 14  
    Posty: 173
    Pomógł: 2
    Ocena: 1
    Mam zdudowany zegar na tym uP i zegar późni się jakieś 10 minut na godzinę nie wiem dla czego. Poniżej zamieszczam kawałek procedury dotyczącej ustawienia timera0.

    Config Timer0 = Timer , Mode = 1 , Gate = Internal
    Enable Interrupts
    Enable Timer0
    On Timer0 1ms
    Counter0 = 64536
    Start Timer0
    do
    If Licznik = 1000 Then
    Incr Sek
    Licznik = 0
    End If
    loop
    end

    1ms:
    Counter0 = 64536
    Start Timer0
    Incr Licznik
    Return

    Kwarc mam 12MHz i procesor steruje czterema wyświetlaczami 7-seg multiplexowo.
    Może ktoś zna odpowiedz :-)
  • REKLAMA
  • #2 639673
    lechoo
    Poziom 39  
    Posty: 5161
    Pomógł: 377
    Ocena: 546
    Musisz tak dobrać częstotliwość przerwań (przy kwarcu 12MHz proponuję 625Hz - tryb 0 i wartość początkowa TH0=206), aby w procedurze obsługi przerwania przeładodywać tylko rejestr TH0. Tylko w ten sposób przerwanie będzie generowane z idealną dokładnością i nie będziesz miał żadnych opóźnień. Błąd w Twoim przypadku spowodowany jest tym, że nie uwzględniłeś czasu jaki upływa od zgłoszenia przerwania do przeładowania rejestrów timera. Nic nie kombinuj tylko zrób tak jak napisałem. W razie potrzeby mogę podesłać gotowe źródełko, ale w języku C.
  • REKLAMA
  • #3 639693
    kjn6000
    Poziom 14  
    Posty: 173
    Pomógł: 2
    Ocena: 1
    Właśnie tak sobie pomyślałem o tym opóźnieniu i wprowadziłem korektę o jakieś 52 takty. Terz zegarek jest w fazie testów zobaczymy co z tego wyjdzie. Chodziło mi głównie o to czy dobrze dobrałem wartoć wpisaną do licznika aby była ta 1ms i się tak zastanawiam czy te opóźnienie powodowane przeładowywaniem jest aż takie istotne.
  • REKLAMA
  • #4 639854
    lechoo
    Poziom 39  
    Posty: 5161
    Pomógł: 377
    Ocena: 546
    Ehh, teraz dopatrzyłem się dokładnie co Ty wypłodziłeś... W ten sposób nie robi się zegarka, odliczanie czasu musi odbywać się w przerwaniu, a nie w głównej pętli programu.
  • REKLAMA
  • #5 640173
    kjn6000
    Poziom 14  
    Posty: 173
    Pomógł: 2
    Ocena: 1
    Nic to nie dalo jak sie póżni tak się późni tylko o mniej, jakieś cztery pięć minut na godzine. Poza eksperymentami nie mam pomyslu na ustawienie tego zegara. :-(
  • #6 641018
    Redok
    Poziom 13  
    Posty: 116
    Ocena: 2
    zmien kwarc na mniejszy...11,0625 czy cos takiego
  • #7 641098
    frohme
    Poziom 21  
    Posty: 421
    Pomógł: 25
    Ocena: 15
    Fakt, że w Bascomie nie wiadomo jaki powstaje kod i przy generacji precyzyjnych odcinków czasu masz zawsze niespodzianki. Ja dla odmierzania czasu stosuję następujący schemat: Timerx stop,Timerx -> tryb2, TLx i THx ustaw wartość np. -100, zezwól na przerwania od Timerx i globalnie, start Timerx. Od tego momentu masz w twoim przypadku dla kwarcu 12 MHz przerwanie co 100 us i w obsłudze przerwania sprawdzasz, czy kolejne przerwanie to nie jest dziesiąte -> jak tak to właśnie odmierzyłeś 1 ms i zerujesz licznik ilości przerwań. To w przerwaniu wystarczy, natomiast w pętli głównej zliczasz kolejne milisekundy i dalsza ich obróbka. Drugi fakt - nigdy nie robiłem tego w Bascomie, bo kiedyś nie mogłem zmieścić prostego programu we FLASH'u, za to kompilator C dla tego algorytmu wygenerował kod zajmujący ok.60% pojemności FLASH'a. Wnioski wyciągaj sam.
  • #8 645649
    kjn6000
    Poziom 14  
    Posty: 173
    Pomógł: 2
    Ocena: 1
    Pomysle nad tym, lubie pisać w Bascom bo jest to bardzo proste, ale widze że jednak muszę wrócić do asemblera.

Podsumowanie tematu

✨ Problem dotyczy zegara opartego na mikrokontrolerze 89c2051 z kwarcem 12 MHz, który spóźnia się około 10 minut na godzinę. Kod wykorzystuje Timer0 w trybie 1 z przerwaniem co 1 ms, jednak opóźnienie wynika z nieprawidłowego przeładowywania rejestru licznika oraz zliczania czasu poza przerwaniem. Zalecane jest ustawienie częstotliwości przerwań na około 625 Hz (tryb 0, TH0=206) i przeładowywanie tylko rejestru TH0 w procedurze obsługi przerwania, aby uzyskać dokładne odliczanie czasu. Odliczanie sekund powinno odbywać się w przerwaniu, a nie w głównej pętli programu. Alternatywnie sugerowano użycie kwarcu o częstotliwości 11,0625 MHz dla lepszej precyzji. Wskazano również, że Bascom generuje kod o nieprzewidywalnej precyzji, a bardziej efektywne i precyzyjne sterowanie czasem można uzyskać w asemblerze lub C, stosując tryb 2 timera z przerwaniami co 100 µs i zliczaniem ich do 1 ms. Autor rozważa powrót do asemblera ze względu na ograniczenia Bascoma.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA