Maxim DS1306 Zegar czasu rzeczywistego

Maxim DS1306 Zegar czasu rzeczywistego
Razem głosów: 1 co stanowi: 100% całości.

imgres

Pracuje nad projektem który wymaga stabilnego i dokładnego odmierzania czasu.

W związku z czym przeglądałem noty typowych zegarów PCF i doszedłem do wniosku,

że czas pobawić się zegarami firmy Maxim-DALLAS.

Mój wybór padł na układ DS1306 jako ze pracuje na magistrali SPI co oznacza,

 że mogę go wykozystac wszędzie gdzie tylko występuje ta magistrala,

tak wiec trzeba go jakoś podłączyc teraz do SunDuino :)

 Jako ze obsługa zegara DS1306 dzieki interfrejsowi SPI jest bardzo prosta ,

 wystarczy tylko czytaż odpowiednie rejestry.

maxim1306

DS1306 jest wyposarzony w sporo opcji np. zasilanie awaryjne, które może być zrealizowane

na bateryjce 3V lub na kondensatorze elektrolitycznym co pozwala utrzymać działanie układu

podczas odcięcia zasialania podstawowego.

Podczas pracy na zasilaniu awaryjnym może generować sygnał alarmu.

Z zewnętrznych elementów jakie są potrzebne do uruchomienia DS1306 jest kwarc 32,768 kHz

czyli standartowy oscylator zegarkowy.

Kilka rezystorów  pull-UP i bateryjke zasilania awaryjnego np. CR2203 ,

jeśli zrezygnujemy z potrzymywania podłaczamy tylko VCC2 i VBAT do masy.

Można też zrezygnowąć z sygnału przerwania INT0 , można ten pin zostawic niepodłaczony.

Ale proponuje poczytać DAtasheet tego układu, tam znajdziecie wszystkie informacje o nim i sposobach podłączenia.

maxim1306schemat

PROGRAMOWANIE.

Jak juz wiemy DS1306 kożysta z magistrali SPI do komunikacji i robi to w trybie SPI 1 co oznacza,

że polaryzacja zegara nastepuje gdy zbocze wznosi się oraz gdy spada czyli przypada na mniejwięcej

środek sinusoidy 1KHZ.

(SPI ma cztery tryby działąnia ponumerowane 0-4 zapewnia to pokrycie wszystkich

kombinacji zegara i fazy zegara. Urządzenie którego chcemy użyc powinno więc ustalac tryb ,

lub informowac o fazach zegara np w nocie, należy wtedy ustawić odpowiednio rejestr SPCR.

Jest to proste , ale też uciążliwe i jest to pierwsza rzecz, którą należy sprawdzic jeśli coś nie działa prawidłowo).

Jeśli zajzymy do noty ATMega8 lub Mega168 zauważymy, że istotnie SPI  (Serial Pheriperial Interface)

ma 4 tryby pokrywające wszystkie kombinacje polaryzacji zegara i fazy zegara.

Tyle tylko, że DS1306 oczekuje gdy faza zegara osiągnie krawędź opadania

– a ską ja mam o tym wiedzieć kiedy to nastąpi ??

Na szczęście NOTA DS1306 w rozdziale SPI wyjaśnia to szczegółowo .

Niestety straciłem kilka godzin na uruchomienie , bo nie chcialo mi sie dokładnie czytać :(

No dobra czas na utworzenie naszego SPI :

Musimy ustawić rejestry tak by SPI działało we właściwym trybie, ten króki kod to włąśnie robi:

Teraz gdy już utwożyliśmy właściwie działające SPI by uzyskać dane z naszego DS1306

wystaczy zapisywać i odczytywać właściwe rejestry, w których są przechowywane dane takie jak:

aktualny czas, czas alarmu, data i 96bitów RAM do dyspozycji użytkownika,

który można używać do własnych celów.

Warto wiedzieć że każdy rejestr DS1306 ma własny adres do zapisu i odczytu ,

co oznacza, że każdy rejestr ma 2 adresy, jeden do odczytu rejestru , a drugi do jego zapisu.

np. w celu ustawienia właściwego dnia tygodnia musimy zapisać właściwą wartość

w rejestrze pod adresem 0x83, a jeśli chcesz sie dowiedzieć ile jest aktualnie sekund odczytujesz

rejestr pod adresem 0x00

Oto pełna lista rejestrów DS1306 wraz z adresami :


maxim1306mapa

Znajduje sie tu też specjalny rejestr kontroli który można użyć do zabezpieczenia innych

 rejestrów przed przypadkowym nadpisaniem.

KOD BCD:

Czas w rejestach jest przechowywany w formacie BCD (Binary Code Decimal)

Co wystarcza do przechowywania liczb dziesietnych w kodzie binarnym po przecinku.

Liczby te są oczywiscie od 0 od 9, podobnie w przypadku danych daty też są przechowywane

po przecinku co jak sie okazuje w kodzie BCD ma to sens.

Dzieki czemy unikamy żmudnego przeliczania danych szesnastkowych na format wygodny do wyświetlenia.

Innymi słowy nie musimy przekształcac liczby 0x0A na postać dziesietną by uzyskć liczbe sekund ,

 bowiem wartośc ta jest bezpośrednio wpisana do rejestru i wystarczy ją odczytać.

W BCD każda liczba to półbajta czyli 4bity. Każde 4 bity moga przechowywac dowolną

liczbe całkowitą z zakresu 0-15 (lub 0x00 – 0x0F w systemie szesnastkowym) Z BCD wynika jednak,

że moga byc to tylko „Legalne” liczby z zakesu 0-9 i przyjmuje sie ze wszystkie inne są „niedozwolone”.

DS1306 pozwala więc łatwo ustawic czas np: by ustawic 45s wystarczy wpisac do rejestru

pod adresem 0x80 wartość 0x45.Jeśli chcesz ustawić godzine 8smą wystarczy wpisac 0x08 do adresu 0x82.

Ciekawe jest tez to ze DS1306 umozliwia prace w trybach AM/PM i 24 godzinnym.

Jednak przy AM/PM jest to troichę skomplikowane, ale jak sobie z tym radzic opisano w specyfikacji układu.

ALARMY w DS1306

Wspaniałe jest to, że DS1306 umosliwia ustawianie alarmów w czasie rzeczywistym.

Dodatkowo obsługuje 2 Alarmy na pinach INT0 (aktywne w stanie niskim) i INT1

piny te sa odpowiedzialne za generowanie przerwania dla mikrokontrolera.

Jako że INT0 jest aktywny w stanie niskim by uzyskac sygnał właściwy dla mikrokontrolera

może byc konieczne podciagniecie go do plusa poprzez rezystor Pull-UP 10K miedzy pinem 5 ( INT0) a VCC1.

A no tak wspomniałem, że DS1306 obsługuje 2 alarmy, ale jak sie okazuje INT1 jest aktywny

tylko wtedy gdy układ jest zasilany przez VCC2 (backup power) i VBat (zasilanie bateryjne).

Pozwala to na zrobienie larmu specjalnego gdy urządzenie przejdzie na zasilanie awaryjne ,

np w przypadku odcięcia głównego zasilania.

KOD dla SunDuino z mikroprocesorem ATMega8 i osobny dla ATMega168:

W przypadku innego sprawdż piny przed podłaczeniem.

Kod wywołuje alarm na każde 0s i co 15s  na złaczu INT0 , czas jest odczytywany w terminalu:

 

 

Podziel się na:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Blogplay