Pripojenie ds1307 k mikrokontroléru avr. Pripojenie obvodu DS1307 k mikrokontroléru cez rozhranie TWI. Manuálne v kóde

DS1307 sa tiež nazýva RTC (Real Time Clock). Tento čip sú hodiny a kalendár v reálnom čase. Komunikácia s mikroobvodom prebieha cez rozhranie I 2 C. Jeho výhodou je, že funguje (počíta čas) pri vypnutí hlavného napájania zo záložného zdroja 3 voltov (napríklad z batérie CR3022). DS1307 má ale jednu nevýhodu: nekontroluje správnosť zadaných údajov. Na prácu s mikroobvodom budete potrebovať minimálnu súpravu: kremeň pri 32768 Hz, 3-voltovú batériu a dva odpory 4,7 kOhm. Schéma zapojenia DS1307:

Práca s DS1307 v BASCOM-AVR

Ak chcete začať pracovať s mikroobvodom, musíte nakonfigurovať porty, ku ktorým je mikroobvod pripojený; na to použite príkaz Konfig:
Konfigurácia Sda =(Port mikrokontroléra, ku ktorému je pripojená noha SDA čipu DS1307)
Konfigurácia Scl =(Port mikrokontroléra, ku ktorému je pripojená noha SCL čipu DS1307)
Napríklad:
Konfigurácia Sda = Portb.1
Config Scl = Portb.0

Po konfigurácii portov môžete začať pracovať s čipom: čítať a zapisovať dáta. Čas a dátum z čipu DS1307 je možné prečítať takto:

I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte (premenná, do ktorej zapisujeme sekundy), Ack I2crbyte (premenná, do ktorej zapisujeme minúty), Ack I2crbyte (premenná, do ktorej zapisujeme hodiny), Ack I2crbyte (premenná I2crbyte napíšte číslo dňa v týždni), Ack I2crbyte (premenná, do ktorej píšeme dátum), Ack I2crbyte (premenná, do ktorej zapíšeme číslo mesiaca), Ack I2crbyte (premenná, do ktorej zapíšeme rok), Nack I2cstop

Po prečítaní údajov ich musíte previesť do desiatkového formátu, takto:
(premenná v sekundách) = Makedec((premenná v sekundách) )
(premenné minúty) = Makedec((premenné minúty) )
(premenné hodiny) = Makedec((premenné hodiny) )
(premenný deň v týždni) = Makedec((premenný deň v týždni) )
(premenný dátum) = Makedec((premenný dátum) )
(premenný mesiac) = Makedec((premenný mesiac) )
(premenná za rok) = Makedec((premenná za rok) )

Tu je príklad čítania času a dátumu a ich prevodu do desiatkové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 , Ack I2crbyte Year, I2crby Ack I2 = Makedec(seco) Mine = Makedec(mine) Hodina = Makedec(hodina) Deň = Makedec(deň) Dat = Makedec(dátum) Mesiac = Makedec(mesiac) Rok = Makedec(rok)

Naučili sme sa čítať dáta, teraz skúsme dáta zapisovať do DS1307. Páči sa ti to:
(Premenná, ktorú si zapíšeme) = Makebcd((Premenná, ktorú si zapíšeme) )
I2cstart
I2cwbyte&HD0
I2cwbyte(bunka, do ktorej budeme zapisovať údaje)
I2cwbyte(Premenná, ktorú si zapíšeme)
I2cstop

Upozorňujeme, že príkaz Makebcd konvertuje premennú na binárny desiatkový formát. Čísla a označenia buniek:

Tu je príklad zápisu premennej sekúnd:
Seco = Makebcd (seco)
I2cstart
I2cwbyte&HD0
I2cwbyte 0
I2cwbyte Seco
I2cstop
Mimochodom, je potrebné poznamenať, že pri prvom spustení DS1307 (napríklad pri pripojení záložnej batérie) mikroobvod vráti hodnotu 80 v sekundách, čo znamená, že hodiny sú zastavené. Ak ich chcete spustiť, zapíšte si v sekundách hodnotu 1. Ak DS1307 pri čítaní akýchkoľvek údajov vráti hodnotu 255 alebo 168, znamená to, že čip nie je správne pripojený alebo nie je záložná batéria.

Praktická práca s čipom DS1307

Skúsme teraz pracovať s čipom DS1307 v praxi: zostavme si jednoduché hodiny s nastavením času pomocou tlačidiel. Aby sme to dosiahli, vezmime si samotný čip DS1307, mikrokontrolér Attiny2313, indikátor LCD na radiči HD44780 a niekoľko diskrétnych komponentov. Zostavme si jednoduchý diagram:

A napíšme jednoduchý program pomocou získaných vedomostí:

$regfile = "attiny2313.dat" $crystal = 4000000 Config 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 = Maked dec(hour) Hour ":" ; Baňa; ":" ; 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 Iwwbytecw2 Hour I2cstop Waitms 100 End If Loop End

Lekcia 17

Časť 1

Hodiny reálneho času DS1307

Pokračujeme v lekciách programovania MK AVR.

A dnes sa zoznámime s veľmi dobrým mikroobvodom DS1307. Tento mikroobvod je hodiny reálneho času (hodiny reálneho času alebo RTC).

Aj kvôli tomu, že komunikácia medzi mikrokontrolérom a týmto čipom bude prebiehať pomocou rozhrania I2C, opäť posilníme tému programovania tejto zbernice.

Tento mikroobvod predstavuje spoločnosť Dallas, tu je jeho pinout a hlavné technické vlastnosti

Tu vidíme, že máme nohy SDA a SCL, ktorých účel veľmi dobre poznáme. Nechýbajú piny X1 a X2 pre pripojenie kremenného rezonátora na 32768 Hz, napájacie piny - VCC a GND, výstup pre impulzy trvajúce 1 sekundu alebo inú frekvenciu v závislosti od nastavenia určitých registrov, ako aj kladný kontakt pre batériu. ktorý je pripojený, aby hodiny tikali, keď je hlavný vypínač vypnutý. Pripájame záporný kontakt tejto batérie k spoločnému napájaciemu vodiču.

Tiež vidíme, že tento čip je dostupný v planárnom a DIP puzdre.

Tento mikroobvod môže byť napájaný buď z 3 voltov alebo 5 voltov.

Prístup k tomuto mikroobvodu cez rozhranie I2C prebieha v zásade rovnakým spôsobom. rovnako ako pamäťový čip, ktorý sme použili v minulej lekcii. Samozrejme, budú existovať nejaké nuansy, ale o tom neskôr.

Keďže tento čip mám nainštalovaný v tom istom module, v ktorom je osadený čip EEPROM a máme jednu výmennú zbernicu, tak čip DS1307 „rozpozná“, že sa rieši, samozrejme na adrese, že je iná ako čipu EEPROM.

Tu sú schémy mikroobvodu prijímajúceho a vysielajúceho dáta

Modrou farbou je zvýraznená adresa, na ktorej budeme pristupovať k tomuto čipu.

V podstate. Nevidíme veľký rozdiel so schémami čipu EEPROM.

Ďalším rozdielom v manipulácii bude, že adresovanie pamäte už bude jednobajtové, keďže pamäťové bunky resp registrov Tento mikroobvod má veľmi málo.

Toto sú tieto registre

Účel týchto registrov:

00 hod- sekundy. Sekundy sú uložené v binárnom desiatkovom formáte. To znamená, že nižšie 4 bity ukladajú jednotky sekúnd a vyššie tri bity ukladajú desiatky. K dispozícii je tiež bit SH - to je bit štartu čipu.

01h- minúty. Uložené podobne.

02h- univerzálnejší register. Tu sú uložené hodinky. V štyroch najmenej významných bitoch sú jednotky, v ďalších vyšších dvoch desiatky, v ďalšom 6. bite je príznak, či je poobedie alebo predpoludním, v 7. bite je režim ukladania - 12 hod. alebo 24-hod.

03h- deň v týždni. Uložené v najmenej významných 3 bitoch, zostávajúce bity sa nepoužívajú.

04h— tu je uložený deň v mesiaci aj v binárnom desiatkovom formáte. Štyri najmenej významné bity obsahujú jednotky, ďalšie dva vyššie obsahujú desiatky, zvyšné bity sa nepoužívajú.

05h- číslo mesiaca v roku - je uložené v binárnom desiatkovom formáte rovnako ako hodiny.

06h- číslo roku, a nie celé štvormiestne, ale iba dvojmiestne. Najmenej významné štyri bity sú jednotky a najvyššie štyri bity sú desiatky.

Použijeme týchto sedem registrov. Posledný register je určený na konfiguráciu frekvencie impulzov na impulznom výstupe mikroobvodu; toto sa vykonáva v spodných dvoch bitoch registra. štandardne to bude frekvencia 1 Hz, to nám stačí na blikanie dvojbodky, takže tieto bity nepoužijeme. Bity SOWE a OUT sa tiež používajú na konfiguráciu a aktiváciu štvorcového vlnového tvaru.

Projekt na prácu s týmto čipom bol vytvorený bežným spôsobom s názvom Moje hodiny1307, súbory súvisiace s EEPROM boli odtiaľ odstránené a súbory boli pridané RTC.c A RTC.h.

#ifndefMAIN_H_

#definovaťMAIN_H_

#definovaťF_CPU8 000 000 UL

#include

#include

#include

#include

#include

#include"usart.h"

#include"twi.h"

#include"RTC.h"

#koniec Ak/* MAIN_H_ */

V hlavnom súbore MyClock1307.c vytvorme globálne premenné na ukladanie času, dátumu a dňa v týždni a potom bude celý obsah po odstránení všetkých nepotrebných vecí v ňom vyzerať takto

#include"hlavný.h"

nepodpísanécharsek, min, hodina, deň, dátum, mesiac, rok;

intHlavná( neplatné)

I2C_Init();

USART_Init(8);

Zatiaľ čo(1)

Z predchádzajúceho kódu zostáva len inicializácia I2C a USART.

Teraz musíme čip vôbec nejako spustiť. Ak je mikroobvod nový alebo nebol nikdy použitý, alebo niekto zmenil hodnotu bitu CH špeciálne na nejaký účel, potom ešte „nefunguje“.

Vo všeobecnosti, akonáhle nastavíme všetky hodnoty v registroch mikroobvodu, spustí sa a naše hodiny sa spustia.

Zapojenie alebo obvod je tiež použitý z predchádzajúcej lekcie, to znamená, že sa pozrieme na čas cez zbernicu USART v terminálovom programe.

Preto vlastne s využitím našich vedomostí z predchádzajúcej lekcie napíšeme napísať funkciu na nastavenie času.

V prvom rade prejdeme samozrejme podmienkou ŠTART

//Nastavte čas

I2C_StartCondition();

Potom odošleme adresu so zápisovým bitom 0

I2C_StartCondition();

I2C_SendByte(0b11010000);

Poďme na adresu 0, čo znamená do časti pamäte, kde sa nachádza úplne prvý register

I2C_SendByte(0b11010000);

I2C_SendByte(0); //Prejdi na 0x00

Pred zápisom akýchkoľvek hodnôt do registrov mikroobvodu si pamätáme, že najprv musíme čísla previesť do formátu BCD, ktorý bude pre registre vhodný. Aby sme to urobili, prejdeme do súboru RTC.c a napíšeme takúto funkciu. Bude to veľmi jednoduché a nepotrebuje žiadne vysvetlenie.

nepodpísanécharRTC_ConvertFromBinDec( nepodpísanécharc)

{

nepodpísanécharch= (( c/10)<<4)|( c%10);

vrátiťch;

}

Nuž, napíšme aj funkciu inverzného typu, prevádzajúcu číslo z binárno-desiatkového formátu do desiatkového. S jeho pomocou naopak prevedieme namerané hodnoty času čítania do podoby vhodnej pre naše vnímanie (HRI - human-readable interface)

nepodpísanécharRTC_ConvertFromDec( nepodpísanécharc)

{

nepodpísanécharch= (( c>>4)*10+(0b00001111&c));

vrátiťch;

}

Aj tu je všetko veľmi jasné, posunieme vysokú tetrádu bajtu doprava, vynásobíme desiatimi a pripočítame nízku tetrádu (vysokú tetrádu maskujeme nulami)

Napíšme prototypy týchto funkcií do súboru RTC.c

#include"hlavný.h"

nepodpísanécharRTC_ConvertFromDec( nepodpísanécharc); //konvertovať BCD číslo na desiatkové

nepodpísanécharRTC_ConvertFromBinDec( nepodpísanécharc);

Programátor, modul RTC DS1307 s pamäťovým čipom a USB-TTL adaptérom je možné zakúpiť tu:

Programátor (spoľahlivý predajca) USBASP USBISP 2.0

Pozrite si VIDEONÁVOD (kliknite na obrázok)

Zobrazenia príspevku: 7 354

Recenzie o týchto hodinkách na internete sú najviac rozporuplné. Niektorí hovoria, že hodinky sú úžasné, zatiaľ čo iní ich nazývajú chudobným výtvorom Dallasu. A tak, aby som rozptýlil všetky falošné fámy, vybral som mikruchu zo skladu a začal som experimentovať.

Zvláštnosti:

  • Veľmi nízka spotreba energie. Výrobca sľubuje 10 rokov prevádzky hodiniek z jednej štandardnej batérie. CR2032
  • 56 bajtov pamäte na ukladanie užívateľských dát. Myslím, že to nie je obzvlášť potrebná možnosť, ale môže byť pre niekoho užitočná.
  • Programovateľný výstup pre taktovanie externých zariadení. Výstup môže mať 1 Hz, 4,096 kHz, 8,192 kHz a 32,768 kHz.
  • 24-hodinový a 12-hodinový režim

Pinout

Piny hodín sú umiestnené nasledovne:

X1, X2— Kolíky na pripojenie kremenného rezonátora na frekvencii 32,768 kHz
VBAT— Výstup na pripojenie 3-voltovej záložnej batérie
GND- Zem
S.D.A.- dátová linka zbernice i2c
SCL— i2c autobusová hodinová linka
SQW/OUT– výstupný signál pre taktovanie externých zariadení
VCC- 5 voltové napájanie

Pripojenie k ovládaču
Väzba je minimálna. Na prevádzku zbernice i2c budete potrebovať 32,768 kHz quartz, pár rezistorov a trojvoltovú batériu.

Správne rozloženie dosky
Presnosť hodín a vlastne aj výkon hodiniek vo všeobecnosti závisí od rozloženia dosky plošných spojov. Dallas vo svojom datasheete odporúča zmenšiť dĺžku vodičov od mikroobvodu ku kremennému rezonátoru na minimum a tieto vodiče obklopiť obdĺžnikom spojeným so zemou. Okrem toho som kvôli spoľahlivosti prispájkoval drôty smerujúce k zemi ku kremennému telu a paralelne s napájaním umiestnil kondenzátor 0,1 uF.

Mimochodom, môže to fungovať aj bez kremeňa. Na tento účel sa do nohy X1 privádza externý hodinový signál s frekvenciou 32,768 kHz a X2 zostáva zavesená vo vzduchu.

Organizácia pamäte hodín
Toto miniatúrne zariadenie je vybavené 64 bajtmi pamäte. Prvých osem bajtov funguje. Ukladajú čas, dátum, deň v týždni. Zvyšok je pridelený potrebám používateľa. Môžete si do nich uložiť napríklad nejaké nastavenia alebo niečo iné. Pri strate záložného napájania sa prirodzene zničia všetky informácie v tejto pamäti. Celá práca s hodinami (čítanie a nastavenie času/dátumu) spočíva v čítaní a zapisovaní potrebných pamäťových buniek.

Všetky čísla v pamäti sú uložené v binárnom desiatkovom formáte. To znamená, že do jedného bajtu možno uložiť dve číslice. Napríklad číslo 0x23 obsahuje číslo 2 a číslo 3. Každému číslu sú pridelené 4 bity. Prečo sa to robí? Pre pohodlie a úsporu pamäte. Okrem času a dátumu je v pamäti uložených niekoľko bitov nastavení:

  • Zastavenie hodín- ovláda hodiny. Keď je bit nastavený, hodiny sa zastavia. Pre spustenie hodín je potrebné do tohto bitu zapísať 0. Po pripojení záložnej batérie je tento bit nastavený a hodiny nepočítajú čas! Toto si musíte zapamätať.
  • 24/12 - tento bit na výber režimu hodín. Keď je tento bit rovný jednej, použije sa 12-hodinový režim. Inak 24 hodín. Ak sa použije 12-hodinový režim, potom piaty bit označuje AM alebo PM now. Ak je bit 1, znamená to PM. V 24-hodinovom režime sa tento bit používa na uloženie desiatok hodín v spojení s bitom 4.
  • Výkon— ovláda stav nohy SQW/OUT. Bit je nastavený - log je na nohe 1. Reset - na nohe 0. Na ovládanie týmto spôsobom bit SQWE musí byť resetovaný.
  • SQWE- keď je bit nastavený, na nohe SQW/OUT sa objavia obdĺžnikové impulzy.
  • RS1, RS0— tieto bity nastavujú frekvenciu impulzov. Závislosť frekvencie od kombinácie bitov je v tabuľke nižšie:

softvér

Pre prácu s hodinami DS1307 bola napísaná jednoduchá knižnica obsahujúca nasledujúce základné funkcie:

DS_start— spustí hodiny. Hodiny môžete spustiť aj nastavením času.
DS_stop- zastaví hodiny
DS_set_time — Nastavenie času. Pred volaním procedúry musíte zadať sekundy do tmp1, minúty do tmp2 a hodiny do tmp3. Hodiny v 24 hodinovom formáte.
DS_get_time: —čítanie času z hodín. sekundy budú zaznamenané v tmp1, minúty v tmp2, hodiny v tmp3
DS_get_date:— čítanie dátumu z hodiniek. Deň bude zaznamenaný v tmp1, mesiac v tmp2, rok v tmp3
DS_set_date: — nastavenie dátumu. Pred volaním procedúry musíte zadať deň do tmp1, mesiac do tmp2 a rok do tmp3 (posledné 2 číslice)

Rutiny na nastavenie/čítanie času a dátumu môžu prijímať/vracať vstupné dáta v BCD a desiatkovom formáte. Ak chcete vybrať požadovaný formát, musíte v každom postupe okomentovať alebo odkomentovať tri riadky (v kóde sú o tom poznámky).

Testovací program umožňuje ovládať hodiny cez UART (rýchlosť 9600, regulátor pracuje na 8 MHz). Pri spustení sa okamžite zobrazí čas, dátum a výzva na zadanie príkazov od 1 do 3. Keď vyberiete voľbu 1, znova sa načíta čas/dátum. Možnosť 2 vám umožňuje nastaviť čas a možnosť 3 dátum. Ak si chcete vyskúšať hru s hodinami, v zdrojovom archíve je priložený simulačný súbor.

Presnosť
Tu veľa závisí od použitého kremeňa a rozloženia dosky. Datasheet uvádza, že kremenná kapacita by mala byť 12,5 pF. Hovorí sa, že najlepšie je použiť kryštály zo základných dosiek. Ak chcete opraviť zdvih, môžete na rezonátor prispájkovať orezávací kondenzátor a použiť ho na zmenu frekvencie v malých medziach. Mne osobne tieto hodinky fungujú dva dni a zaostávajú o 3 sekundy. Niečo mi hovorí, že problém je v kapacite kremeňa, skúsim iný a ohlásim sa.

Záver
Nie sú to zlé hodinky. Ideálne pre amatérske použitie. Aj keď niektorí píšu o závadách, zatiaľ som sa s nimi nestretol.

Aktualizované 23.07.2018. Ahojte všetci. Pre prácu s hodinkami sme v minulom článku rozobrali rozhranie TWI, na ktoré sa dnes odvoláme. Tak začnime. Tieto hodinky sú TWI kompatibilné, t.j. princíp výmeny dát na zbernici bude rovnaký, ako sme uvažovali.

Na obrázku nižšie je znázornené umiestnenie pinov, popis a samotný vzhľad našich hodín, alebo ako to neskôr nazveme RTC (Real-time clock) - hodiny reálneho času alebo generátor časových impulzov. Toto "zariadenie" DS1307 Počíta sekundy, minúty, hodiny, deň v mesiaci, mesiac, deň v týždni a rok vrátane priestupných rokov. Kalendár platí do roku 2100. Myslím, že nám to bude stačiť na celý život :).

Ako je zrejmé z popisu, je tu vstup pre núdzové napájanie z batérie pri vypnutí externého napájania. V tomto režime RTC podporuje iba svoj hlavný účel - časovanie, bez externých požiadaviek. Napájacie napätie batérie by malo byť 2 – 3,5V. V technickom popise sa uvádza, že pri nabití viac ako 48 mAh nám pri teplote 25 stupňov Celzia vydrží náš okruh cca 10 rokov. Viac ako treba. Na obrázku nižšie je znázornený „tablet“ CR2032 a držiak, ktorý použijeme.

Teraz prejdime k externému zdroju napájania. Prevádzkové napätie hodín je 5V s malým rozsahom 4,5 -5,5V. Napätie batérie 3V (minimálne 2, maximálne 3,5V) Prevádzka RTC je rozdelená do troch napäťových režimov:

1. Vcc=5V – čítať, zapisovať, počítať;
2. Vcc= pod 1,25*Vbat, ale nad Vbat +0,2V - počíta sa iba batéria z externého napájania.
3. Vcc pod Vbat: RTC a RAM sa prepnú na napájanie z batérie. Spotreba v aktívnom stave je 1,5 mA, z batérie 500-800 nA.
Napätie na vysielanie/príjem informácií:
Logická 0: -0,5V - +0,8V
Logika 1: 2,2 V – Vcc+0,3 V

Rovnako ako v predchádzajúcich príspevkoch sa ho pokúsime spustiť v Proteus. Poďme ladiť kód. A všetko prenesieme na hardvér. Nižšie je schéma zapojenia.

Kde SQW/OUT je výstup hodín, ktorý možno naprogramovať na výstupné frekvencie 1Hz, 4,096 Hz, 8,192 Hz a 32,768 Hz. Tie. možno použiť na externé prerušenie regulátora s frekvenciou 1 s. Veľmi užitočná funkcia. Ale nebudeme to potrebovať. Mimochodom, je to tiež otvorený kolektor, takže je potrebný pull-up rezistor. Nominálny 4,7 kOhm.

Piny X1 a X2 – na ne pripojíme kremenný rezonátor s frekvenciou 32,768 kHz. Alebo môžete použiť externý generátor hodín s rovnakou frekvenciou. Ale v tomto prípade je kolík X1 pripojený k signálu a X2 zostáva nepripojený (visí vo vzduchu).

No a závery SDA a SCL, s ktorými sme sa stretli v minulom článku.

Trochu sa zastavíme pri rezonátore (obrázok nižšie). Ktoré možno nazvať srdcom hodiniek a od ktorých závisí presnosť strojčeka. Kvalita samotného rezonátora leží na svedomí výrobcu, ale z našej strany môžeme znížiť chybu spôsobenú vonkajšími faktormi, ak budeme dodržiavať nasledujúce odporúčania pre umiestnenie rezonátora:

2. Šírka cesty by mala byť tiež menšia, ak je to možné, aby sa znížila pravdepodobnosť príjmu rušenia z iných zdrojov.

3. Okolo kryštálu by mal byť umiestnený obvod v tvare krúžku, ktorý pomáha izolovať kryštál od hluku.

4. Umiestnite vodiče do kruhu a pripojte ich k zemi.

5. Prispájkujte rezonátor k zemi. Ak je pozemok správne rozvrhnutý a existuje dôvera.

Na obrázku nižšie je znázornený obrys a umiestnenie rýchleho ľadu k zemi.

Zistili sme, ako sa pripojiť. Poďme ďalej a prídeme na to, ako s tým pracovať. RTC je programovateľný a má 8 bajtov špeciálnych registrov pre svoju konfiguráciu a 56 bajtov stálej statickej pamäte. Na výmenu informácií je potrebná 2-vodičová dátová zbernica, t.j. sériová dátová zbernica – ktorej sme sa venovali v minulom článku. Aby sme mohli začať, prejdime si údajový list. Čo potrebujeme:

Registrovať tabuľku. Obrázok nižšie. Prvých osem registrov slúži na výstup a programovanie našich hodín. Pri prístupe k 7. bitu (CH) na adrese 00H a nastavení na 0 spustíme hodiny. Chcel by som poznamenať, že konfigurácia registrov môže byť ľubovoľná, takže pri prvom spustení ju musíte nakonfigurovať podľa svojich požiadaviek. Zvyšných sedem bitov sú jednotky a desiatky sekúnd.

01H – minúty.
02H – hodiny, ktoré možno nastaviť:
— Bit 6 – s 1 výstupom 12-hodinový formát, 0 – 24.
— Bit 5 – o 1 (s 12-hodinovým formátom) PM, 0-AM
— Bit 5 – (v 24-hodinovom formáte) ide o výstup z druhej desiatky hodín (20-23 hodín)
— Bit4 je prvých desať hodín, zvyšné bity sú jednotky hodín.
03H – deň v týždni;
04H – dátum;
05H – mesiac v roku
06H – rok.

No, posledný register je 07H. Tento register je riadiaci register, kde OUT je zodpovedný za riadenie kolíku SQW/OUT. Nižšie je uvedená tabuľka povolenia výstupu.

VON
SQWE
SQW/OUT
1
0
1
0
0
0

SQWE - pri nastavení tohto bitu na 1 sú na výstupy vyvedené impulzy s danou frekvenciou, ktorá je nastavená bitmi RS1 a RS0.

Tento záver nám v projekte nebude užitočný. Aj keď som k tomu na doske vytýčil dráhu. Ako experiment to môže byť použiteľné niekde v budúcnosti, pretože tu môžete urobiť prerušenie na 1 sekundu.

Teraz, keď máme všetky potrebné informácie, napíšeme funkcie na prácu s hodinami. Projekt spustíme aj v r Proteus . Ktorá bude vyzerať takto:

Upozorňujeme, že rezonátor v Proteuse nemusí byť pripojený k hodinám (zakrúžkované červenou farbou).

Obrázok znázorňuje hodinový terminál, ktorý zobrazuje čas, ktorý je zase spojený so systémovým časom. I2C alebo TWI protokolový debugger terminál, ktorý zobrazuje čas odoslania a prijatia signálu, kde D0 je vyslaný príkaz, D1 je prijatý. Nižšie zobrazím snímky obrazovky terminálu s výsledkom programu.

Program. Po zvážení základných nastavení hodín napíšeme inicializačnú funkciu.

/*Inicializačná funkcia zahŕňa nastavenie výmenného kurzu dát pomocou vzorca (v minulom článku), nastavenie preddeličky a zapnutie TWI modulu*/
void init_DS1307 (void)
{
TWBR = 2; /*Pri frekvencii 1 MHz */
TWSR = (0<< TWPS1)|(0 << TWPS0); /*Predchádzajúci o 64*/
TWCR |= (1<< TWEN); /*Povoliť modul TWI*/
}

void write_DS1307 (uint8_t reg, uint8_t time)/*odovzdáme dva parametre: adresu registra, do ktorého budeme pristupovať a informácie, ktoré sa majú preniesť*/
{
/* Vytvorte stav START nastavením bitov riadiaceho registra */
TWCR = (1<
/*Umožní pracovať modulu TWEN; Generovať počiatočný stav TWSTA; Obnoviť príznak TWINT */
/*Čakáme na ukončenie formovania štartovacej podmienky, t.j. kým nie je nastavený príznak, stavový kód = 08*/
zatiaľ čo (!(TWCR & (1<
/*Ďalej odošleme adresový paket (adresu zariadenia). Obsah paketu sa načíta do registra TWDR*/
TWDR = 0xd0; /*0b1101000 + 0 – adresa + bit zápisu*/
/*Resetovať príznak na prenos informácií*/
TWCR = (1<
/*Čaká sa na nastavenie príznaku*/
zatiaľ čo (!(TWCR & (1<
/*prejdi registrom, ku ktorému budeme mať prístup*/
TWDR = reg;
TWCR = (1<
zatiaľ čo (!(TWCR & (1<
/*Pošli informácie, ktoré sa majú zapísať do bajtu registra*/
TWDR = čas;
TWCR = (1<
zatiaľ čo (!(TWCR & (1<
/*vytvorte stav STOP*/
TWCR = (1<
}

V tejto funkcii sme odovzdali tri bajty, adresu zariadenia, adresu registra a bajt informácií na zápis do tohto registra a vygenerovali stav STOP.

Zostáva posledná funkcia čítania. Nižšie je uvedený formát čítania.

Táto funkcia vykoná prenos bajtu adresy zariadenia + bit zápisu, bajtu adresy registra na nastavenie ukazovateľa naň, splnenie podmienky POVSTAR, prenos bajtu adresy zariadenia + bit čítania, čítanie registra, ktorého adresa presunuli sme sa skôr.

Ak pristupujeme k hodinám vo formáte na čítanie, potom pri opätovnom prístupe k hodinám sa ukazovateľ posunie o jeden bajt nadol vrátane 56 bajtov RAM, z 00H na 3FH. Po dosiahnutí poslednej adresy sa ukazovateľ presunie na adresu 00.

/*Funkcia na čítanie dát z DS1307*/
uint8_t read_DS1307 (uint8_t reg)/*Zadajte registračnú adresu*/
{
uint8_t čas;
/*vytvorte stav START*/
TWCR = (1<
zatiaľ čo (!(TWCR & (1<
TWDR = 0xd0; /*Prenos adresy + bit zápisu*/
TWCR = (1<
zatiaľ čo (!(TWCR & (1<
TWDR = reg; /*Adresa registrácie*/
TWCR = (1<
zatiaľ čo (!(TWCR & (1<
/*zo stavu POVSTAR*/
TWCR = (1<
zatiaľ čo (!(TWCR & (1<
TWDR = 0xd1; /*Prenosová adresa + bit čítania*/
TWCR = (1<
zatiaľ čo (!(TWCR & (1<
/*čítať údaje*/
TWCR = (1<
zatiaľ čo (!(TWCR & (1<
čas = TWDR;
čas = (((čas & 0xF0) >> 4)*10)+(čas & 0x0F);
/*vytvorte stav STOP*/
TWCR = (1<
čas návratu;
}

Vyššie sme teda napísali tri funkcie, ktoré potrebujeme na prácu s hodinami. Pomocou týchto funkcií spustíme program v Proteuse. Ukážme si napríklad dátum.

#include
#include
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 (void)
{
DDRC = 0 x 00; /*Nastaviť port ako vstup*/
PORTC = 0xFF; /*Zosilnite odpor*/
init_DS1307;
zatiaľ čo (1)
{
_delay_ms(50);
read_DS1307 (0×04); /*Registrácia dátumu čítania*/
}
}

Nižšie je uvedený výsledok spustenia programu na prečítanie dátumu.

V okne I2C ladiaceho programu ( TWI ) je možné vidieť, že najprv sa adresa registra odošle do RTC (zelený kruh), v tomto prípade 04, ktorý je zodpovedný za dátum v mesiaci, a potom hodiny prenesú odpoveď 21 (červený kruh).

Keď spustíme hodiny v žehličke, budeme musieť zadať aktuálny čas. Nižšie je uvedený príklad programu na zmenu minút.

zatiaľ čo (1)
{
_delay_ms(500);
read_DS1307 (0×01); /*Prečítaj minútu*/
_delay_ms(500);
write_DS1307(0×01, 15); /*Zapíšte si požadovanú minútu*/
_delay_ms(500);
read_DS1307 (0×01); /*Prečítaj minútu*/
}

Obrázok ukazuje, že sa pristupuje k prvému registru 01, číta sa minúta 23. Ďalej použijeme funkciu zápisu a zadáme hodnotu 15. Pri ďalšej funkcii čítania máme na displeji hodín hodnotu 15. Obr.

Posledným príkladom programu je výstup hodnôt všetkých registrov

zatiaľ čo (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ázok nižšie ukazuje, že boli zobrazené údaje 7 registrov.

Zdrojový kód projektu je priložený:

(Stiahnuté: 601 ľudí)

To je všetko. V ďalšom článku si zapojíme hardvérové ​​hodiny, zobrazíme čas na indikátore a zoznámime sa s binárnym desiatkovým formátom pre prácu s hodinami. Ahojte všetci.

Výpočet reálneho času v sekundách, minútach, hodinách, dátumoch v mesiaci, mesiacoch, dňoch v týždni a rokoch, berúc do úvahy výšku aktuálneho roka až do roku 2100.

56 bajtov stálej pamäte RAM na ukladanie údajov

2-vodičové sériové rozhranie

Programovateľný generátor štvorcových impulzov. Výstup môže mať 1 Hz, 4,096 kHz, 8,192 kHz a 32,768 kHz.

Automatická detekcia vypnutia hlavného zdroja energie a pripojenie záložného

24-hodinový a 12-hodinový režim

Spotreba nie viac ako 500 nA pri napájaní zo záložnej batérie pri teplote 25C°

Mikroobvod je dostupný v osempinových DIP a SOIC obaloch. Pinout je pre všetkých rovnaký. Nižšie uvediem riadky z údajového listu na dokončenie obrázka.

Dokumentácia k čipu (datasheet)

Priradenie špendlíka:

. X1, X2- Slúži na pripojenie kremenného rezonátora 32,768 kHz

. Vbat- Vstup pre akúkoľvek štandardnú trojvoltovú lítiovú batériu alebo iný zdroj energie. Pre normálnu prevádzku DS1307 musí byť napätie batérie v rozsahu 2,0 ... 3,5 V. Lítiová batéria s kapacitou 48 mAh alebo viac bude podporovať DS1307 bez napájania
viac ako 10 rokov pri teplote 25°C.

. GND- všeobecné mínus

. Vcc- Toto je vstup +5 V. Keď je napájacie napätie vyššie ako 1,25 * VBAT, zariadenie je plne aktivované a dáta je možné čítať a zapisovať. Keď je k zariadeniu pripojená 3V batéria a hodnota Vcc je nižšia ako 1,25 * VBAT, čítanie a zápis sú zakázané, ale funkcia časovania naďalej funguje. Keď Vcc klesne pod VBAT, RAM a RTC sa prepnú na napájanie z batérie VBAT.

. SQW/OUT- Výstupný signál s pravouhlými impulzmi.

. SCL- (Serial Clock Input - vstup pre sériové hodiny) - používa sa na synchronizáciu dát cez sériové rozhranie.

. S.D.A.- (Serial Data Input/Output) - vstupný/výstupný kolík pre dvojvodičové sériové rozhranie.

Práca s pinom SQW/OUT.

Najprv sa pozrime na štruktúru registrov DS1307.

Štruktúra registra čipu DS1307

Máme záujem o „Kontrolný register“ umiestnený na adrese 0x7, pretože určuje činnosť kolíka SQW/OUT.

Ak je bit SQWE = 1, potom začne vytváranie pravouhlých impulzov, ak SQWE = 0, potom výstupom výstupu bude hodnota bitu OUT.

Bity RS0 a RS1 sú zodpovedné za frekvenciu impulzov, a to:

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

Tu je príklad:

Ak potrebujeme začať generovať pravouhlé impulzy s frekvenciou 1 Hz, potom musíme poslať bajt 00010000 alebo 0x10 v hexadecimálnej číselnej sústave do registra 0x7 mikroobvodu, ktorý má adresu 0x68.

Používanie knižnice Wire.h, dá sa to urobiť takto:

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

Pripojenie k Arduinu:

Piny zodpovedné za rozhranie I2C na doskách Arduino založených na rôznych ovládačoch sa líšia.

Požadované knižnice:

pre prácu s DS1307: http://www.pjrc.com/teensy/td_libs_DS1307RTC.html
pre prácu s časom: http://www.pjrc.com/teensy/td_libs_Time.html

Nastavenie času

. Manuálne v kóde

Čas sa nastavuje manuálne v programovom kóde a nahráva na dosku Arduino. Táto metóda nie je najpresnejšia, pretože Časy kompilácie a načítania sa môžu líšiť.

Vzorový kód

#include #include neplatné nastaviť () { Serial.begin(9600); kým (! Serial ) ; // Len pre dosku Leonardo // získať čas z RTC Serial //synchronizácia zlyhala inak Serial.println("RTC nastavil systémový čas"); //nainštalovať ručne 16.02.2016 12:53 TimeElementste; te.sekunda = 0; //sekundy te.minúta = 53; //minúty te.hodina = 12; //hodiny te.Day = 16; //deň te.Mesiac = 2; // mesiac te.Rok = 2016 - 1970; //rok v knižnici sa počíta od roku 1970 time_t timeVal = makeTime(te); RTC .set(timeVal); setTime(timeVal); ) neplatný slučka() ( digitalClockDisplay(); //oneskorenie výstupu (1000); ) void digitalClockDisplay() ( Serial Serial.print(" "); Serial.print(deň()); Serial.print(" "); Serial.print(mesiac()); Serial.print(" "); Serial.print(rok()); Serial //čas výstupu cez ":" Serial.print(":"); ak (číslice< 10) Serial.print("0"); Serial.print(číslice); )

. Inštalácia z"Port monitor"

Možnosť presnejšieho nastavenia času. Čas sa nastavuje pomocou „monitora portu“ počas činnosti regulátora.

Otvoríme monitor, zadáme údaje v požadovanom formáte, pozrieme sa na referenčné hodiny, chopíme sa momentu a klikneme na „odoslať“.

Vzorový kód

//formát pre označenie aktuálneho času "DD.MM.RR hh:mm:ss" //kde DD je deň, MM je mesiac, YY je rok, hh sú hodiny, mm sú minúty, ss sú sekundy //RR - od 00 do 99 pre roky 2000-2099#include #include bool isTimeSet = false ; //príznak označujúci, či už bol nastavený dátum neplatné nastaviť () { Serial.begin(9600); kým (! Serial ) ; // Len pre dosku Leonardo setSyncProvider(RTC.get); // získať čas z RTC if (timeStatus() != timeSet) Serial.println("Nedá sa synchronizovať s RTC"); //synchronizácia zlyhala inak Serial.println("RTC nastavil systémový čas"); ) neplatný slučka() (ak ( Serial.available()) ( //príkaz bol prijatý s časom setTimeFromFormatString( Serial.readStringUntil("\n" )); isTimeSet = true ; //dátum bol nastavený) if (isTimeSet) //ak bol uvedený dátum( digitalClockDisplay(); //výstupný čas ) oneskorenie (1000); ) void digitalClockDisplay() ( Serial.print(hodina()); printDigits(minute()); printDigits(second()); Serial.print(" "); Serial.print(deň()); Serial.print(" "); Serial.print(mesiac()); Serial.print(" "); Serial.print(rok()); Serial.println(); ) void printDigits(int digits) ( //čas výstupu cez ":" Serial.print(":"); ak (číslice< 10) Serial.print("0"); Serial.print(číslice); ) void setTimeFromFormatString(čas reťazca) ( //DD.MM.RR hh:mm:ss int den = cas.substring(0, 2).toInt(); int mesiac = cas.substring(3, 5).toInt(); int rok = cas.substring(6, 8).toInt(); int hodiny = cas.substring(9, 11).toInt(); int minut = cas.substring(12, 14).toInt(); int sekund = cas.substring(15, 17).toInt(); TimeElementste; te.Second = sekundy; te.minúta = minúty; te.Hour = hodiny; te.Day = deň ; te.Mesiac = mesiac ; te.Rok = rok + 30; //rok v knižnici sa počíta od roku 1970. Chceme od roku 2000 time_t timeVal = makeTime(te); RTC .set(timeVal); setTime(timeVal); )