RTC modul (Real-Time Clock), je specializovaný integrovaný obvod, který uchovává přesný čas a datum i při výpadku napájení díky zabudované záložní baterii. S mikroprocesorem komunikuje přes I2C sběrnici. Záložní baterie (obvykle malá knoflíková, v našem případě CR1225) zajišťuje chod i bez hlavního napájení. V našem přípravku máme osazen RTC modul DS1307 (datasheet zde).
K RTC obvodu se obvykle připojuje krystal o frekvenci 32,768 kHz. Proč zrovna tato hodnota? Protože 32 768 je mocnina dvou (2¹⁵ = 32 768), to znamená, že RTC obvod může tuto frekvenci 15krát vydělit dvěma a dostane přesně 1 Hz – tedy jeden puls za sekundu. Díky tomu není potřeba složitý dělicí obvod, stačí jednoduchý binární čítač.
I²C (Inter-Integrated Circuit, u Atmelu označována TWI) je sériová sběrnice pro komunikaci mezi mikrokontroléry a periferiemi. Používá dva signální vodiče: SDA (Serial Data) – přenos dat SCL (Serial Clock) – hodinový signál
Komunikace probíhá v režimu master-slave, kde master řídí přenos. Každé zařízení má unikátní adresu a lze připojit více zařízení na stejné dvě linky. Hezký článek o I2C komunikaci zde. A další článek o různých dalších sběrnicích
Zdroj obrázku: https://www.hibit.dev/posts/102/communication-protocols-uart-i2c-and-spi
Pomocí I2C sběrnice můžeme vyčítat nebo zapisovat obsah registrů DS1307. V datasheetu najdeme rozložení jednotlivých časových údajů:
RTC čip DS1307 obsahuje kromě obvodu reálného času i 56 bajtů RAM paměti. Ta je sice napěťově závislá (narozdíl od paměti EEPROM) a bez napájení se data ztratí, ale tím, že má modul vlastní baterii, data zůstanou zachována i když odpojíme napájecí adaptér přípravku. Paměť lze libovolně číst a zapisovat přes I²C sběrnici. Využít ji můžeme například k ukládání uživatelských dat a parametrů, které by měly zůstat zachovány i po vypnutí napájení. Adresa RAM v DS1307 začíná od 0x08 a končí na 0x3F.
Pro usnadnění práce můžeme použít hotové knihovny pro I2C a RTC obvod DS1307 i2c.c, i2c.h, DS1307.c, DS1307.h. Knihovny přidáte stejně jako knihovnu pro LCD. Projděte si zejména soubor DS1307.h kde najdete deklarace funkcí, které knihovna obsahuje.
#include "lcd.h" // knihovna pro práci s LCD displejem
#include <stdio.h> // tato knihovna obsahuje funkci sprintf()
#include "i2c.h" // knihovna pro práci s I2C sběrnicí
#include "DS1307.h" // knihovna pro ovládání RTC obvodu DS1307
main()
také musíte inicializovat I2C komunikaci. K tomu slouží funkce i2c_ini();
.DS1307_set_seconds(0);
.Pokud není na RTC přesný čas, nastavte jej funkcemi DS1307_set_xx()
.
Napište program, který čte z RTC pouze sekundy (jednou za sekundu). Změřte I2C komunikaci pomocí logického analyzeru (signál SCL je na pinu PD.0, SDA je na pinu PD.1). Zkuste v softwaru logického analyzeru nastavit dekódování I2C sběrnice a rozlišit v datech informaci o sekundách.