www.eprace.edu.pl » system-wrzutnikowy » Opis budowy i oprogramowania urządzenia » Magistrala I2C - zegar czasu rzeczywistego PCF8583

Magistrala I2C - zegar czasu rzeczywistego PCF8583

Przystępując do użycia zegara RTC autor skorzystał z ogólnodostępnych kodów obsługi magistarli I2C zaczerpniętych z literatury [3]. Jednak specyfika obsługi samego układu PCF8583 wymusiła opracowanie własnych procedur komunikacyjnych, będących niejako warstwą wyższą nad sprzętową obsługą magistrali. Analogicznie jak przy obsłudze 1Wire, również tutaj autor opakował funkcje niskopoziomowego dostępu do magistrali wygodnymi w użyciu funkcjami odczytu / zapisu czasu.

Wybrany do projektu model zegara jest bardzo łatwy w obsłudze. Niestety posiada szereg wad (część z nich została wyeliminowana w jego następcy: PCF8563). Podstawową niedogodnością jest zapis roku przy użyciu zaledwie 2 bitów. Koncepcja konstruktorów tego zegara przewiduje, że wartość 0 oznacza rok przestępny zaś kolejne wartości to lata, jakie upłynęły od ostatniego roku przestępnego. Autor wykorzystał tę właściwość dla zapewnienia poprawnej obsługi daty w latach przestępnych, jednak rozbudował ją o przechowywanie wartości aktualnego roku (dziesiątki i jedności) w pamięci RAM zegara. Rozpoznanie zmiany aktualnej wartości roku realizowane jest poprzez porównywanie wartości roku odczytywanej podczas wejścia do funkcji z wartością zapamiętaną po ostatnim jej użyciu.

Znacznie poważniejszą wadą zegara jest brak wsparcia dla numerów dni tygodnia. W celu realizacji kalendarza, który umożliwiałby np. wyświetlanie nazw poszczególnych dni, autor sięgnąć musiał po algorytm wiecznego kalendarza Zellera, który umożliwia wyznaczenia dnia tygodnia dla dowolnej daty z zakresu 1r.n.e. - 9999r.n.e. Algorytm w formie uproszczonej przez matematyka Mike'a Keitha daje się sprowadzić do postaci, którą bardzo łatwo można zapisać w języku C [23]:

(*wday)=((d+=m<3?y--:y-2,23*m/9+(d-1)+4+y/4-y/100+y/400)%7)+1;

W związku z wykorzystaniem całej dostępnej pamięci programu do innych celów, w końcowej wersji zrezygnowano z obsługi daty. Jednak stworzona funkcja biblioteczna z powodzeniem użyta została w innych projektach realizowanych na bazie modułu "SPA - 1n". Urządzenie w obecnej formie korzysta tylko z obsługi czasu, który pozwala na definiowanie godzin aktywności natrysku.

W rozdziale poświęconym timerom wspomniano o użyciu Timera1 w kodzie obsługi zegara czasu rzeczywistego. Początkowo odczytywanie czasu z zegara wykonano przy użyciu timera programowego, dzięki któremu co sekundę odczytywano z zegara aktualną wartość. Jednak przeprowadzone doświadczenia oraz długotrwałe obserwacje kilku egzemplarzy urządzeń wykazały, że układ PCF8583 jest bardzo wrażliwy na jakość zastosowanego kwarcu 32,768kHz. Podejmowane próby stabilizacji szybkości odliczania czasu w postaci doboru kondensatorów współpracujących z kwarcem, czy też ekranowaniem jego obudowy nie przyniosły rezultatów. Nawet rezonatory pochodzące z tej samej serii produkcyjnej wykazywały się dużą rozbieżnością stabilności. Rozwiązaniem stało się użycie Timera1 w trybie przechwytywania wartości do wyznaczania offsetu konkretnego egzemplarza kwarcu. Wymusiło to dokonania małych zmian konstrukcyjnych w wykonanych płytkach - podłączenia sygnału INT (na którym pojawiają się impulsy o częstotliwości 1Hz) z układu do wejścia ICP mikrokontrolera. Obsługa timera ze względu na jego 16-to bitową pojemność wymaga użycia oprócz przerwania od przechwycenia również przerwania od przepełnienia timera. W ten sposób, przy taktowaniu mikrokontrolera rezonatorem o częstotliwości 16MHz i preskalerze równym 8 uzyskano rozdzielczość pomiaru okresu z dokładnością do 0,5us. W celu ułatwienia analizy pomiarów wynik, poprzez operację przesunięcia bitowego w prawo, zawężony został do rozdzielczości 1us.

Powyższa metoda pozwoliła na prowadzenie automatycznego dostrajania układu w takt wzrostu wartości offsetu. Każdorazowo, po wystąpieniu przerwania ICP, odczytywany jest czas aktualny oraz czas trwania ostatniego okresu. Na jego podstawie funkcja zliczająca offset dokonuje wyboru, czy należy zmodyfikować czas systemowy. Modyfikacja w przód lub w tył realizowana jest automatycznie po wykryciu, że offset przekroczył jedną sekundę. Plusem wykorzystania przerwania ICP jest brak potrzeby wykorzystywania timerów programowych do odliczania czasów rzędu kilkudziesięciu sekund (zmienne większe od uint8). Zamiast tego wystarczą zmienne 8-io bitowe, dzięki którym można odliczyć maksymalnie 255 s. opóźnienia.



komentarze

Copyright © 2008-2010 EPrace oraz autorzy prac.