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

[C] Atmega16 Timer0 - Przerwanie co 1s opóźnia się o 1,5s na minutę, dlaczego?

Pi0trek121 12 Wrz 2012 17:15 1206 11
REKLAMA
  • #1 11303834
    Pi0trek121
    Poziom 23  
    Witam! Chcąc dodać zegar do mojego projektu musiałem wygenerować przerwanie, które dodawałoby 1 do zmiennej co 1s. napisałem programik jak poniżej, lecz niestety zliczając późni się o około 1/1,5s na minute... ktos wie gdzie robię błąd? gdzieś się pomyliłem?


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    z mojego punktu widzenia wygląda to tak:
    atmega ustawiona na 1MHz
    [C] Atmega16 Timer0 - Przerwanie co 1s opóźnia się o 1,5s na minutę, dlaczego?

    Preskaler ustawiony na 64, czyli 1000000/64 = 15625
    TCNT0 zaczynam od 131, czyli zostaje mi 125...
    15625/125 = 125 i pozostałe 125Hz dziele zmienną i warunkiem...
  • REKLAMA
  • #3 11303934
    szulat
    Poziom 23  
    tronics napisał:
    Wywal zbędne przeliczenia z ISR i włóż do pętli głównej (chodzi mi o IF ...). Obsługa przerwania powinna być względnie jak najszybsza. bufor jako volatile o ile dobrze rozumiem.

    jeżeli bufor będzie volatile to zupełnie niepotrzebnie przedłuży się obsługa przerwania, co jest sprzeczne z twoją pierwszą poradą ;) (niepotrzebnie, bo z tej zmiennej korzysta tylko jedna funkcja)

    a teraz poważnie... to czy w obsłudze tego przerwania będzie 0, 1 czy 5 ifów to nie ma specjalnie znaczenia (i nie ma wpływu na dokładność pomiaru czasu), chociaż mógłbyś uprościć sobie kod stosując timer ustawiony na liczenie do wartości maksymalnej mniejszej niż 255 tak że nie trzeba go ustawiać programowo. ale to szczegół.

    po prostu częstotliwość wbudowanego oscylatora RC jest niedokładna więc twój pomiar czasu też będzie niedokładny i jest to zupełnie normalne. bez dołączenia kwarcu możesz najwyżej trochę zmniejszyć niedokładność zmieniając liczbę kroków timera tak żeby zbliżyć się do prawidłowej wartości.
  • #4 11303945
    Pi0trek121
    Poziom 23  
    Dziękuje za pomoc, kiedyś w jakiejś książce czytałem o kalibracji oscylatora do temperatury otoczenia... słyszeliście coś na ten temat?
  • REKLAMA
  • Pomocny post
    #5 11304012
    szulat
    Poziom 23  
    Pi0trek121 napisał:
    Dziękuje za pomoc, kiedyś w jakiejś książce czytałem o kalibracji oscylatora do temperatury otoczenia... słyszeliście coś na ten temat?

    polega to na eksperymentalnym dobraniu wartości w rejestrze OSCCAL tak żeby szybkość zbliżyła się do takiej jaką chcemy osiągnąć, ale nawet tym sposobem nie da się osiągnąć dokładności, która byłaby wystarczająca w zegarku.
  • REKLAMA
  • #6 11304087
    Pi0trek121
    Poziom 23  
    W takim razie będę musiał gdzieś wcisnąć kwarc na płytce :( chyba, ze inna atmega będzie bardziej dokładna.. dziękuje wszystkim za pomoc :)
  • #8 11304165
    Pi0trek121
    Poziom 23  
    Akurat cały port C mam zajęty... planuje dać 11,0592MHz na 12 i 13 pin i na pająka oscylator wraz z kondensatorami.
  • REKLAMA
  • #10 11304199
    Pi0trek121
    Poziom 23  
    Chce wlutować bezpośrednio w nogi podstawki do atmegi :P trochę będzie odstawać ale ważne, że działa :) Podpowiedz mi jeszcze, czy jak przylutuje kwarc i preskaler zmienię na odpowiednio mi pasujący to nie muszę w zadnym rejestrze timera0 nic ustawiać, ze to jest zewnętrzny oscylator? (pomijając fusebity)
  • #12 11304236
    Pi0trek121
    Poziom 23  
    Ok, już wszystko wiem, dziękuje za pomoc :)
REKLAMA