Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C][Atmega16] Źle liczący timer

tmazur 20 Maj 2011 18:58 2561 9
  • #1 20 Maj 2011 18:58
    tmazur
    Poziom 8  

    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: cpp
    Zaloguj się, aby zobaczyć kod
    [/code]

  • Pomocny post
    #2 20 Maj 2011 19:01
    tadzik85
    Poziom 38  

    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 20 Maj 2011 19:08
    tmazur
    Poziom 8  

    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?

  • #5 20 Maj 2011 19:23
    tmazur
    Poziom 8  

    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 20 Maj 2011 20:23
    janbernat
    Poziom 38  

    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.

  • #8 20 Maj 2011 20:30
    dondu
    Moderator Mikrokontrolery Projektowanie

    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 20 Maj 2011 21:06
    janbernat
    Poziom 38  

    Przepraszam za pomyłkę- tadzik85 a nie dondu. :|
    Już poprawiłem.

  • #10 31 Maj 2011 12:28
    tmazur
    Poziom 8  

    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.

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME