Připojení ds1307 k mikrokontroléru avr. Připojení obvodu DS1307 k mikrokontroléru přes rozhraní TWI. Ručně v kódu

DS1307 se také nazývá RTC (Real Time Clock). Tento čip jsou hodiny a kalendář v reálném čase. Komunikace s mikroobvodem probíhá přes rozhraní I 2 C. Jeho výhodou je, že funguje (počítá čas) při vypnutí hlavního napájení ze záložního zdroje 3 voltů (například z baterie CR3022). DS1307 má ale jednu nevýhodu: nekontroluje správnost zadaných údajů. Pro práci s mikroobvodem budete potřebovat minimální sadu: křemen na 32768Hz, 3voltovou baterii a dva odpory 4,7 kOhm. Schéma zapojení DS1307:

Práce s DS1307 v BASCOM-AVR

Chcete-li začít pracovat s mikroobvodem, musíte nakonfigurovat porty, ke kterým je mikroobvod připojen; k tomu použijte příkaz Konfigurace:
Konfigurace Sda =(Port mikrokontroléru, ke kterému je připojena SDA noha čipu DS1307)
Konfigurace Scl =(Port mikrokontroléru, ke kterému je připojena větev SCL čipu DS1307)
Například:
Konfigurace Sda = Portb.1
Config Scl = Portb.0

Po konfiguraci portů můžete začít pracovat s čipem: číst a zapisovat data. Čas a datum z čipu DS1307 lze přečíst takto:

I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte (proměnná, do které zapisujeme sekundy), Ack I2crbyte (proměnná, do které zapisujeme minuty), Ack I2crbyte (proměnná, do které zapisujeme hodiny), Ack I2crbyte (proměnná I2crbyte napište číslo dne v týdnu), Ack I2crbyte (proměnná, do které zapisujeme datum), Ack I2crbyte (proměnná, do které zapíšeme číslo měsíce), Ack I2crbyte (proměnná, do které zapíšeme rok), Nack I2cstop

Po přečtení dat je musíte převést do desítkového formátu, takto:
(proměnná sekund) = Makedec((proměnná sekund) )
(proměnné minuty) = Makedec((proměnné minuty) )
(proměnná hodin) = Makedec((proměnná hodin) )
(proměnná dne v týdnu) = Makedec((proměnná dne v týdnu) )
(proměnné datum) = Makedec((proměnné datum) )
(proměnná za měsíc) = Makedec((proměnná za měsíc) )
(proměnná za rok) = Makedec((proměnná za rok) )

Zde je příklad čtení času a data a jejich převodu do desítkového formátu:

I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte Seco , Ack I2crbyte Mine , Ack I2crbyte Hour , Ack I2crbyte Day , Ack I2crbyte Dat , Acrby Ack I2. = Makedec(seco) Mine = Makedec(mine) Hodina = Makedec(hodina) Den = Makedec(den) Dat = Makedec(dat) Měsíc = Makedec(měsíc) Rok = Makedec(rok)

Naučili jsme se číst data, nyní zkusme data zapisovat do DS1307. Takhle:
(Proměnná, kterou si zapíšeme) = Makebcd((Proměnná, kterou si zapíšeme) )
I2cstart
I2cwbyte&HD0
I2cwbyte(Buňka, do které budeme zapisovat data)
I2cwbyte(Proměnná, kterou si zapíšeme)
I2cstop

Vezměte prosím na vědomí, že příkaz Makebcd převede proměnnou na binární desítkový formát. Čísla a označení buněk:

Zde je příklad zápisu proměnné sekund:
Seco = Makebcd (seco)
I2cstart
I2cwbyte&HD0
I2cwbyte 0
I2cwbyte Seco
I2cstop
Mimochodem, je třeba poznamenat, že při prvním spuštění DS1307 (například při připojení záložní baterie) mikroobvod vrátí hodnotu 80 v sekundách, což znamená, že hodiny jsou zastaveny. Chcete-li je spustit, zapište si v sekundách hodnotu 1. Pokud DS1307 při čtení jakýchkoli dat vrátí hodnotu 255 nebo 168, znamená to, že čip není správně připojen, nebo chybí záložní baterie.

Praktická práce s čipem DS1307

Nyní si zkusme s čipem DS1307 pracovat v praxi: sestavme si jednoduché hodiny s nastavením času pomocí tlačítek. K tomu si vezměme samotný čip DS1307, mikrokontrolér Attiny2313, LCD indikátor na řadiči HD44780 a několik diskrétních komponent. Pojďme si dát dohromady jednoduché schéma:

A napíšeme jednoduchý program s využitím získaných znalostí:

$regfile = "attiny2313.dat" $crystal = 4000000 Konfigurace Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7, E = Portb.3, Rs = Portb .2 Config Lcd = 16 * 2 Config Pind.5 = Input Config Pind.4 = Input Config Sda = Portb.1 Config Scl = Portb.0 Dim Seco As Byte Dim Mine As Byte Dim Hour as Byte Initlcd Cls Cursor Off Do I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte Seco , Ack I2crbyte Mine , Ack I2crbyte Hour , Nack I2cstop Seco = Makedec(seco) Mine = Makedec(mine) Lour = Makedec(mine) Hour = Maked dec(hour) Hour = Maked1hour ":" ; Těžit; ":" ; seco ; " " If Pind.5 = 0 Then Incr Mine Mine = Makebcd(mine) I2cstart I2cwbyte &HD0 I2cwbyte 1 I2cwbyte Mine I2cstop Waitms 100 End If If Pind.4 = 0 Then Incr Hour Hour = Makebcd(hodina) I2cstart Iwwbyte2cw2 Hour I2cstop Waitms 100 End If Loop End

Lekce 17

Část 1

Hodiny reálného času DS1307

Pokračujeme v lekcích programování MK AVR.

A dnes se seznámíme s velmi dobrým mikroobvodem DS1307. Tento mikroobvod je hodiny reálného času (hodiny reálného času nebo RTC).

Také kvůli tomu, že komunikace mezi mikrokontrolérem a tímto čipem bude probíhat pomocí rozhraní I2C, opět posílíme téma programování této sběrnice.

Tento mikroobvod představuje společnost Dallas, zde je jeho pinout a hlavní technické vlastnosti

Zde vidíme, že máme nohy SDA a SCL, jejichž účel velmi dobře známe. Dále jsou zde piny X1 a X2 pro připojení quartz rezonátoru na 32768 Hz, napájecí piny - VCC a GND, výstup pro pulsy trvající 1 sekundu nebo jinou frekvenci v závislosti na nastavení určitých registrů a také kladný kontakt pro baterii který je připojen, aby hodiny tikaly, když je hlavní napájení vypnuto. Záporný kontakt této baterie připojíme ke společnému napájecímu vodiči.

Vidíme také, že tento čip je dostupný v planárních a DIP pouzdrech.

Tento mikroobvod může být napájen buď 3 volty nebo 5 volty.

Přístup k tomuto mikroobvodu přes rozhraní I2C probíhá v zásadě stejným způsobem. stejně jako paměťový čip, který jsme použili v minulé lekci. Samozřejmě budou nějaké nuance, ale o tom později.

Jelikož mám tento čip osazený ve stejném modulu, ve kterém je osazen čip EEPROM a máme jednu výměnnou sběrnici, tak čip DS1307 „rozpozná“, že se řeší, samozřejmě na adrese, že je jiný než čipu EEPROM.

Zde jsou schémata mikroobvodu, který přijímá a vysílá data

Modře je zvýrazněna adresa, na které budeme k tomuto čipu přistupovat.

V podstatě. Nevidíme velký rozdíl se schématy čipu EEPROM.

Další rozdíl v manipulaci bude v tom, že adresování paměti bude již jednobajtové, jelikož paměťové buňky resp registrů Tento mikroobvod má velmi málo.

To jsou tyto registry

Účel těchto registrů:

00h- sekund. Sekundy jsou uloženy v binárním desítkovém formátu. To znamená, že nižší 4 bity ukládají jednotky sekund a vyšší tři bity desítky. K dispozici je také bit SH - to je bit startu čipu.

01h- minut. Uloženo podobně.

02h- univerzálnější registr. Zde jsou hodinky uloženy. Ve čtyřech nejméně významných bitech jsou jednotky, v dalších vyšších dvou jsou desítky, v dalším 6. bitu je příznak, zda je odpoledne nebo před polednem, v 7. bitu je režim ukládání - 12hod. nebo 24 hodin.

03h- den v týdnu. Jsou uloženy v nejméně významných 3 bitech, zbývající bity se nepoužívají.

04h— zde je uložen den v měsíci, rovněž v binárním desítkovém formátu. Čtyři nejméně významné bity obsahují jedničky, další dva vyšší obsahují desítky, zbývající bity se nepoužívají.

05h- číslo měsíce v roce - je uloženo v binárním desítkovém formátu stejně jako hodiny.

06h- číslo roku, a ne celé čtyřmístné, ale pouze dvoumístné. Nejméně významné čtyři bity jsou jedničky a nejvyšší čtyři bity jsou desítky.

Použijeme těchto sedm registrů. Poslední registr je určen pro konfiguraci pulzní frekvence na pulzním výstupu mikroobvodu; to se provádí ve spodních dvou bitech registru. standardně to bude frekvence 1 Hz, to nám stačí na bliknutí dvojtečky, takže tyto bity nepoužijeme. Bity SOWE a OUT se také používají ke konfiguraci a aktivaci obdélníkového tvarovače vlny.

Projekt pro práci s tímto čipem vznikl běžným způsobem s názvem Moje hodiny1307, soubory související s EEPROM odtud byly odstraněny a soubory byly přidány RTC.c A RTC.h.

#ifndefMAIN_H_

#definovatMAIN_H_

#definovatF_CPU8 000 000 UL

#zahrnout

#zahrnout

#zahrnout

#zahrnout

#zahrnout

#zahrnout"usart.h"

#zahrnout"twi.h"

#zahrnout"RTC.h"

#endif/* MAIN_H_ */

V hlavním souboru MyClock1307.c pojďme vytvořit globální proměnné pro uložení času, data a dne v týdnu a poté bude celý obsah po odstranění všech nepotřebných věcí v něm vypadat takto

#zahrnout"hlavní.h"

nepodepsanýcharsek, min, hodina, den, datum, Měsíc, rok;

inthlavní( prázdnota)

I2C_Init();

USART_Init(8);

Zatímco(1)

Z předchozího kódu zbyla pouze inicializace I2C a USART.

Nyní potřebujeme čip vůbec nějak nastartovat. Pokud je mikroobvod nový nebo nebyl nikdy použit nebo někdo změnil hodnotu bitu CH speciálně pro nějaký účel, pak ještě „nefunguje“.

Obecně platí, že jakmile nastavíme všechny hodnoty v registrech mikroobvodu, spustí se a naše hodiny se spustí.

Zapojení nebo obvod je použit i z minulé lekce, to znamená, že se v terminálovém programu podíváme na čas přes sběrnici USART.

Proto vlastně s využitím našich znalostí z předchozí lekce napíšeme napsat funkci pro nastavení času.

Nejdříve samozřejmě projdeme podmínkou START

//Nastav čas

I2C_StartCondition();

Poté přeneseme adresu se zápisovým bitem 0

I2C_StartCondition();

I2C_SendByte(0b11010000);

Pojďme na adresu 0, což znamená do části paměti, kde se nachází úplně první registr

I2C_SendByte(0b11010000);

I2C_SendByte(0); //Přejdi na 0x00

Před zápisem jakýchkoli hodnot do registrů mikroobvodu si pamatujeme, že musíme nejprve převést čísla do formátu BCD, který bude pro registry vhodný. Za tímto účelem přejdeme do souboru RTC.c a napíšeme takovou funkci. Bude to velmi snadné a nepotřebuje žádné vysvětlení.

nepodepsanýcharRTC_ConvertFromBinDec( nepodepsanýcharC)

{

nepodepsanýcharch= (( C/10)<<4)|( C%10);

vrátit sech;

}

Nuže, napišme také funkci inverzního typu, převádějící číslo z binárně-desítkového formátu na desítkové. S jeho pomocí naopak převedeme odečty času čtení do podoby vhodné pro naše vnímání (HRI - human-readable interface)

nepodepsanýcharRTC_ConvertFromDec( nepodepsanýcharC)

{

nepodepsanýcharch= (( C>>4)*10+(0b00001111&C));

vrátit sech;

}

I zde je vše velmi přehledné, vysokou tetrádu bajtu posuneme doprava, vynásobíme deseti a přidáme nízkou tetrádu (vysokou tetrádu maskujeme nulami)

Zapišme prototypy těchto funkcí do souboru RTC.c

#zahrnout"hlavní.h"

nepodepsanýcharRTC_ConvertFromDec( nepodepsanýcharC); //převod čísla BCD na desítkové

nepodepsanýcharRTC_ConvertFromBinDec( nepodepsanýcharC);

Programátor, modul RTC DS1307 s paměťovým čipem a USB-TTL adaptér lze zakoupit zde:

Programátor (spolehlivý prodejce) USBASP USBISP 2.0

Podívejte se na VIDEONÁVOD (klikněte na obrázek)

Zobrazení příspěvku: 7 354

Recenze o těchto hodinkách na internetu jsou nejvíce rozporuplné. Někteří říkají, že hodinky jsou úžasné, zatímco jiní je nazývají ubohým výtvorem Dallasu. A tak, abych rozptýlil všechny falešné fámy, vyndal jsem mikrukhu ze skrýše a začal experimentovat.

Zvláštnosti:

  • Velmi nízká spotřeba energie. Výrobce slibuje 10 let provozu hodinek z jedné standardní baterie. CR2032
  • 56 bajtů paměti pro ukládání uživatelských dat. Myslím, že to není zvlášť nutná možnost, ale může se někomu hodit.
  • Programovatelný výstup pro taktování externích zařízení. Výstup může mít 1 Hz, 4,096 kHz, 8,192 kHz a 32,768 kHz.
  • 24hodinový a 12hodinový režim

Pinout

Hodinové kolíky jsou umístěny následovně:

X1, X2— Kolíky pro připojení křemenného rezonátoru na frekvenci 32,768 kHz
VBAT— Výstup pro připojení 3V záložní baterie
GND- Země
S.D.A.- datová linka sběrnice i2c
SCL— i2c autobusová hodinová linka
SQW/OUT– výstupní signál pro taktování externích zařízení
VCC- 5V napájecí zdroj

Připojení k ovladači
Vazba je minimální. K provozu sběrnice i2c budete potřebovat 32,768 kHz quartz, dvojici rezistorů a třívoltovou baterii.

Správné rozložení desky
Přesnost hodin a vlastně i výkon hodinek obecně závisí na rozložení plošného spoje. Dallas ve svém datovém listu doporučuje snížit délku vodičů od mikroobvodu ke křemennému rezonátoru na minimum a tyto vodiče obklopit obdélníkem spojeným se zemí. Navíc jsem kvůli spolehlivosti připájel ke křemennému tělu vodiče jdoucí k zemi a paralelně s napájecím zdrojem umístil kondenzátor 0,1 uF.

Mimochodem, může to fungovat i bez křemene. K tomu je do větve X1 přiveden externí hodinový signál s frekvencí 32,768 kHz a X2 zůstává zavěšen ve vzduchu.

Organizace paměti hodin
Toto miniaturní zařízení je vybaveno 64 bajty paměti. Prvních osm bajtů funguje. Ukládají čas, datum, den v týdnu. Zbytek je přidělen potřebám uživatele. Můžete si do nich uložit například nějaká nastavení nebo něco jiného. Při ztrátě záložního napájení jsou přirozeně zničeny všechny informace v této paměti. Veškerá práce s hodinami (čtení a nastavování času/data) spočívá ve čtení a zápisu potřebných paměťových buněk.

Všechna čísla v paměti jsou uložena v binárním desítkovém formátu. To znamená, že do jednoho bajtu lze uložit dvě číslice. Například číslo 0x23 obsahuje číslo 2 a číslo 3. Každému číslu jsou přiděleny 4 bity. Proč se to dělá? Pro pohodlí a úsporu paměti. Kromě času a data je v paměti uloženo několik bitů nastavení:

  • Zastavení hodin- ovládá hodiny. Když je bit nastaven, hodiny se zastaví. Pro spuštění hodin je potřeba do tohoto bitu zapsat 0. Po připojení záložní baterie je tento bit nastaven a hodiny nepočítají čas! Musíte si to zapamatovat.
  • 24/12 - tento bit pro výběr režimu hodin. Když je tento bit roven jedné, použije se 12hodinový režim. Jinak 24 hodin. Pokud je použit 12hodinový režim, pak pátý bit označuje AM nebo PM now. Pokud je bit 1, znamená to PM. Ve 24hodinovém režimu se tento bit používá k uložení desítek hodin ve spojení s bitem 4.
  • Výstup— ovládá stav nohy SQW/OUT. Bit je nastaven - log je na noze 1. Reset - na noze 0. K ovládání tímto způsobem bit SQWE musí být resetováno.
  • SQWE- když je bit nastaven, objeví se na noze SQW/OUT obdélníkové impulsy.
  • RS1, RS0— tyto bity nastavují frekvenci pulzů. Závislost frekvence na kombinaci bitů je v tabulce níže:

Software

Pro práci s hodinami DS1307 byla napsána jednoduchá knihovna obsahující následující základní funkce:

DS_start— spustí hodiny. Hodiny můžete také spustit nastavením času.
DS_stop- zastaví hodiny
DS_set_time — Nastavení času. Před voláním procedury musíte zadat sekundy do tmp1, minuty do tmp2 a hodiny do tmp3. Hodiny ve 24hodinovém formátu.
DS_get_time: —čtení času z hodin. sekundy budou zaznamenány v tmp1, minuty v tmp2, hodiny v tmp3
DS_get_date:— čtení data z hodinek. Den bude zaznamenán v tmp1, měsíc v tmp2, rok v tmp3
DS_set_date: — nastavení data. Před voláním procedury musíte zadat den do tmp1, měsíc do tmp2 a rok do tmp3 (poslední 2 číslice)

Rutiny pro nastavení/čtení času a data mohou přijímat/vracet vstupní data v BCD a desítkovém formátu. Chcete-li vybrat požadovaný formát, musíte v každém postupu okomentovat nebo odkomentovat tři řádky (v kódu jsou k tomu poznámky).

Testovací program umožňuje ovládat hodiny přes UART (rychlost 9600, regulátor pracuje na 8 MHz). Při spuštění se okamžitě zobrazí čas, datum a výzva k zadání příkazů od 1 do 3. Když vyberete volbu 1, znovu se načte čas/datum. Možnost 2 umožňuje nastavit čas a možnost 3 datum. Pokud si chcete zkusit pohrát s hodinami, ve zdrojovém archivu je obsažen soubor simulace.

Přesnost
Zde hodně záleží na použitém quartzu a rozložení desky. Datasheet uvádí, že křemenná kapacita by měla být 12,5 pF. Říká se, že nejlepší je použít krystaly ze základních desek. Ke korekci zdvihu můžete k rezonátoru připájet ořezávací kondenzátor a pomocí něj měnit frekvenci v malých mezích. Osobně mi tyto hodinky fungují dva dny a jsou o 3 vteřiny pozadu. Něco mi říká, že problém je v kapacitě křemene, zkusím jiný a podám zprávu.

Závěr
Nejsou to špatné hodinky. Ideální pro amatérské použití. I když někteří píší o závadách, zatím jsem se s nimi nesetkal.

Aktualizováno 23. 7. 2018. Ahoj všichni. Pro práci s hodinkami jsme se v minulém článku zabývali rozhraním TWI, na které se dnes odkážeme. Tak začněme. Tyto hodinky jsou kompatibilní s TWI, tzn. princip výměny dat na sběrnici bude stejný, jak jsme uvažovali.

Obrázek níže ukazuje umístění pinů, popis a samotný vzhled našich hodin, nebo jak to později nazveme RTC (Real-time clock) - hodiny reálného času nebo generátor časových pulzů. Toto zařízení" DS1307 Počítá sekundy, minuty, hodiny, den v měsíci, měsíc, den v týdnu a rok včetně přestupných let. Kalendář je platný do roku 2100. Myslím, že nám to bude stačit na celý život :).

Jak je patrné z popisu, je zde vstup pro nouzové napájení z baterie při vypnutí externího napájení. V tomto režimu RTC podporuje pouze svůj hlavní účel - časování, bez externích požadavků. Napájecí napětí baterie by mělo být 2 – 3,5V. Technický popis uvádí, že při nabití více než 48 mAh nám při teplotě 25 stupňů Celsia vydrží náš okruh cca 10 let. Více než nutné. Obrázek níže ukazuje „tablet“ CR2032 a držák, který použijeme.

Nyní pojďme k externímu napájení. Provozní napětí hodin je 5V s malým rozsahem 4,5 -5,5V. Napětí baterie 3V (minimálně 2, maximálně 3,5V) Provoz RTC je rozdělen do tří napěťových režimů:

1. Vcc=5V – čtení, zápis, počítání;
2. Vcc= pod 1,25*Vbat, ale nad Vbat +0,2V - počítá se pouze baterie z externího napájení.
3. Vcc pod Vbat: RTC a RAM se přepnou na napájení z baterie. Spotřeba v aktivním stavu je 1,5 mA, z baterie 500-800 nA.
Napětí pro vysílání/příjem informací:
Logická 0: -0,5V - +0,8V
Logika 1: 2,2 V – Vcc+0,3 V

Stejně jako v předchozích příspěvcích se jej pokusíme spustit v Proteus. Pojďme ladit kód. A vše převedeme na hardware. Níže je schéma zapojení.

Kde SQW/OUT je výstup hodin, který lze naprogramovat na výstupní frekvence 1Hz, 4,096 Hz, 8,192 Hz a 32,768 Hz. Tito. lze použít k externímu přerušení regulátoru s frekvencí 1s. Velmi užitečná funkce. Ale nebudeme to potřebovat. Mimochodem je to také otevřený kolektor, takže je potřeba pull-up rezistor. Nominální 4,7 kOhm.

Piny X1 a X2 – na ně připojíme křemenný rezonátor s frekvencí 32,768 kHz. Nebo můžete použít externí generátor hodin se stejnou frekvencí. Ale v tomto případě je pin X1 připojen k signálu a X2 zůstává nepřipojený (visí ve vzduchu).

No a závěry SDA a SCL, se kterými jsme se setkali v minulém článku.

Zastavme se trochu u rezonátoru (obrázek níže). Které lze nazvat srdcem hodinek a na kterých závisí přesnost strojku. Kvalita samotného rezonátoru leží na svědomí výrobce, ale z naší strany můžeme chybu způsobenou vnějšími faktory snížit, pokud dodržíme následující doporučení pro umístění rezonátoru:

2. Šířka cesty by měla být také zmenšena, pokud je to možné, aby se snížila pravděpodobnost příjmu rušení z jiných zdrojů.

3. Kolem krystalu by měl být umístěn obvod ve tvaru prstence, který pomáhá izolovat krystal od šumu.

4. Umístěte vodiče do kruhu a připojte je k zemi.

5. Připájejte rezonátor k zemi. Pokud je pozemek správně položen a existuje důvěra.

Obrázek níže ukazuje obrys a umístění rychlého ledu k zemi.

Přišli jsme na to, jak se připojit. Pojďme dále a zjistíme, jak s tím pracovat. RTC je programovatelný a má 8 bajtů speciálních registrů pro konfiguraci a 56 bajtů trvalé statické paměti. Pro výměnu informací je nutná 2vodičová datová sběrnice, tzn. sériová datová sběrnice – kterou jsme probrali v minulém článku. Abychom mohli začít, projdeme si datový list. Co potřebujeme:

Registrovat tabulku. Obrázek níže. Prvních osm registrů je pro výstup a programování našich hodin. Při přístupu k 7. bitu (CH) na adrese 00H a jeho nastavení na 0 spustíme hodiny. Chtěl bych poznamenat, že konfigurace registrů může být libovolná, takže při prvním spuštění ji musíte nakonfigurovat podle svých požadavků. Zbývajících sedm bitů jsou jedničky a desítky sekund.

01H – minuty.
02H – Hodiny, které lze nastavit:
— Bit 6 – s 1 výstupem 12hodinový formát, 0 – 24.
— Bit 5 – v 1 (s 12hodinovým formátem) PM, 0-AM
— Bit 5 – (ve 24hodinovém formátu) toto je výstup druhých deseti hodin (20-23 hodin)
— Bit4 je prvních deset hodin, zbývající bity jsou jednotky hodin.
03H – den v týdnu;
04H – datum;
05H – měsíc v roce
06H – rok.

No, poslední registr je 07H. Tento registr je řídicí registr, kde OUT je zodpovědný za ovládání pinu SQW/OUT. Níže je tabulka povolení výstupu.

VEN
SQWE
SQW/OUT
1
0
1
0
0
0

SQWE - při nastavení tohoto bitu na 1 jsou na výstupy vyvedeny impulsy s danou frekvencí, která je nastavena bity RS1 a RS0.

Tento závěr nám v projektu nebude užitečný. I když jsem k tomu na tabuli vytyčil dráhu. Jako experiment to může být použitelné někde v budoucnu, protože zde můžete provést přerušení na 1 sekundu.

Nyní, když máme všechny potřebné informace, pojďme napsat funkce pro práci s hodinami. Projekt také spustíme v Proteus . Která bude vypadat takto:

Upozorňujeme, že rezonátor v Proteus nemusí být připojen k hodinám (zakroužkovaný červeně).

Obrázek ukazuje hodinový terminál, který zobrazuje čas, který je zase vázán na systémový čas. Terminál debuggeru protokolu I2C nebo TWI, který zobrazuje čas odeslání a přijetí signálu, kde D0 je vysílaný příkaz, D1 je přijatý. Níže zobrazím snímky obrazovky terminálu s výsledkem programu.

Program. Po zvážení základního nastavení hodin napíšeme inicializační funkci.

/*Inicializační funkce zahrnuje nastavení kurzu výměny dat pomocí vzorce (v minulém článku), nastavení předděličky a zapnutí TWI modulu*/
void init_DS1307 (neplatný)
{
TWBR = 2; /*Při frekvenci 1 MHz */
TWSR = (0<< TWPS1)|(0 << TWPS0); /*Předdělovač o 64*/
TWCR |= (1<< TWEN); /*Povolit modul TWI*/
}

void write_DS1307 (uint8_t reg, uint8_t time)/*předáme dva parametry: adresu registru, ke kterému budeme přistupovat a přenášené informace*/
{
/* Vytvořte stav START nastavením bitů řídicího registru */
TWCR = (1<
/*Umožní pracovat modulu TWEN; Generovat počáteční stav TWSTA; Resetovat příznak TWINT */
/*Čekáme na dokončení formování počáteční podmínkou, tzn. dokud není nastaven příznak, stavový kód = 08*/
zatímco (!(TWCR & (1<
/*Dále odešleme adresový paket (adresu zařízení). Obsah paketu se načte do registru TWDR*/
TWDR = 0xd0; /*0b1101000 + 0 – adresa + bit zápisu*/
/*Resetovat příznak pro přenos informací*/
TWCR = (1<
/*Čekání na nastavení příznaku*/
zatímco (!(TWCR & (1<
/*projděte registr, ke kterému budeme mít přístup*/
TWDR = reg;
TWCR = (1<
zatímco (!(TWCR & (1<
/*Předává informace, které mají být zapsány do bajtu registru*/
TWDR = čas;
TWCR = (1<
zatímco (!(TWCR & (1<
/*vytvořit stav STOP*/
TWCR = (1<
}

V této funkci jsme předali tři bajty, adresu zařízení, adresu registru a bajt informací pro zápis do tohoto registru a vygenerovali stav STOP.

Zůstává poslední funkce čtení. Níže je formát čtení.

Tato funkce provádí přenos bajtu adresy zařízení + bit zápisu, bajtu adresy registru pro nastavení ukazatele na něj, splnění podmínky POVSTAR, přenos bajtu adresy zařízení + bit čtení, čtení registru, jehož adresa přestoupili jsme dříve.

Pokud přistupujeme k hodinám ve formátu pro čtení, pak při opětovném přístupu k hodinám se ukazatel posune o jeden bajt dolů včetně 56 bajtů RAM, z 00H na 3FH. Po dosažení poslední adresy se ukazatel přesune na adresu 00.

/*Funkce pro čtení dat z DS1307*/
uint8_t read_DS1307 (uint8_t reg)/*Předejte registrační adresu*/
{
uint8_t čas;
/*vytvořit stav START*/
TWCR = (1<
zatímco (!(TWCR & (1<
TWDR = 0xd0; /*Přenos adresy + bit zápisu*/
TWCR = (1<
zatímco (!(TWCR & (1<
TWDR = reg; /*Registrační adresa*/
TWCR = (1<
zatímco (!(TWCR & (1<
/*vytvořit stav POVSTAR*/
TWCR = (1<
zatímco (!(TWCR & (1<
TWDR = 0xd1; /*Přenosová adresa + bit čtení*/
TWCR = (1<
zatímco (!(TWCR & (1<
/*číst data*/
TWCR = (1<
zatímco (!(TWCR & (1<
čas = TWDR;
čas = (((čas & 0xF0) >> 4)*10)+(čas & 0x0F);
/*vytvořit stav STOP*/
TWCR = (1<
čas návratu;
}

Výše jsme tedy napsali tři funkce, které potřebujeme pro práci s hodinami. Pomocí těchto funkcí spusťte program v Proteus. Zobrazme si například datum.

#zahrnout
#zahrnout
uint8_t čas;
void init_DS1307 (void);
uint8_t read_DS1307 (uint8_t reg);
void write_DS1307 (uint8_t reg, uint8_t čas);
int main (neplatný)
{
DDRC = 0×00; /*Nastavit port jako vstup*/
PORTC = 0xFF; /*Zpřísněte odpor*/
init_DS1307;
zatímco (1)
{
_delay_ms(50);
read_DS1307 (0×04); /*Registrace data čtení*/
}
}

Níže je uveden výsledek spuštění programu ke čtení data.

V okně I2C debuggeru ( TWI ) je vidět, že nejprve je do RTC (zelený kroužek) odeslána adresa registru, v tomto případě 04, která je zodpovědná za datum v měsíci, a poté hodiny vysílají odpověď 21 (červený kroužek).

Když spustíme hodiny v žehličce, budeme muset zadat aktuální čas. Níže je uveden příklad programu pro změnu minut.

zatímco (1)
{
_delay_ms(500);
read_DS1307 (0×01); /*Přečíst minutu*/
_delay_ms(500);
write_DS1307(0×01, 15); /*Zapište si požadovanou minutu*/
_delay_ms(500);
read_DS1307 (0×01); /*Přečíst minutu*/
}

Obrázek ukazuje, že se přistupuje k prvnímu registru 01, načítá se minuta 23. Dále použijeme funkci zápisu a zadáme hodnotu 15. S funkcí dalšího čtení máme na displeji hodin hodnotu 15. Obr.

Posledním příkladem programu je výstup hodnot všech registrů

zatímco (1)
{
delay_ms(500);
read_DS1307(0×00);
_delay_ms(500);
read_DS1307 (0×01);
_delay_ms(500);
read_DS1307 (0×02);
_delay_ms(500);
read_DS1307 (0×03);
_delay_ms(500);
read_DS1307 (0×04);
_delay_ms(500);
read_DS1307 (0×05);
_delay_ms(500);
read_DS1307 (0×06);
_delay_ms(500);
}

Obrázek níže ukazuje, že byla zobrazena data 7 registrů.

Zdrojový kód projektu je přiložen:

(Staženo: 601 lidí)

To je vše. V příštím článku si zapojíme hardwarové hodiny, zobrazíme čas na ukazateli a seznámíme se s binárním desítkovým formátem pro práci s hodinami. Ahoj všichni.

Výpočet reálného času v sekundách, minutách, hodinách, datech v měsíci, měsících, dnech v týdnu a letech, s přihlédnutím k výši aktuálního roku až do roku 2100.

56 bajtů trvalé paměti RAM pro ukládání dat

2-drátové sériové rozhraní

Programovatelný generátor čtvercových impulsů. Výstup může mít 1 Hz, 4,096 kHz, 8,192 kHz a 32,768 kHz.

Automatická detekce vypnutí hlavního zdroje energie a připojení záložního

24hodinový a 12hodinový režim

Spotřeba ne více než 500 nA při napájení ze záložní baterie při teplotě 25C°

Mikroobvod je k dispozici v osmikolíkových pouzdrech DIP a SOIC. Pinout je pro všechny stejný. Níže poskytnu řádky z datového listu pro dokončení obrázku.

Dokumentace k čipu (datasheet)

Přiřazení pinu:

. X1, X2- Slouží k připojení 32,768 kHz quartz rezonátoru

. Vbat- Vstup pro jakoukoli standardní třívoltovou lithiovou baterii nebo jiný zdroj energie. Pro normální provoz DS1307 musí být napětí baterie v rozsahu 2,0 ... 3,5 V. Lithiová baterie s kapacitou 48 mAh nebo více bude podporovat DS1307 bez napájení
déle než 10 let při teplotě 25°C.

. GND- obecné mínus

. Vcc- Toto je vstup +5 V. Když je napájecí napětí vyšší než 1,25 * VBAT, zařízení je plně aktivováno a lze číst a zapisovat data. Když je k zařízení připojena 3V baterie a Vcc je nižší než 1,25 * VBAT, čtení a zápis jsou zakázány, ale funkce časování nadále funguje. Jakmile Vcc klesne pod VBAT, RAM a RTC se přepnou na bateriové napájení VBAT.

. SQW/OUT- Výstupní signál s obdélníkovými impulsy.

. SCL- (Serial Clock Input - vstup pro sériové hodiny) - používá se k synchronizaci dat přes sériové rozhraní.

. S.D.A.- (Serial Data Input/Output) - vstupní/výstupní pin pro dvoudrátové sériové rozhraní.

Práce s SQW/OUT Pin.

Nejprve se podívejme na strukturu registrů DS1307.

Struktura registru čipu DS1307

Zajímá nás „Kontrolní registr“ umístěný na adrese 0x7, protože určuje činnost pinu SQW/OUT.

Je-li bit SQWE = 1, pak začíná tvorba obdélníkových impulsů, je-li SQWE = 0, pak výstupem výstupu bude hodnota bitu OUT.

Bity RS0 a RS1 jsou zodpovědné za pulzní frekvenci, konkrétně:

RS0 RS1 Frekvence
0 0 1 Hz
0 1 4,096 kHz
1 0 8,192 kHz
1 1 32,768 kHz

Zde je příklad:

Pokud potřebujeme začít generovat pravoúhlé pulsy s frekvencí 1 Hz, pak musíme poslat bajt 00010000 nebo 0x10 v šestnáctkové soustavě do registru 0x7 mikroobvodu, který má adresu 0x68.

Používání knihovny Wire.h, lze to provést takto:

Wire.beginTransmission(0x68); Wire.write(0x7); Wire.write(0x10); Wire.endTransmission();

Připojení k Arduinu:

Piny odpovědné za rozhraní I2C na deskách Arduino založených na různých řadičích se liší.

Požadované knihovny:

pro práci s DS1307: http://www.pjrc.com/teensy/td_libs_DS1307RTC.html
pro práci s časem: http://www.pjrc.com/teensy/td_libs_Time.html

Nastavení času

. Ručně v kódu

Čas se nastavuje ručně v kódu programu a nahrává se na desku Arduino. Tato metoda není nejpřesnější, protože Doba kompilace a načítání se může lišit.

Ukázkový kód

#zahrnout #zahrnout prázdnota založit () { Seriál.begin(9600); zatímco (! Seriál ) ; // Pouze pro desku Leonardo // získat čas z RTC Seriál //synchronizace se nezdařila jiný Seriál.println("RTC nastavil systémový čas"); //nainstalujte ručně 16.02.2016 12:53 TimeElementste; te.Second = 0; //sekundy te.Minuta = 53; //minuty te.Hour = 12; //hodiny te.Day = 16; //den te.Měsíc = 2; // měsíc te.Rok = 2016 - 1970; //rok v knihovně se počítá od roku 1970 time_t timeVal = makeTime(te); RTC .set(timeVal); setTime(timeVal); ) neplatný smyčka() ( digitalClockDisplay(); //výstupní časové zpoždění (1000); ) void digitalClockDisplay() ( Seriál Seriál.tisk(" "); Seriál.print(den()); Seriál.tisk(" "); Seriál.print(měsíc()); Seriál.tisk(" "); Seriál.print(rok()); Seriál //čas výstupu přes ":" Seriál.tisk(":"); if (číslice< 10) Seriál.print("0"); Seriál.print(číslice); )

. Instalace z"Port monitor"

Přesnější možnost nastavení času. Čas se nastavuje pomocí „monitoru portu“ během činnosti ovladače.

Otevřeme monitor, zadáme data v požadovaném formátu, podíváme se na referenční hodiny, chopíme se okamžiku a klikneme na „odeslat“.

Ukázkový kód

//formát pro uvedení aktuálního času "DD.MM.YY hh:mm:ss" //kde DD je den, MM je měsíc, YY je rok, hh jsou hodiny, mm jsou minuty, ss jsou sekundy //YY - od 00 do 99 pro období 2000-2099#zahrnout #zahrnout bool isTimeSet = false ; //příznak označující, zda již bylo datum nastaveno prázdnota založit () { Seriál.begin(9600); zatímco (! Seriál ) ; // Pouze pro desku Leonardo setSyncProvider(RTC.get); // získat čas z RTC if (timeStatus() != timeSet) Seriál.println("Nelze synchronizovat s RTC"); //synchronizace se nezdařila jiný Seriál.println("RTC nastavil systémový čas"); ) neplatný smyčka() (pokud ( Seriál.dostupný()) ( //příkaz byl přijat s časem setTimeFromFormatString( Seriál.readStringUntil("\n" )); isTimeSet = true ; //datum bylo nastaveno) if (isTimeSet) //pokud bylo zadáno datum( digitalClockDisplay(); //výstupní čas ) zpoždění (1000); ) void digitalClockDisplay() ( Seriál.print(hodina()); printDigits(minuta()); printDigits(second()); Seriál.tisk(" "); Seriál.print(den()); Seriál.tisk(" "); Seriál.print(měsíc()); Seriál.tisk(" "); Seriál.print(rok()); Seriál.println(); ) void printDigits(int digits) ( //čas výstupu přes ":" Seriál.tisk(":"); if (číslice< 10) Seriál.print("0"); Seriál.print(číslice); ) void setTimeFromFormatString(čas řetězce) ( //DD.MM.RR hh:mm:ss int den = cas.substring(0, 2).toInt(); int mesic = cas.substring(3, 5).toInt(); int rok = cas.substring(6, 8).toInt(); int hodiny = cas.substring(9, 11).toInt(); int minuty = cas.substring(12, 14).toInt(); int sekund = cas.substring(15, 17).toInt(); TimeElementste; te.Second = sekundy; te.Minute = minuty; te.Hour = hodiny; te.Day = den ; te.Měsíc = měsíc ; te.Rok = rok + 30; //rok v knihovně se počítá od roku 1970. Chceme od roku 2000 time_t timeVal = makeTime(te); RTC .set(timeVal); setTime(timeVal); )