Pokud chcete ve svých aplikacích pracovat s aktuálním datem a časem, můžete využít tento zajímavý obvod, který umí více než jen udržovat aktuální datum a čas.
Základní popis
DS1307 je obvod reálného času (RTC, Real-Time Clock), který obsahuje 63 bajtů volatilní paměti (tedy po odpojení napájení se obsah paměti smaže) a je možné s ním komunikovat pomocí sběrnice I²C. Pokud je připojen k napájení, počítá impulzy z externího oscilátoru a ukládá aktuální hodnoty data a času. V tomto režimu, pokud je připojen pouze k baterii má spotřebu méně jak 500nA.
Napájení tohoto obvodu je dvojí — buď 5V z aplikace, nebo 3V ze záložní baterie. Obvod si sám přepíná tyto dva zdroje podle potřeby. Pokud je napětí z aplikace odpojeno, nebo je menší jak napětí baterie plus 0,2V (tedy 3,2V), obvod napájí baterie a je v režimu se sníženou spotřebou a nelze s ním komunikovat. Jakmile externí napětí stoupně nad tuto hranici, obvod odpojuje napětí baterie. Jakmile napětí stoupne nad 1,25 násobek baterie (tedy 3,75V), lze s obvodem začít komunikovat pomocí I²C sběrnice.
Vnitřní paměť
Jak již bylo řečeno, obvod obsahuje 63 bajtů vnitřní volatilní paměti, do které se ukládá aktuální datum a čas a další uživatelské informace. Na prvních 8 bajtech jsou uloženy vteřiny, minuty, hodiny, dny, datum, měsíc, rok, control registr a nakonec 56 bajtů paměti RAM pro uživatelská data. Pokud je k DS1307 připojena baterie, je obsah paměti udržován.
OOh | Vteřiny | Spodních 7 bitů, 8. bit aktivuje/deaktivuje celý obvod. |
O1h | Minuty | Spodních 7 bitů, zbytek není použit. |
O2h | Hodiny | 7. bit určuje jestli se použije 12 nebo 24 hodinový formát, 6. bit určuje jestli je AM nebo PM (při 12 hodinovém formátu), 6. až 1. bit obsahuje hodiny. |
O3h | Dny | Spodní 3 bity, zbytek není použit. |
O4h | Datum | Spodních 6 bitů, zbytek není použit. |
O5h | Měsíc | Spodních 5 bitů, zbytek není použit. |
O6h | Rok | |
O7h | Control | Viz dále. |
O8h | Volná RAM |
Další podrobnosti viz datasheet.
Control registr
Na adrese 07h vnitřní paměti je registr, kterým se ovládají některé další funkce tohoto obvodu. Pátý bit (počítáno od LSB) je SQWE. Pokud je nastaven, je na pinu SQW/OUT hodinový signál (jeho frekvence se dá nastavit 1. a 2. bitem tohoto registru), pokud je vynulován, je na tomto pinu hodnota z MSB (tedy 8. bitu).
Frekvence hodinového signálu na pinu SQW/OUT se nastavuje pomocí dvou spodních bitů Control regitru označených jako RS1 a RS0:
RS1,RS0 | Frekvence SQW/OUT |
---|---|
00 | 1Hz |
01 | 4,096kHz |
10 | 8,192kHz |
11 | 32,768kHz |
Komunikace pomocí I²C
Čtení a zápis dat z/do obvodu probíhá pomocí sběrnice I²C s hodinovým kmitočtem 100kHz. DS1307 se chová jako slave s adresou 1101000 (+ LSB, který určuje směr komunikace — R/W, viz specifikace I²C).
Zápis dat do paměti začíná adresou zařízení, počáteční adresou paměťové buňky a nakonec následují samotná data. Čtení dat začíná adresou zařízení a za ním následují příchozí data.
Každý odeslaný bajt musí příjemce potvrdit bitem ACK. Celá komunikace přesně odpovídá standardu I²C. Pro další podrobnosti viz datasheet.
Základní zapojení
Obvod DS1307 ke své činnosti potřebuje krystal o frekvenci 32,768kHz. Lze také použít externí oscilátor s touto frekvencí připojený na pin X1 a pin X2 zůstane nezapojený.
Dále je potřeba připojit baterii s napětím 3V. Datasheet uvádí, že s baterií 48mAh je obvod schopen udržovat svoji činnost po 10 let (při okolní teplotě 25 C).
Pokud chcete obvod vyzkoušet a nechce se vám konstruovat DPS, nebo obvod oživovat a konfigurovat, můžete použít již hotový přípravek. Nabízí jej například zahraniční server Sparkfun.com za necelých $15. Tento obvod je již oživen, dodáván se zapojenou baterií a tím pádem má aktuální datum a čas (přesněji řečeno je nastaven na MST, to je GMT-7, není ale problém si jej přenastavit na GTM+1).
Arduino a time.h
Na závěr uvedu, že tento obvod lze jednoduše použít společně s Arduinem. Knihovna pro práci s časem Timeobsahuje i kód pro synchronizaci s RTC obvodem DS1307. Více informací v článku Arduino a obvod reálného času.