Zegara nie mogło zabraknąć również wśród moich konstrukcji. Postanowiłem jednak powiesić poprzeczkę nieco wyżej i zaprojektować urządzenie wyróżniające się następującymi cechami użytkowymi:
- prostota konstrukcji,
- niska cena implementacji,
- łatwość montażu,
- atrakcyjny wygląd,
- duża funkcjonalność,
- duża ergonomia obsługi.
Niektóre z tych cech wydają się przeciwstawne i z pozoru trudno wyobrazić sobie ich wzajemne współistnienie w ramach jednego projektu, lecz uwierzcie mi na słowo – zaprezentowany poniżej system mikroprocesorowy mClock integruje wszystkie wspomniane powyżej założenia konstrukcyjne.
Pierwszym z dylematów, z jakim miałem się zmierzyć, konstruując to urządzenie był wybór zegara czasu rzeczywistego (RTC). Początkowo wydawało się, iż tego rodzaju peryferium z powodzeniem możemy zrealizować programowo przy współudziale wbudowanego w strukturę mikrokontrolera układu czasowo-licznikowego Timer2, który w przypadku wielu mikrokontrolerów z rodziny AVR może pracować w trybie asynchronicznym, realizując zadanie zegara czasu rzeczywistego.
Jednak w przypadku takiej implementacji nierozwiązany pozostaje problem podtrzymania zasilania układu RTC w czasie braku zasilania systemu mikroprocesorowego. Zresztą samo podtrzymanie bateryjne nie rozwiązuje w tym przypadku problemu, gdyż co prawda asynchroniczny układ czasowo-licznikowy Timer2 może pracować w trybie głębokiego uśpienia mikrokontrolera (pobierającego w tym stanie pracy niewielki prąd z podtrzymującej baterii zasilającej), lecz nie znaczy to, że z automatu realizuje on w tym czasie zadania typowego układu RTC. Aby wspomniany Timer2 realizował zadania sprzętowego układu RTC, potrzebny jest odpowiedni fragment kodu obsługi aplikacji (obsługi przerwania Timera2) a więc zachodzi konieczność pracy mikrokontrolera. Można to oczywiście ominąć, wybudzając mikrokontroler co 1 s i w krótkim czasie po przebudzeniu realizować treść obsługi przerwania Timera2, czyli de facto realizując zadania programowego zegara RTC, po czym wracać do stanu uśpienia, lecz nie jest to moim zdaniem rozwiązanie optymalne, a już na pewno nie jest proste w implementacji. Ostatecznie i biorąc pod uwagę fakt, że w konstrukcji urządzenia mClock wykorzystuję magistralę I2C do współpracy z zastosowanym wyświetlaczem OLED, a więc część kodu obsługi sprzęgu I2C i tak musi się znaleźć w treści kodu naszej aplikacji, zdecydowałem, że jako układu RTC użyję zewnętrznego, taniego i wygodnego w implementacji układu firmy Microchip typu MCP-79410. Ma on ważną zaletę – obsługuje automatyczny mechanizm podtrzymania bateryjnego zegara RTC, pobierając w takim trybie pracy prąd rzędu kilkuset nA. Co więcej, układ ten cechuje się następującymi, wybranymi walorami użytkowymi:
- obsługa dokładnego zegara RTC oraz kalendarza do roku 2399,
- możliwość regulacji dokładności wbudowanego oscylatora w zakresie ±129 ppm,
- funkcja automatycznego podtrzymania zasilania bateryjnego ustawień RTC,
- funkcja automatycznego znacznika czasu wypadnięcia/przywrócenia zasilania,
- wielofunkcyjne wyjście MFP wyposażone w możliwość generowania przebiegów prostokątnych o wybranej częstotliwości,
- wbudowana pamięć RAM o wielkości 64 B podtrzymywana bateryjnie,
- wbudowana pamięć EEPROM o wielkości 1 kB,
- szeroki zakres napięć zasilających 1,8...5,5 V.