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 spieszy o 3 sekundy po 5 minutach, prescaler 1024, 8MHz

tmazur 20 Maj 2011 18:58 3002 9
REKLAMA
  • #1 9527385
    tmazur
    Poziom 10  
    Posty: 29
    Witam,

    Chciałem napisać program do liczenia 'sekund'. Jest to początek mojej drogi do zrobienia zegara. Problem jest taki, że po 5 minutach zegar spieszy już o 3 sekundy. Gdzie popełniłem błąd? Prescaler ustawiony na 1024, atmega na 8MHz na kwarcu wewnętrznym(może tutaj jest problem?), według informacji które posiadam przerwanie powinno być generowane co 32,768 ms.

    Kod: text
    Zaloguj się, aby zobaczyć kod
    [/code]
  • REKLAMA
  • Pomocny post
    #2 9527393
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    zapewne to wina wewnętrznego kwarcu i liczenia zmiennoprzecinkowego. A propos ta obsługa przerwania jest zdecydowanie za długa. I zmiennoprzecinkowe po co?

    PS. taką metodą RTC nie wyjdzie najlepszej jakości. Timer 2 asynchronicznie z kwarcem 32,786.
  • #3 9527428
    tmazur
    Poziom 10  
    Posty: 29
    Czyli rozumiem że napisany kod jest w porządku? W takim razie zaopatrzę się w kwarc zewnętrzny. Od razu moje dodatkowe pytanie, jak zapewnić aby po odcięciu zasilania atmega poprawnie liczyła sekundy? Czy doliczymy się np. do 10 a następnie wyłączę zasilanie na 10s to chce żeby wskazało 20s. Czy takie coś jest w ogóle możliwe?
  • REKLAMA
  • #4 9527451
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Zastosować RTC zewnętrzny z potrzymaniem bateryjnym.
  • REKLAMA
  • #5 9527498
    tmazur
    Poziom 10  
    Posty: 29
    Czyli w sposób w jaki myślałem się nie da. ;) Dziękuję, chętnie usłyszę inne propozycje jeśli ktoś ma. Nie potrzebuję dni/miesięcy itd. a jedynie dokładne odmierzanie doby. W następnym tygodniu kupię kwarc i dam znać jakie efekty. Czy wyprzedzanie/spóźnianie będzie zawsze o taką samą wartość? Jeśli tak to może da się zastosować jakąś korekte do moich obliczeń?

    A co do poprzedniego postu, obsługa przerwania jest tylko testowa. W końcowej aplikacji raz na kilka godzin będę musiał zmienić wartość jednego pinu.
  • #6 9527704
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    Wydaje mi się że się da.
    Oczywiście nie po całkowitym odłączeniu zasilania ale po przejściu na zasilanie bateryjne.
    Ale musisz dokładnie przestudiować PDF.
    W trybie power save procesor pobiera kilka uA a Timer2 działa.
    No i timer2 asynchronicznie z kwarcem zegarkowym- jak napisał tadzik85.
    Wszystko zależy od pojemności ogniwa.
    Poza tym zegar wewnętrzny też można w pewnym stopniu skalibrować.
    Rewelacja to nie będzie- zwłaszcza przy zmianach temperatury pracy.
    No ale projekt zaczyna się od założonych wymagań.
    A kończy na cięciu kosztów- niestety.
  • REKLAMA
  • #7 9527731
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    janbernat napisał:
    jak napisał dondu.


    Że hm?
  • #8 9527735
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    Możesz połączyć te dwa tematy i osiągniesz cel (przyzwoitą dokładność i mały pobór prądu) bez zegara RTC:
    http://mikrokontrolery.blogspot.com/2011/04/stopery-timery-itp.html
    http://mikrokontrolery.blogspot.com/2011/01/bateria-zasila-mikrokontroler-czesc-1.html

    tadzik85 napisał:
    janbernat napisał:
    jak napisał dondu.

    Że hm?

    Także nie zaskoczyłem :)
  • #9 9527828
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    Przepraszam za pomyłkę- tadzik85 a nie dondu. :|
    Już poprawiłem.
  • #10 9562345
    tmazur
    Poziom 10  
    Posty: 29
    Ostatecznie wybrałem najprostsze i najtańsze rozwiązanie. Bazuje dalej na kwarcu wewnętrznym i ręcznie zmieniłem wartość dodawaną przy każdym przerwaniu do licznika milisekund. Udało mi się osiągnąć dokładność <10s na dobę co w pełni odpowiada moim wymaganiom. Dziękuję za pomoc.

Podsumowanie tematu

✨ Użytkownik napotkał problem z zegarem opartym na ATmega16, który spieszy o 3 sekundy po 5 minutach. Zastosowany prescaler 1024 oraz wewnętrzny kwarc 8MHz mogą być przyczyną błędu. W odpowiedziach zasugerowano użycie zewnętrznego kwarcu 32,768 kHz oraz zastosowanie zewnętrznego RTC z podtrzymaniem bateryjnym dla dokładniejszego odmierzania czasu. Użytkownik rozważał również kalibrację wewnętrznego zegara oraz modyfikację wartości dodawanej w przerwaniach, co pozwoliło mu osiągnąć dokładność poniżej 10 sekund na dobę.
Wygenerowane przez model językowy.
REKLAMA