Witam, jestem początkujący, chciałem zaimplementować w swoim układzie (dodatkowo) funkcję pokazującą czas, czyli generalnie zegarek. Układ będzie oparty na procesorze ATmega*. Poczytałem trochę na forum o kwarcach i chciałem uporządkować wiadomości.
Jeżeli chcę by nie było dysproporcji między aktualnym czasem a wskazaniem układu, to rozumiem, że potrzebuję zewnętrzny kwarc. Jest ich dosyć sporo o różnej częstotliwości (na przykład 16[MHz]), ale jeden 32.768[kHz] nazywany jest kwarcem zegarkowym, rozumiem, że muszę użyć tego? Czemu akurat taka częstotliwość? Czemu służą w takim razie te kwarce o tych innych częstotliwościach?
Podłączanie, dodatkowe kondensatory o pojemności 22[pF] są w układzie mikrokontrolera, ale z tego co doczytałem nie zaszkodzi a nawet przez niektórych jest sugerowane przylutowanie takowych do kwarcu. Tak więc kwarc z kondensatorami podłączamy do nóżek TOSC1 oraz TOSC2, te wejścia służą do oscylatorów (kwarcu) zajmujących się czasem? Są też wejścia XTAL1 oraz XTAL2, czy tutaj podłącza się kwarce, które sterują częstotliwością mikrokontrolera? Czy w takim razie to takich zadań używa się kwarców o tych innych częstotliwościach? Gdybym chciał by na przykład moja ATmega128 pracowała z częstotliwością 16[MHz] to oprócz dostarczenia odpowiednio wysokiego napięcia potrzebny jest kwarc właśnie 16[MHz] w wejściach XTAL1 i XTAL2?
Bity kontrolne, teraz kolej na ustawienie fuse-bitów, dla wspomnianego kwarcu ≈33[kHz], należy 4 bity oznaczone jako CKSEL ustawić na 1001.
Tu rodzi się moje pytanie, co dalej? Czy kwarc już działa? Jak on wpływa na układ? Rozumiem, że oscyluje on zgodnie z daną częstotliwością, na podstawie czego można dokładnie odmierzać czas? Nie wpływa to na inne właściwości mikrokontrolera ponieważ jest w wejściach TOSC1, TOSC2, inaczej by było gdyby był w XTAL1 i XTAL2?
Jak to ogarnąć programowo? Wyczytałem, że zegar sterowny z wewnątrz procesora jest uznawany za synchroniczny, a źródło zewnętrzne zegara jako asynchroniczne, więc wymagane jest ustawienie rejestru ASSR (AS0 ustawione na 1 w ATmega128, AS2 w ATmega32). Teraz trzeba uruchomić przerwania, uruchomić przerwanie Timer/Counter? i można korzystać z funkcji ISR(TIMER2_OVF_vect) ? Funkcja ta będzie się wywoływać co 256 drgań kwarcu, więc dzieląc częstotliwość przez 128 otrzymamy wywołanie co 1[s]? Czy istnieje jakiś inny sposób na zaimplementowanie tego programowo?
Z góry dziękuję za pomoc
Jeżeli chcę by nie było dysproporcji między aktualnym czasem a wskazaniem układu, to rozumiem, że potrzebuję zewnętrzny kwarc. Jest ich dosyć sporo o różnej częstotliwości (na przykład 16[MHz]), ale jeden 32.768[kHz] nazywany jest kwarcem zegarkowym, rozumiem, że muszę użyć tego? Czemu akurat taka częstotliwość? Czemu służą w takim razie te kwarce o tych innych częstotliwościach?
Podłączanie, dodatkowe kondensatory o pojemności 22[pF] są w układzie mikrokontrolera, ale z tego co doczytałem nie zaszkodzi a nawet przez niektórych jest sugerowane przylutowanie takowych do kwarcu. Tak więc kwarc z kondensatorami podłączamy do nóżek TOSC1 oraz TOSC2, te wejścia służą do oscylatorów (kwarcu) zajmujących się czasem? Są też wejścia XTAL1 oraz XTAL2, czy tutaj podłącza się kwarce, które sterują częstotliwością mikrokontrolera? Czy w takim razie to takich zadań używa się kwarców o tych innych częstotliwościach? Gdybym chciał by na przykład moja ATmega128 pracowała z częstotliwością 16[MHz] to oprócz dostarczenia odpowiednio wysokiego napięcia potrzebny jest kwarc właśnie 16[MHz] w wejściach XTAL1 i XTAL2?
Bity kontrolne, teraz kolej na ustawienie fuse-bitów, dla wspomnianego kwarcu ≈33[kHz], należy 4 bity oznaczone jako CKSEL ustawić na 1001.
Tu rodzi się moje pytanie, co dalej? Czy kwarc już działa? Jak on wpływa na układ? Rozumiem, że oscyluje on zgodnie z daną częstotliwością, na podstawie czego można dokładnie odmierzać czas? Nie wpływa to na inne właściwości mikrokontrolera ponieważ jest w wejściach TOSC1, TOSC2, inaczej by było gdyby był w XTAL1 i XTAL2?
Jak to ogarnąć programowo? Wyczytałem, że zegar sterowny z wewnątrz procesora jest uznawany za synchroniczny, a źródło zewnętrzne zegara jako asynchroniczne, więc wymagane jest ustawienie rejestru ASSR (AS0 ustawione na 1 w ATmega128, AS2 w ATmega32). Teraz trzeba uruchomić przerwania, uruchomić przerwanie Timer/Counter? i można korzystać z funkcji ISR(TIMER2_OVF_vect) ? Funkcja ta będzie się wywoływać co 256 drgań kwarcu, więc dzieląc częstotliwość przez 128 otrzymamy wywołanie co 1[s]? Czy istnieje jakiś inny sposób na zaimplementowanie tego programowo?
Z góry dziękuję za pomoc
