Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Zegar na Atmega 32 - spieszy o 2sekundy na godzinę

ziguś 18 Maj 2017 12:36 702 20
  • #1 18 Maj 2017 12:36
    ziguś
    Poziom 23  

    witam,
    Potrzebuję w moim projekcie użyć zegara. Do dyspozycji mam timer2. Zegar spieszy o 2 sekundy na godzinę. Czy dało by się to jakoś podregulować ? Wiem że do zegara można użyć PCF, ale to raczej nie wchodzi w grę

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

  • #2 18 Maj 2017 13:28
    dondu
    Moderator Mikrokontrolery Projektowanie

    Nie znam Bascom więc nie analizuję programu, ale:
    - zrób odpowiednią korektę w programie,
    - lub wykorzystaj kwarc będący potęgą liczby 2 czyli np. 14745600Hz. Wtedy nie musisz kombinować z różnymi przeliczeniami, bo wystarczy preskaler (który jest potęgą liczby 2) i przerwanie.

    Istotne może być także włączenie wzmocnienia sygnału zegarowego poprzez CKOPT - piszę na wszelki wypadek, gdybyś nie miał włączonego.

    Musisz być także świadomy, że kwarce także mają swoją dokładność:
    http://mikrokontrolery.blogspot.com/2011/04/stopery-timery-itp.html

  • Pomocny post
    #3 18 Maj 2017 13:34
    niveasoft
    Poziom 33  

    Na wstępie uściślij bo piszesz o Timer0 a kod oprogramowuje Timer2
    Jeśli masz wolne piny PC6 i PC7 to możesz do nich podłączyć kwarc zegarkowy i mieć zegarek tak dokładny jak ten z PCF`a.

    Wtedy w Bascom piszesz tylko "Config Clock =Soft" i gotowe.

  • #4 18 Maj 2017 14:53
    krzysiek_krm
    Poziom 24  

    Witam,
    nie znam Bascom i dość słabo Atmega.
    Podejrzewam jednak, że problemem jest realizowane w przerwaniu ładowanie timera nową wartością. Przyjęcie przerwania wymaga jakiegoś czasu, a timer cały czas "cyka". Kiedy ładujesz go obliczoną wartością (250) zdążył już coś naliczyć, w związku z tym Twój zegar się późni. W efekcie dobierasz eksperymentalnie wartość 122, przy której dla odmiany się spieszy.
    Jak wspomniałem słabo znam Atmega.
    Możliwe, że jest jakiś timer z funkcją "auto reload", wówczas takt timera będzie precyzyjny i niezależny od czasu przyjęcia przerwania.
    Równie dobrze zamiast ładować nową wartość timera należy ją dodać. Nie wiem czy w Atmega to możliwe, można tak zrobić na przykład w Pic-ach, w których wynik operacji niekoniecznie musi trafić do akumulatora, może zostać przesłany do rejestru, który jest drugim (poza akumulatorem) argumentem operacji. Niech sie wypowie ktoś, kto dobrze zna Atmega.

    Pozdrawiam

  • #5 18 Maj 2017 15:43
    dondu
    Moderator Mikrokontrolery Projektowanie

    krzysiek_krm napisał:
    Niech sie wypowie ktoś, kto dobrze zna Atmega.

    Odpowiedź została już udzielona w postach moim i niveasoft.

    Aby rozwinąć temat kwarcu zegarkowego na pinach TOSCx dla Timer2:
    http://mikrokontrolery.blogspot.com/2011/03/A...AVR-Oscylatory-kwarcowe-kwarc-ceramiczne.html
    http://mikrokontrolery.blogspot.com/2011/04/SmartPIP-Licznik-czasu-testowanie.html

  • #6 18 Maj 2017 17:10
    ziguś
    Poziom 23  

    Piny PC6 i PC7 mam wolne. Spróbuję do nich dolutować kwarc zegarkowy i zobaczymy co z tego wyniknie. A ten kwarc 16 MHz przy Xtal1 i Xtal2 ma zostać , tak ? Jak sobie nie poradzę będę się odzywał.

  • #8 18 Maj 2017 17:20
    ziguś
    Poziom 23  

    Czyli reasumując, z podesłanych linków wynika że dla kwarcu zegarkowego nie ustawiam fusebitów, kwarc zegarkowy włączam programowo z timerem2.

  • #10 18 Maj 2017 18:01
    krzysiek_krm
    Poziom 24  

    Witam ponownie,
    nie chcę marudzić, ale jednak miałem całkowitą rację.
    Nie trzeba dostawiać żadnych dodatkowych elementów.
    Tutaj
    http://ep.com.pl/files/4910.pdf
    bardzo przystępnie opisano (dla Bascom, żeby było śmieszniej) dlaczego w przerwaniu timera nie należy podstawiać nowej wartości, należy ją natomiast dodać !!!
    Nie mam więcej pytań, ludzką jest rzeczą błądzić, ale uporczywe trwanie w błędzie to już grzech śmiertelny.

    Pozdrawiam

  • #11 18 Maj 2017 19:46
    niveasoft
    Poziom 33  

    Nie podważam tych oczywistych spraw, ale ten tekst jest sprzed 14 lat
    Teraz dysponując nawet babcią Mega8 każdy chyba użyłby rejestru porównania Timera1 lub Timera2 gdzie wartość jest przeladowana automatycznie nie wymagając zaangażowania w to mocy procesora.

    Osobny kwarc przydaje się do aplikacji gdzie potrzebujemy podtrzymać czas a usypiamy procesor by oszczędzał energię. Wszystko zależy od potrzeb a czasem takie rozwiązanie jest po prostu wygodniejsze niż gimnastyka z ciułaniem sekund z maksymalnie 16 milisekund...

  • #12 18 Maj 2017 20:42
    dondu
    Moderator Mikrokontrolery Projektowanie

    krzysiek_krm napisał:
    Witam ponownie,
    nie chcę marudzić, ale jednak miałem całkowitą rację.
    Nie trzeba dostawiać żadnych dodatkowych elementów.
    Tutaj
    http://ep.com.pl/files/4910.pdf
    bardzo przystępnie opisano (dla Bascom, żeby było śmieszniej) dlaczego w przerwaniu timera nie należy podstawiać nowej wartości, należy ją natomiast dodać !!!
    Nie mam więcej pytań, ludzką jest rzeczą błądzić, ale uporczywe trwanie w błędzie to już grzech śmiertelny.

    Pozdrawiam

    Nadal kolega nie rozumie, co piszemy i jakie rozwiązania zaproponowaliśmy, jeśli więc ktokolwiek jest w błędzie, to właśnie kolega..

    niveasoft napisał:
    ... ale ten tekst jest sprzed 14 lat

    To akurat nie ma znaczenia :)
    Każdy problem można rozwiązać na wiele sposobów i o tym właśnie razem pisaliśmy.

  • #13 18 Maj 2017 21:10
    ziguś
    Poziom 23  

    Wszystko ok, tylko ja potrzebuję przerwanie 500ms ( waitms nie wchodzi w grę ), a komenda Config Clock = Soft , Gosub = Sectic robi mi przerwanie co sekundę. Dondu to jeszcze wytłumacz mi łopatologicznie dlaczego kwarc 14745600.
    Wystarczy mi dokładne przerwanie co 500ms.

  • #14 18 Maj 2017 21:19
    dondu
    Moderator Mikrokontrolery Projektowanie

    W projekcie masz 16MHz a pisałeś o timer0.
    Najbliższym kwarcem, który łatwo można kupić będący najbliżej wartości będącej potęgą liczby 2 jest właśnie ten kwarc.

    Dzieląc 14745600 przez 2 będziesz miał całkowite wyniki do 16-tego dzielenia włącznie.
    Przy kwarcu 16MHz skończysz zaledwie na 10-tym dzieleniu.

    Najlepszym rozwiązaniem jest kwarc zegarkowy 32.768kHz, ale wtedy jesteś ograniczony do użycia go z timer2.

    A dlaczego przez dwa a nie 10? Ponieważ preskalery są potęgą liczby dwa, a timer0 lub timer2 ma licznik dwójkowy.

    Innymi słowy, gdy pokombinujesz uzyskasz przerwanie dokładnie o takim odcinku czasowym jaki potrzebujesz lub o jego krotności.

  • #15 18 Maj 2017 21:37
    zumek
    Poziom 39  

    ziguś napisał:
    Wszystko ok, ...

    No nie bardzo.
    Dziwne, że kolega niveasoft nie zauważył w Twoim kodzie błędu, na którym przejechały się już tabuny bascomowców :)

    Sprawdź w pomocy Bascoma, składnię polecenia ... Load TimerX
    Poza tym, czy nie lepiej użyć "autoprzeładowania" (tryb CTC) ?

  • #18 18 Maj 2017 22:16
    ziguś
    Poziom 23  

    poprawi mi ktoś ten kod ?

  • #19 18 Maj 2017 22:23
    niveasoft
    Poziom 33  

    Bądź na drugi raz bardziej precyzyjny bo szkoda klawiatury.
    Najpierw piszesz o Timer0 a okazuje się że Timer2 masz wolny...
    Piszesz o sekundach a okazuje się że potrzebujesz 500ms...

    Do @zumek nawet na ten kod nie patrzyłem bliżej bo po uzyskaniu info, że to jednak Timer2 od razu doradziłbym CTC :D

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

  • #20 18 Maj 2017 22:29
    zielonykosmita
    Poziom 15  

    W trybie CTC nie musisz się martwić o ładowanie nowej wartości to timera, bo dzieje się to samoczynnie. Musisz jedynie na początku programu wpisać przy jakiej wartości timer będzie się resetował wpisując do rejestru OCR2 wyliczoną wartość. Przy 8 bitowym timerze proponuję ustawić preskaler na 1024 zaś do OCR2 wpisać 124 (124 czyli zliczanie do 125).
    16 000 000 /1024 = 15625
    16525 / 125 = 125
    Dostaniesz więc przerwanie co 125 Hz, resztę dzielenia musisz zrobić programowo lub użyć timera 16 bitowego. Zegar na Atmega 32 - spieszy o 2sekundy na godzinę

  • #21 18 Maj 2017 22:33
    niveasoft
    Poziom 33  

    Mój program to tylko przykład jednego z możliwych rozwiązań.
    Można to pewnie zrobić nawet na fladze Timera bez przerwania, a 10ms przydaje się, na przykład, do skanowania przycisków lub innych zadań.

Szybka odpowiedź lub zadaj pytanie
Dziękuję Ci. Ta wiadomość oczekuje na moderatora.
 Szukaj w ofercie
Wyszukaj w ofercie 200 tys. produktów TME