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

Timer 89c2051 - niedokładność 1 sekundy przy kwarcu 12MHz, co poprawić?

denwer 01 Paź 2006 15:27 1013 6
REKLAMA
  • #1 3075036
    denwer
    Poziom 14  
    Posty: 142
    Pomógł: 3
    Ocena: 74
    Raczkuję w mikrokontrolerach więc mogłem popełnić jakiś drobny błąd którego nie widzę. Chciałem wykorzystać timer wewnętrzny 89c2051 do zliczania czasu. Ustawiłem go żeby zaświecał / gasił jedną diodę co 1 sekundę i żeby zaświecał / gasił inną diodę co 1 minutę. Niestety coś musiałem pokiełbasić i albo źle poobliczałem pętle albo źle ułożyłem program. W każdym razie na pierwszy rzut oka wszystko jest ok, ale jak zmierzyłem czas 1 minuty stoperem to brakuje jej mniej więcej 1 sekundę (czyli dioda minutowa załącza się i gaśnie średnio co 59 sek.)

    W układzie jest wmontowany kwarc 12MHz.
    Zgodnie z moimi źródłami liczyłem to tak:
    Tryb licznika 0
    fz - częst. imp. zliczanych przez licznik
    Fk - częst. kwarca
    fz= fk/12/32=31250
    fz dzieli się przez 250
    TH1imp=31250/250=125 (czyli co 125 impulsów będzie 1/250 sekundy)
    Th1poczatkowe=TH1max-TH1imp=256-125=131

    
    czest equ 131
    org 0000h
    ljmp start
    org 001bh
    ljmp intT1
    
    intt1:
    mov th1,#czest ;zaladowanie licznika
    djnz r2,koniect1 ;jezeli 0 to
    cpl p1.7 ; zaneguj stan diody sek.
    mov r2,#250 ; zaladowanie petli sek.
    djnz r3,koniect1 ;jezeli 0 to
    cpl p1.1 ; zaneguj stan diody min.
    mov r3,#60 ; zaladowanie petli min.
    koniect1:
    reti
    
    start:
    clr TR1
    anl Tmod,#0fh ;ustawienie licznika
    orl tmod,#00h
    mov th1,#czest ;zaladowanie licznika
    mov r2,#250 ;zaladowanie petli 1 sek.
    mov r3,#60 ; zaladowanie petli 1 min.
    setb p1.7 ; zgaszenie diody sek.
    setb p1.1 ; zgaszenie diody min.
    setb ET1 
    setb ea
    setb pt1
    setb tr1 ; uruchomienie timera
    czekaj:
         	 djnz r0,czekaj ;pusta petla
         	 djnz r1,czekaj
        	  ajmp czekaj
    end
    

    pomóżcie bo już siedzę nad rym 2 dzień i nic mi nie przychodzi do głowy
  • REKLAMA
  • #2 3075203
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    To nie AVR z preskalerem tu licznik liczy tak jak AVR bez preskalera, najlepiej jak zastosujesz tryb "auto reload" wtedy nie stracisz zadnego taktu zegarowego. Sam tak stosuje i wszystkie zegarach i chodza jak talala.
  • REKLAMA
  • #3 3075242
    denwer
    Poziom 14  
    Posty: 142
    Pomógł: 3
    Ocena: 74
    Ale zastosowałem tryb licznika 0 (czyli zlicza 32 takty jako 1 takt). Nie sądzę żeby moje instrukcje w przerwaniu mialy więcej jak 32 takty.
    Jeżeli ktoś ma może kodzik do odmieżania 1 sekundy to bym poprosił o wstawienie.
  • REKLAMA
  • #4 3075691
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Skoro Ci "spieszy" to nie tracisz taktów zegara. Spróbuj wymienic kwarc na inny albo zamiast 131 do TH1 wpisz 130. 60s to dal uP cała wiecznośc :D
  • REKLAMA
  • #5 3075728
    denwer
    Poziom 14  
    Posty: 142
    Pomógł: 3
    Ocena: 74
    Jeżeli chodzi o intuicyjne dobieranie wartości to odpada bo ten układ ma mierzyć ilość obrotów ma minutę. Najlepiej jakby miał dokładność do 10 obr/min. , a przy błędnie dobranych czasach będą przekłamania.
  • #6 3075770
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Mozna jeszcze zatrudnić zegarek np: PCF-a. Wtedy będziesz miał bardzo dokładnie. Ale tak jak pisałem nie wiesz czy kwarc ma dokładnie 12000000 taktów /s więc przy pomocy stopera możesz sobie dopasować wartości w TH1.
  • #7 3075932
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Dopasowanie tego co wpisać do rejestru owszem jest tam jakimś sposobem ale raczej rozjedzie ci się bardziej po jakimś czasie.

    Są tkie specjalne częstotliwosci kwarców (wcale nie droższe) które sie świetnie nadaja do 12 taktowego licznika 65536 impulsowego.

    Ja używam 7,86432MHz co bez dotykania rejestrów licznika daje 10 przerwań na sekundę (=żadnych zbędnych kombinacji). Z tego co zauważyłem na tydzień zegarek spóźnia mi sie o jakieś 5sekund ale to pewnie zależy od napiecia zasilania i od temperatury

Podsumowanie tematu

✨ Problem dotyczy niedokładności pomiaru czasu za pomocą wewnętrznego timera mikrokontrolera 89c2051 z kwarcem 12 MHz. Timer w trybie licznika 0 zlicza impulsy z częstotliwością fz = fk/12/32 = 31250 Hz, a autor ustawił wartość początkową TH1 na 131, aby uzyskać przerwanie co 1/250 sekundy. Pomimo poprawnych obliczeń, pomiar 1 minuty jest krótszy o około 1 sekundę. W dyskusji zasugerowano użycie trybu auto-reload, który eliminuje utratę taktów zegara, oraz ewentualną korektę wartości TH1 (np. 130 zamiast 131) w celu dopasowania czasu. Wskazano, że dokładność zależy od rzeczywistej częstotliwości kwarcu, którą można zweryfikować i skorygować za pomocą stopera. Zaproponowano także zastosowanie specjalnych częstotliwości kwarców, np. 7,86432 MHz, które umożliwiają prostsze i bardziej precyzyjne generowanie przerwań (np. 10 przerwań na sekundę) bez skomplikowanych obliczeń. Alternatywnie, można użyć zewnętrznego zegarka czasu rzeczywistego, np. układu PCF, dla uzyskania większej dokładności. Autor podkreślił potrzebę wysokiej precyzji pomiaru do kontroli obrotów na minutę z dokładnością do 10 obr/min, co wymaga minimalizacji błędów czasowych.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA