Povezivanje ds1307 na avr mikrokontroler. Povezivanje DS1307 kola na mikrokontroler preko TWI interfejsa. Ručno u kodu

DS1307 se još naziva i RTC (Sat realnog vremena). Ovaj čip je sat i kalendar u realnom vremenu. Komunikacija sa mikrokolo se vrši preko I 2 C interfejsa.Njegova prednost je što radi (broji vreme) kada je glavno napajanje isključeno iz rezervnog izvora napajanja od 3 volta (npr. iz CR3022 baterije). Ali DS1307 ima jedan nedostatak: ne provjerava da li su uneseni podaci tačni. Za rad s mikro krugom trebat će vam minimalni komplet: kvarc na 32768Hz, 3-voltna baterija i dva otpornika od 4,7 kOhm. Šema povezivanja DS1307:

Rad sa DS1307 u BASCOM-AVR

Da biste počeli raditi s mikrokolo, trebate konfigurirati portove na koje je mikrokolo spojeno; da biste to učinili, koristite naredbu Config:
Config Sda =(Port mikrokontrolera na koji je spojena SDA noga DS1307 čipa)
Config Scl =(Priključak mikrokontrolera na koji je spojena SCL noga DS1307 čipa)
Na primjer:
Config Sda = Portb.1
Config Scl = Portb.0

Nakon konfigurisanja portova, možete početi raditi s čipom: čitati i pisati podatke. Vrijeme i datum sa DS1307 čipa mogu se pročitati ovako:

I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte (varijabla u koju upisujemo sekunde), Ack I2crbyte (varijabla u koju upisujemo minute), Ack I2crbyte (varijabla u kojoj upisujemo sate), Ack I2crbyte u koju upisujemo (varijabla) upisujemo broj dana u sedmici), Ack I2crbyte (varijabla u koju upisujemo datum), Ack I2crbyte (varijabla u koju upisujemo broj mjeseca), Ack I2crbyte (varijabla u koju upisujemo godinu), Nack I2cstop

Nakon čitanja podataka, potrebno je da ih konvertujete u decimalni format, ovako:
(promenljiva sekunda) = Makedec((promenljiva sekunda) )
(promenljiva minuta) = Makedec((promenljiva minuta) )
(varijabla sata) = Makedec((varijabla sata) )
(promenljiva dana u nedelji) = Makedec((promenljiva dana u nedelji) )
(datum varijabla) = Makedec((datum varijabla) )
(mjesečna varijabla) = Makedec((mjesečna varijabla) )
(godišnja varijabla) = Makedec((godišnja varijabla) )

Evo primjera čitanja vremena i datuma i pretvaranja u decimalni format:

I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte Seco , Ack I2crbyte Mine , Ack I2crbyte Sat , Ack I2crbyte Dan , Ack I2crbyte Dat , Ack I2crbyte Dat , Ack I2crbyte Dat , Ack I2crbyte I2crbyte I godine o) Mine = Makedec(mine) Sat = Makedec(sat) Dan = Makedec(dan) Dat = Makedec(dat) Mjesec = Makedec(mjesec) Godina = Makedec(godina)

Naučili smo kako čitati podatke, a sada pokušajmo zapisati podatke u DS1307. Volim ovo:
(Varijabla koju ćemo zapisati) = Makebcd((Varijabla koju ćemo zapisati) )
I2cstart
I2cwbyte&HD0
I2cwbyte(Ćelija u koju ćemo upisati podatke)
I2cwbyte(Varijabla koju ćemo zapisati)
I2cstop

Imajte na umu da je komanda Makebcd pretvara varijablu u binarni decimalni format. Brojevi i oznake ćelija:

Evo primjera pisanja varijable sekundi:
Seco = Makebcd(seco)
I2cstart
I2cwbyte&HD0
I2cwbyte 0
I2cwbyte Seco
I2cstop
Usput, treba napomenuti da kada se DS1307 pokrene prvi put (na primjer, pri povezivanju rezervne baterije), mikrokolo će vratiti vrijednost od 80 u sekundi, što znači da je sat zaustavljen. Da biste ih pokrenuli, zapišite vrijednost 1 u sekundama. Ako DS1307 vraća vrijednost od 255 ili 168 prilikom čitanja bilo kakvih podataka, to znači da čip nije ispravno povezan ili da nema rezervne baterije.

Praktičan rad sa DS1307 čipom

Pokušajmo sada raditi s DS1307 čipom u praksi: sastavite jednostavan sat sa podešavanjem vremena pomoću dugmadi. Da bismo to učinili, uzmimo sam DS1307 čip, Attiny2313 mikrokontroler, LCD indikator na HD44780 kontroleru i nekoliko diskretnih komponenti. Hajde da sastavimo jednostavan dijagram:

I napišimo jednostavan program koristeći stečeno znanje:

$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 , 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 Kursor Isključen Do I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cwbyte I2cwbyte &HD1 I2crbyte Seco , Ack I2crbyte Mine , Ack I2crbyte Sat , Nack I2cstop Seco = Makedec(seco) Mine = Makedec(mine) Hour = Makedec (sat1c) Hour L. ":" ; Mine; ":" ; seco ; " " Ako je Pind.5 = 0 Onda Incr Mine = Makebcd(moj) I2cstart I2cwbyte &HD0 I2cwbyte 1 I2cwbyte Mine I2cstop Waitms 100 Kraj Ako je Pind.4 = 0 Onda Incr Hour Sat = Makebcd(hour) I2cwbyte I2cwbyte I2cwbyte I2cwbyte Sat I2cstop Waitms 100 End If Loop End

Lekcija 17

Dio 1

Sat realnog vremena DS1307

Nastavljamo sa časovima programiranja MK AVR.

A danas ćemo se upoznati sa vrlo dobrim mikrokolom DS1307. Ovo mikrokolo je sat realnog vremena (sat realnog vremena ili RTC).

Takođe, zbog činjenice da će se komunikacija između mikrokontrolera i ovog čipa odvijati preko interfejsa I2C, još jednom ćemo pojačati temu programiranja ove magistrale.

Ovo mikrokolo predstavlja kompanija Dallas, ovdje je njegov pinout i glavne tehničke karakteristike

Ovdje vidimo da imamo noge SDA i SCL čiju namjenu jako dobro znamo. Tu su i pinovi X1 i X2 za povezivanje kvarcnog rezonatora na 32768 Hz, pinovi za napajanje - VCC i GND, izlaz za impulse u trajanju od 1 sekunde ili druge frekvencije u zavisnosti od podešavanja određenih registara, kao i pozitivan kontakt za bateriju koji je povezan kako bi sat otkucavao kada je glavno napajanje isključeno. Negativni kontakt ove baterije spajamo na zajedničku žicu napajanja.

Također vidimo da je ovaj čip dostupan u planarnom i DIP paketu.

Ovo mikrokolo se može napajati od 3 volti ili 5 volti.

Pristup ovom mikro krugu preko I2C sučelja se u principu odvija na isti način. baš kao i memorijski čip koji smo koristili u prošloj lekciji. Naravno, bit će nekih nijansi, ali o tome kasnije.

Pošto imam ovaj čip instaliran u istom modulu u koji je ugrađen EEPROM čip, a imamo jednu magistralu za razmjenu, onda će DS1307 čip “prepoznati” da se obraća, naravno, na adresi koja je drugačija od onaj EEPROM čipa.

Evo dijagrama mikrokola koji prima i prenosi podatke

Adresa na kojoj ćemo pristupiti ovom čipu je označena plavom bojom.

U osnovi. Ne vidimo veliku razliku sa dijagramima EEPROM čipa.

Druga razlika u rukovanju će biti u tome što će memorijsko adresiranje već biti jednobajtno, budući da memorijske ćelije ili registri Ovo mikrokolo ima vrlo malo.

To su ovi registri

Svrha ovih registara:

00h- sekundi. Sekunde se pohranjuju u binarnom decimalnom formatu. To jest, niža 4 bita pohranjuju jedinice sekundi, a viša tri bita pohranjuju desetice. Postoji i SH bit - ovo je bit za početak čipa.

01h- minuta. Spremljeno na sličan način.

02h- univerzalniji registar. Ovdje se čuva sat. U četiri najmanje značajna bita nalaze se jedinice, u sljedeća viša dva su desetice, u sljedećem 6. bitu je zastavica da li je popodne ili prije podne, u 7. bitu je način skladištenja - 12 sati ili 24 sata.

03h- dan u tjednu. Pohranjeni u najmanje značajna 3 bita, preostali bitovi se ne koriste.

04h— ovdje se pohranjuje dan u mjesecu, također u binarnom decimalnom formatu. Četiri najmanje značajna bita sadrže jedinice, sljedeća dva veća sadrže desetice, preostali bitovi se ne koriste.

05h- broj mjeseca u godini - pohranjuje se u binarnom decimalnom formatu na isti način kao i sat.

06h- broj godine, i to ne pun četverocifren, već samo dvocifren. Najmanje značajna četiri bita su jedinice, a najviša četiri bita su desetice.

Koristićemo ovih sedam registara. Posljednji registar je dizajniran da konfigurira frekvenciju impulsa na impulsnom izlazu mikrokola; to se radi u donja dva bita registra. po defaultu će biti frekvencija od 1 Hz, ovo nam je dovoljno da trepnemo debelo crijevo, tako da nećemo koristiti ove bitove. SOWE i OUT bitovi se također koriste za konfiguriranje i omogućavanje kvadratnog valnog oblika.

Projekat za rad sa ovim čipom kreiran je na uobičajen način sa imenom MyClock1307, datoteke koje se odnose na EEPROM su uklonjene odatle, a datoteke su dodane RTC.c I RTC.h.

#ifndefMAIN_H_

#defineMAIN_H_

#defineF_CPU8000000UL

#include

#include

#include

#include

#include

#include"usart.h"

#include"twi.h"

#include"RTC.h"

#endif/* MAIN_H_ */

U glavnom fajlu MyClock1307.c napravimo globalne varijable za pohranjivanje vremena, datuma i dana u sedmici i nakon toga će puni sadržaj nakon uklanjanja svih nepotrebnih stvari biti ovakav

#include"glavni.h"

nepotpisancharsec, min, sat, dan, datum, mjesec, godine;

intmain( void)

I2C_Init();

USART_Init(8);

Dok(1)

Sve što je ostalo od prethodnog koda je inicijalizacija I2C i USART.

Sada moramo nekako uopće pokrenuti čip. Ako je mikrokolo novo, ili nikada nije korišteno, ili je neko promijenio vrijednost CH bita posebno za neku svrhu, onda još ne "radi".

Pa, općenito, čim postavimo sve vrijednosti u registrima mikrokola, on će se pokrenuti i naš sat će se pokrenuti.

Veza ili kolo se također koristi iz prethodne lekcije, odnosno gledat ćemo vrijeme preko USART sabirnice u terminalskom programu.

Stoga ćemo zapravo, koristeći naše znanje iz prethodne lekcije, pisati da napišemo funkciju za postavljanje vremena.

Prije svega, mi ćemo, naravno, proći uslov START

//Podesi vrijeme

I2C_StartCondition();

Zatim prenosimo adresu sa bitom za upis 0

I2C_StartCondition();

I2C_SendByte(0b11010000);

Idemo na adresu 0, što znači na dio memorije gdje se nalazi prvi registar

I2C_SendByte(0b11010000);

I2C_SendByte(0); //Idite na 0x00

Prije nego što upišete bilo koju vrijednost u registre mikrokola, zapamtite da prvo moramo pretvoriti brojeve u BCD format, što će biti prikladno za registre. Da bismo to učinili, otići ćemo u datoteku RTC.c i napisati takvu funkciju. Biće vrlo lako i ne treba nikakvo objašnjenje.

nepotpisancharRTC_ConvertFromBinDec( nepotpisancharc)

{

nepotpisancharch= (( c/10)<<4)|( c%10);

povratakch;

}

Pa, hajde da napišemo i funkciju inverznog tipa, pretvarajući broj iz binarno-decimalnog formata u decimalni. Uz njegovu pomoć, mi ćemo, naprotiv, pretvoriti očitanja vremena čitanja u oblik pogodan za našu percepciju (HRI - sučelje čitljivo od ljudi)

nepotpisancharRTC_ConvertFromDec( nepotpisancharc)

{

nepotpisancharch= (( c>>4)*10+(0b00001111&c));

povratakch;

}

I ovdje je sve vrlo jasno, pomaknemo visoku tetradu bajta udesno, pomnožimo je sa deset i dodamo nisku tetradu (veliku tetradu maskiramo nulama)

Napišimo prototipove ovih funkcija u datoteku RTC.c

#include"glavni.h"

nepotpisancharRTC_ConvertFromDec( nepotpisancharc); //pretvoriti BCD broj u decimalni

nepotpisancharRTC_ConvertFromBinDec( nepotpisancharc);

Programator, RTC DS1307 modul sa memorijskim čipom i USB-TTL adapterom možete kupiti ovdje:

Programer (pouzdan prodavac) USBASP USBISP 2.0

Pogledajte VIDEO TUTORIAL (kliknite na sliku)

Pregleda postova: 7,354

Recenzije o ovom satu na internetu su najkontradiktornije. Neki kažu da je sat divan, dok ga drugi nazivaju lošom kreacijom Dallasa. I tako, kako bih raspršio sve lažne glasine, izvadio sam mikrukhu iz zaliha i počeo eksperimentirati.

Posebnosti:

  • Veoma niska potrošnja energije. Proizvođač obećava 10 godina rada sata s jednom standardnom baterijom. CR2032
  • 56 bajtova memorije za pohranjivanje korisničkih podataka. Mislim da to nije posebno neophodna opcija, ali bi nekome mogla biti od koristi.
  • Programabilni izlaz za taktiranje eksternih uređaja. Može da emituje 1 Hz, 4,096 kHz, 8,192 kHz i 32,768 kHz.
  • 24-satni i 12-satni način rada

Pinout

Igle sata nalaze se na sljedeći način:

X1, X2— Pinovi za povezivanje kvarcnog rezonatora na frekvenciji od 32,768 kHz
VBAT— Izlaz za povezivanje 3-voltne rezervne baterije
GND- Zemlja
S.D.A.- linija podataka i2c sabirnice
SCL— i2c linija takta sabirnice
SQW/OUT– izlazni signal za taktiranje eksternih uređaja
VCC- napajanje od 5 volti

Povezivanje sa kontrolerom
Vezivanje je minimalno. Trebat će vam kvarc od 32,768 kHz, par otpornika za rad i2c magistrale i baterija od tri volta.

Ispravan raspored ploče
Točnost sata, kao i performanse sata općenito, zavise od rasporeda tiskane ploče. Dallas u svom datasheet-u preporučuje smanjenje dužine provodnika od mikrokola do kvarcnog rezonatora na minimum i okruživanje ovih vodiča pravokutnikom povezanim sa zemljom. Osim toga, radi pouzdanosti, zalemio sam žice koje idu u zemlju do kvarcnog tijela i postavio kondenzator od 0,1 uF paralelno s napajanjem.

Usput, može raditi i bez kvarca. Da bi se to postiglo, eksterni taktni signal sa frekvencijom od 32,768 kHz se dovodi do noge X1, a X2 ostaje suspendovan u vazduhu.

Organizacija memorije sata
Ovaj minijaturni uređaj je opremljen sa 64 bajta memorije. Prvih osam bajtova radi. Pohranjuju vrijeme, datum, dan u sedmici. Ostatak se dodjeljuje potrebama korisnika. U njih možete pohraniti, na primjer, neka podešavanja ili nešto drugo. Naravno, kada se rezervno napajanje izgubi, sve informacije u ovoj memoriji se uništavaju. Sav rad sa satom (čitanje i podešavanje vremena/datuma) svodi se na čitanje i upisivanje potrebnih memorijskih ćelija.

Svi brojevi u memoriji pohranjeni su u binarnom decimalnom formatu. To znači da se dvije cifre mogu pohraniti u jedan bajt. Na primjer, broj 0x23 sadrži broj 2 i broj 3. Za svaki broj se dodjeljuju 4 bita. Zašto se to radi? Za praktičnost i uštedu memorije. Pored vremena i datuma, nekoliko bitova postavki je pohranjeno u memoriji:

  • Zastoj sata- upravlja satom. Kada je bit postavljen, sat se zaustavlja. Za pokretanje sata potrebno je u ovaj bit upisati 0. Nakon povezivanja rezervne baterije, ovaj bit se postavlja i sat ne broji vrijeme! Morate zapamtiti ovo.
  • 24/12 - ovaj bit za odabir načina rada sata. Kada je ovaj bit jednak jedan, koristi se 12-satni način rada. Inače 24 sata. Ako se koristi 12-satni način rada, tada peti bit označava AM ili PM sada. Ako je bit 1 onda to znači PM. U 24-satnom načinu rada, ovaj bit se koristi za pohranjivanje desetina sati zajedno sa bitom 4.
  • Izlaz— kontrolira stanje noge SQW/OUT. Bit je postavljen - dnevnik je na kraku 1. Reset - na kraku 0. Za kontrolu na ovaj način, bit SQWE mora biti resetovan.
  • SQWE- kada je bit postavljen, pravokutni impulsi se pojavljuju na nožici SQW/OUT.
  • RS1, RS0— ovi bitovi određuju frekvenciju impulsa. Ovisnost frekvencije o kombinaciji bitova je u donjoj tabeli:

Softver

Za rad sa satom DS1307, napisana je jednostavna biblioteka koja sadrži sljedeće osnovne funkcije:

DS_start— pokreće sat. Sat možete pokrenuti i podešavanjem vremena.
DS_stop- zaustavlja sat
DS_set_time — Podešavanje vremena. Prije nego što pozovete proceduru, trebate staviti sekunde u tmp1, minute u tmp2 i sate u tmp3. Sat u 24-satnom formatu.
DS_get_time: — očitavanje vremena sa sata. sekunde će biti snimljene u tmp1, minute u tmp2, sati u tmp3
DS_get_date:— očitavanje datuma sa sata. Dan će biti snimljen u tmp1, mjesec u tmp2, godina u tmp3
DS_set_date: — postavljanje datuma. Prije pozivanja procedure potrebno je da unesete dan u tmp1, mjesec u tmp2 i godinu u tmp3 (zadnje 2 cifre)

Rutine za podešavanje/čitanje vremena i datuma mogu prihvatiti/vratiti ulazne podatke u BCD i decimalnom formatu. Da biste odabrali željeni format, trebate komentirati ili dekomentirati tri reda u svakoj proceduri (o tome postoje napomene u kodu).

Program za testiranje vam omogućava kontrolu sata preko UART-a (brzina 9600, kontroler radi na 8 MHz). Prilikom pokretanja, odmah se prikazuju vrijeme, datum i upit za unos komandi od 1 do 3. Kada odaberete opciju 1, vrijeme/datum se ponovo čita. Opcija 2 vam omogućava da postavite vrijeme, a opcija 3 datum. Ako želite da pokušate da se igrate sa satom, fajl simulacije je uključen u izvornu arhivu.

Preciznost
Ovdje mnogo ovisi o korištenom kvarcu i rasporedu ploče. List sa podacima navodi da bi kvarcni kapacitet trebao biti 12,5 pF. Kažu da je najbolje koristiti kristale sa matičnih ploča. Da biste ispravili hod, možete zalemiti trim kondenzator na rezonator i koristiti ga za promjenu frekvencije u malim granicama. Meni lično ovaj sat radi dva dana i kasni 3 sekunde. Nešto mi govori da je problem u kapacitetu kvarca, probaću još jedan i javiti se.

Zaključak
Nije loš sat. Idealno za amatersku upotrebu. Iako neki ljudi pišu o greškama, ja se s njima još nisam susreo.

Ažurirano 23.7.2018. Zdravo svima. Za rad sa satovima, u prošlom članku smo govorili o TWI sučelju, na koji ćemo se danas osvrnuti. Pa počnimo. Ovaj sat je TWI kompatibilan, tj. princip razmjene podataka na sabirnici će biti isti kao što smo razmatrali.

Na slici ispod prikazana je lokacija pinova, opis i sam izgled našeg sata, ili kako ćemo ga kasnije nazvati RTC (Real-time clock) - sat realnog vremena ili generator vremenskih impulsa. Ovaj "uređaj" DS1307 Broji sekunde, minute, sate, dan u mjesecu, mjesec, dan u sedmici i godinu uključujući prijestupne godine. Kalendar važi do 2100. godine. Mislim da ce nam to biti dovoljno za ceo zivot :).

Kao što se vidi iz opisa, postoji ulaz za napajanje baterije u nuždi kada je eksterno napajanje isključeno. U ovom načinu rada, RTC podržava samo svoju glavnu svrhu - mjerenje vremena, bez vanjskih zahtjeva. Napon napajanja baterije treba da bude 2 – 3,5 V. U tehničkom opisu stoji da će sa punjenjem većim od 48 mAh, na temperaturi od 25 stepeni Celzijusa, naše kolo trajati oko 10 godina. Više nego što je potrebno. Na slici ispod prikazan je CR2032 “tablet” i nosač koji ćemo koristiti.

Sada idemo preko eksternog napajanja. Radni napon sata je 5V sa malim rasponom od 4,5-5,5V. Napon baterije 3V (minimalno 2, maksimalno 3,5V) RTC rad je podijeljen u tri napona:

1. Vcc=5V – čitanje, pisanje, brojanje;
2. Vcc= ispod 1,25*Vbat, ali iznad Vbat +0,2V - samo baterija računajući iz vanjskog napajanja.
3. Vcc ispod Vbat: RTC i RAM se prebacuju na napajanje iz baterije. Potrošnja u aktivnom stanju je 1,5 mA, iz baterije 500-800 nA.
Napon za prijenos/prijem informacija:
Logički 0: -0,5V - +0,8V
Logika 1: 2,2 V – Vcc+0,3V

Kao iu prethodnim postovima, pokušat ćemo ga pokrenuti u Proteusu. Otklonimo greške u kodu. I sve ćemo prebaciti na hardver. Ispod je dijagram povezivanja.

Gdje je SQW/OUT izlaz takta koji se može programirati na izlazne frekvencije od 1Hz, 4.096Hz, 8.192Hz i 32.768Hz. One. može se koristiti za eksterno prekidanje kontrolera sa frekvencijom od 1 s. Veoma korisna funkcija. Ali neće nam trebati. Inače, to je i otvoreni kolektor, pa je potreban pull-up otpornik. Nominalni 4,7 kOhm.

Pinovi X1 i X2 – na njih povezujemo kvarcni rezonator frekvencije 32,768 kHz. Ili možete koristiti eksterni generator takta sa istom frekvencijom. Ali u ovom slučaju, pin X1 je spojen na signal, a X2 ostaje nepovezan (visi u zraku.).

Pa zaključci SDA i SCL-a sa kojima smo se upoznali u prošlom članku.

Zadržimo se malo na rezonatoru (slika ispod). Koji se može nazvati srcem sata i od kojeg zavisi tačnost pokreta. Kvalitet samog rezonatora leži na savjesti proizvođača, ali sa naše strane možemo smanjiti grešku koju donose vanjski faktori ako se pridržavamo sljedećih preporuka za postavljanje rezonatora:

2. Širina putanje također treba biti manja, ako je moguće, kako bi se smanjila vjerovatnoća primanja smetnji od drugih izvora.

3. Oko kristala treba postaviti krug u obliku prstena, koji pomaže da se kristal izoluje od buke.

4. Postavite provodnike u prsten i spojite ih na masu.

5. Zalemiti rezonator na zemlju. Ako je zemljište pravilno postavljeno i postoji povjerenje.

Slika ispod prikazuje obris i lokaciju brzog leda na tlu.

Shvatili smo kako da se povežemo. Idemo dalje i shvatimo kako raditi s tim. RTC je programabilan i ima 8 bajtova posebnih registara za svoju konfiguraciju i 56 bajtova nepromjenjive statičke memorije. Za razmjenu informacija potrebna je 2-žična magistrala podataka, tj. serijska sabirnica podataka - o kojoj smo govorili u prošlom članku. Dakle, za početak, prođimo kroz tablicu sa podacima. Šta nam treba:

Registrirajte tablicu. Slika ispod. Prvih osam registara služe za izlaz i programiranje našeg sata. Kada pristupimo 7. bitu (CH) na adresi 00H i postavimo ga na 0, pokrećemo sat. Želio bih napomenuti da konfiguracija registara može biti bilo koja, tako da kada ga prvi put pokrenete morate ga konfigurirati prema vašim zahtjevima. Preostalih sedam bitova su jedinice i desetine sekundi.

01H – Minute.
02H – Sat koji se može podesiti:
— Bit 6 – sa 1 izlazom 12-časovni format, 0 – 24.
— Bit 5 – u 1 (sa 12-satnim formatom) popodne, 0-am
— Bit 5 – (u 24-satnom formatu) ovo je rezultat drugih deset sati (20-23 sata)
— Bit4 je prvih deset sati, preostali bitovi su jedinice sati.
03H – dan u sedmici;
04H – datum;
05H – mjesec u godini
06H – god.

Pa, zadnji registar je 07H. Ovaj registar je kontrolni registar.Gdje je OUT odgovoran za kontrolu pina SQW/OUT. Ispod je tabela omogućavanja izlaza.

OUT
SQWE
SQW/OUT
1
0
1
0
0
0

SQWE – kada je ovaj bit postavljen na 1, na izlaze se izlaze impulsi sa zadatom frekvencijom, koja je postavljena bitovima RS1 i RS0.

Ovaj zaključak nam neće biti od koristi u projektu. Iako sam postavio numeru za to na ploču. Kao eksperiment, može se primijeniti negdje u budućnosti, jer ovdje možete napraviti prekid od 1 sekunde.

Sada kada imamo sve potrebne informacije, hajde da napišemo funkcije za rad sa satom. Takođe ćemo pokrenuti projekat u Proteus . Što će izgledati ovako:

Imajte na umu da rezonator u Proteusu ne mora biti povezan sa satom (zaokružen crvenom bojom).

Na slici je prikazan satni terminal koji prikazuje vrijeme, koje je zauzvrat vezano za sistemsko vrijeme. Terminal za otklanjanje grešaka I2C ili TWI protokola, koji prikazuje vrijeme slanja i prijema signala, gdje je D0 poslana komanda, D1 primljena. U nastavku ću prikazati snimke ekrana terminala s rezultatom programa.

Program. Uzimajući u obzir osnovne postavke sata, napisat ćemo funkciju inicijalizacije.

/*Funkcija inicijalizacije uključuje podešavanje brzine razmjene podataka pomoću formule (u prethodnom članku), postavljanje preskalera i uključivanje TWI modula*/
void init_DS1307 (void)
{
TWBR = 2; /*Na frekvenciji od 1 MHz */
TWSR = (0<< TWPS1)|(0 << TWPS0); /*Predivizor po 64*/
TWCR |= (1<< TWEN); /*Omogući TWI modul*/
}

void write_DS1307 (uint8_t reg, uint8_t vrijeme)/*prodajemo dva parametra: adresu registra kojem ćemo pristupiti i prenijetu informaciju*/
{
/* Formirajte START stanje postavljanjem bitova kontrolnog registra */
TWCR = (1<
/*Dozvoli TWEN modulu da radi; Generiraj početno stanje TWSTA; Resetujte TWINT zastavicu */
/*Čekamo da se završi formiranje početnog uslova, tj. dok se zastavica ne postavi, statusni kod = 08*/
dok (!(TWCR & (1<
/*Sljedeće šaljemo paket adrese (adresa uređaja). Sadržaj paketa se učitava u TWDR registar*/
TWDR = 0xd0; /*0b1101000 + 0 – adresa + bit pisanja*/
/*Resetirajte zastavicu za prijenos informacija*/
TWCR = (1<
/*Čeka se postavljanje zastave*/
dok (!(TWCR & (1<
/*prođite registar kojem ćemo pristupiti*/
TWDR = reg;
TWCR = (1<
dok (!(TWCR & (1<
/*Prodaj informacije koje treba upisati u bajt registra*/
TWDR = vrijeme;
TWCR = (1<
dok (!(TWCR & (1<
/*formira STOP stanje*/
TWCR = (1<
}

U ovoj funkciji, proslijedili smo tri bajta, adresu uređaja, adresu registra i bajt informacija za pisanje u ovaj registar i generirali STOP stanje.

Posljednja funkcija čitanja ostaje. Ispod je format čitanja.

Ova funkcija vrši prijenos bajta adrese uređaja + bita za upisivanje, bajta adrese registra za postavljanje pokazivača na njega, ispunjenje POVSTAR uslova, prijenos bajta adrese uređaja + bit za čitanje, čitanje registra čija adresa preneli smo ranije.

Ako satu pristupimo u formatu za čitanje, onda kada ponovo pristupimo satu, pokazivač se pomera za jedan bajt, uključujući 56 bajtova RAM-a, od 00H do 3FH. Kada se dostigne posljednja adresa, pokazivač se pomiče na adresu 00.

/*Funkcija za čitanje podataka sa DS1307*/
uint8_t read_DS1307 (uint8_t reg)/*Pronesite adresu registra*/
{
uint8_t vrijeme;
/*formira START stanje*/
TWCR = (1<
dok (!(TWCR & (1<
TWDR = 0xd0; /*Prenesi adresu + bit za pisanje*/
TWCR = (1<
dok (!(TWCR & (1<
TWDR = reg; /*Adresa registracije*/
TWCR = (1<
dok (!(TWCR & (1<
/*formira stanje POVSTAR*/
TWCR = (1<
dok (!(TWCR & (1<
TWDR = 0xd1; /*Adresa za prijenos + bit čitanja*/
TWCR = (1<
dok (!(TWCR & (1<
/*čitaj podatke*/
TWCR = (1<
dok (!(TWCR & (1<
vrijeme = TWDR;
vrijeme = (((vrijeme & 0xF0) >> 4)*10)+(vrijeme & 0x0F);
/*formira STOP stanje*/
TWCR = (1<
vrijeme povratka;
}

Dakle, gore smo napisali tri funkcije koje su nam potrebne za rad sa satom. Koristeći ove funkcije pokrenut ćemo program u Proteusu. Prikažimo, na primjer, datum.

#include
#include
uint8_t vrijeme;
void init_DS1307 (void);
uint8_t read_DS1307 (uint8_t reg);
void write_DS1307 (uint8_t reg, uint8_t vrijeme);
int main (void)
{
DDRC = 0×00; /*Postavite port kao ulaz*/
PORTC = 0xFF; /*Pojačajte otpor*/
init_DS1307;
dok (1)
{
_delay_ms(50);
read_DS1307 (0×04); /*Pročitaj registar datuma*/
}
}

Ispod je rezultat izvršavanja programa za čitanje datuma.

U prozoru I2C debuggera ( TWI ) vidi se da se prvo adresa registra šalje u RTC (zeleni krug), u ovom slučaju 04, koji je odgovoran za datum u mjesecu, a zatim sat šalje odgovor 21 (crveni krug).

Kada pokrenemo sat u peglu, moraćemo da unesemo sadašnje vreme. Ispod je primjer programa za promjenu minuta.

dok (1)
{
_delay_ms(500);
read_DS1307 (0×01); /*Pročitajte minutu*/
_delay_ms(500);
write_DS1307(0×01, 15); /*Zapišite potrebnu minutu*/
_delay_ms(500);
read_DS1307 (0×01); /*Pročitajte minutu*/
}

Slika pokazuje da se pristupa prvom registru 01, čita se minut 23. Zatim koristimo funkciju pisanja i unosimo vrijednost 15. Kod sljedeće funkcije čitanja imamo vrijednost 15 na displeju sata.

Pa, posljednji primjer programa je izlaz vrijednosti svih registara

dok (1)
{
kašnjenje_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);
}

Slika ispod pokazuje da su prikazani podaci 7 registara.

Izvorni kod za projekat je u prilogu:

(Preuzimanja: 601 osoba)

To je sve. U sljedećem članku ćemo povezati hardverski sat, prikazati vrijeme na indikatoru i upoznati se sa binarnim decimalnim formatom za rad sa satom. Ćao svima.

Izračunavanje realnog vremena u sekundama, minutama, satima, datumima u mjesecu, mjesecima, danima u sedmici i godinama, uzimajući u obzir visinu tekuće godine do 2100.

56 bajtova nepromjenjive RAM memorije za pohranu podataka

2-žični serijski interfejs

Programabilni generator kvadratnih impulsa. Može da emituje 1 Hz, 4,096 kHz, 8,192 kHz i 32,768 kHz.

Automatsko otkrivanje isključenja glavnog izvora napajanja i priključenje rezervnog

24-satni i 12-satni način rada

Potrošnja ne veća od 500 nA kada se napaja rezervnom baterijom na temperaturi od 25C°

Mikrokolo je dostupno u osmopinskim DIP i SOIC paketima. Pinout je isti za sve. Ispod ću dati redove iz datasheeta da upotpunim sliku.

Dokumentacija za čip (datasheet)

Dodjela pinova:

. X1, X2- Služi za povezivanje kvarcnog rezonatora od 32,768 kHz

. Vbat- Ulaz za bilo koju standardnu ​​litijumsku bateriju od tri volta ili drugi izvor napajanja. Za normalan rad DS1307, napon baterije mora biti u rasponu od 2,0 ... 3,5 V. Litijumska baterija kapaciteta 48 mAh ili više podržava DS1307 u nedostatku napajanja
više od 10 godina na temperaturi od 25°C.

. GND- generalni minus

. Vcc- Ovo je ulaz +5 V. Kada je napon napajanja iznad 1,25 * VBAT, uređaj je potpuno uključen i podaci se mogu čitati i zapisivati. Kada je 3V baterija priključena na uređaj i Vcc je manji od 1,25 * VBAT, čitanje i pisanje su zabranjeni, ali funkcija mjerenja vremena nastavlja raditi. Kada Vcc padne ispod VBAT, RAM i RTC prelaze na VBAT napajanje iz baterije.

. SQW/OUT- Izlazni signal sa pravougaonim impulsima.

. SCL- (Ulaz serijskog sata - ulaz serijskog sata) - koristi se za sinhronizaciju podataka preko serijskog interfejsa.

. S.D.A.- (Ulaz/izlaz serijskih podataka) - ulazno/izlazni pin za dvožični serijski interfejs.

Rad sa SQW/OUT Pin.

Prvo, pogledajmo strukturu registra DS1307.

Struktura registra DS1307 čipa

Zainteresovani smo za “Kontrolni registar” koji se nalazi na adresi 0x7, jer određuje rad SQW/OUT pina.

Ako je SQWE bit = 1, tada počinje formiranje pravokutnih impulsa, ako je SQWE = 0, tada će izlaz izlaza biti vrijednost OUT bita.

Bitovi RS0 i RS1 odgovorni su za frekvenciju impulsa, odnosno:

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

Evo primjera:

Ako trebamo početi generirati pravokutne impulse frekvencije 1 Hz, tada trebamo poslati bajt 00010000 ili 0x10 u heksadecimalnom brojevnom sistemu u registar 0x7 mikrokola, koji ima adresu 0x68.

Korištenje biblioteke Wire.h, to se može uraditi ovako:

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

Povezivanje na Arduino:

Pinovi odgovorni za I2C sučelje na Arduino pločama baziranim na različitim kontrolerima se razlikuju.

Potrebne biblioteke:

za rad sa DS1307: http://www.pjrc.com/teensy/td_libs_DS1307RTC.html
za rad sa vremenom: http://www.pjrc.com/teensy/td_libs_Time.html

Podešavanje vremena

. Ručno u kodu

Vrijeme se postavlja ručno u programskom kodu i prenosi na Arduino ploču. Ova metoda nije najpreciznija jer Vrijeme kompilacije i učitavanja može varirati.

Primjer koda

#include #include void postaviti () { Serial.begin(9600); dok (! Serial ) ; // Samo za Leonardo ploču // dobiti vrijeme od RTC-a Serial //sinhronizacija nije uspjela ostalo Serial.println("RTC je podesio sistemsko vrijeme"); //instaliraj ručno 16.02.2016 12:53 TimeElementste; te.Sekunda = 0; //sekunde te.Minute = 53; //minute te.Sat = 12; //sati te.Day = 16; //dan te.Mjesec = 2; // mjesec te.Godina = 2016 - 1970; //godina u biblioteci se računa od 1970 time_t timeVal = makeTime(te); RTC .set(timeVal); setTime(timeVal); ) void petlja() ( digitalClockDisplay(); //odgoda izlaznog vremena (1000); ) void digitalClockDisplay() ( Serial Serial.print(" "); Serial.print(dan()); Serial.print(" "); Serial.print(month()); Serial.print(" "); Serial.print(godina()); Serial // vrijeme izlaza preko ":" Serial.print(":"); ako (cifre< 10) Serial.print("0"); Serial.print(cifre); )

. Instalacija od"Monitor porta"

Opcija preciznijeg podešavanja vremena. Vrijeme se postavlja preko “port monitora” dok kontroler radi.

Otvaramo monitor, unosimo podatke u traženom formatu, gledamo referentni sat, iskoristimo trenutak i kliknemo „pošalji“.

Primjer koda

//format za indikaciju trenutnog vremena "DD.MM.GG hh:mm:ss" //gdje je DD dan, MM mjesec, YY godina, hh sati, mm minute, ss sekunde //GG - od 00 do 99 za 2000-2099#include #include bool isTimeSet = false ; //zastavica koja pokazuje da li je datum već postavljen void postaviti () { Serial.begin(9600); dok (! Serial ) ; // Samo za Leonardo ploču setSyncProvider(RTC.get); // dobiti vrijeme od RTC-a if (timeStatus() != timeSet) Serial.println("Nije moguće sinhronizovati sa RTC-om"); //sinhronizacija nije uspjela ostalo Serial.println("RTC je podesio sistemsko vrijeme"); ) void petlja() ( ako ( Serial.available()) ( //naredba je primljena s vremenom setTimeFromFormatString( Serial.readStringUntil("\n" )); isTimeSet = istina; //datum je postavljen) if (isTimeSet) //ako je naveden datum( digitalClockDisplay(); // izlazno vrijeme ) kašnjenje (1000); ) void digitalClockDisplay() ( Serial.print(sat()); printDigits(minute()); printDigits(second()); Serial.print(" "); Serial.print(dan()); Serial.print(" "); Serial.print(month()); Serial.print(" "); Serial.print(godina()); Serial.println(); ) void printDigits(int digits) ( // vrijeme izlaza preko ":" Serial.print(":"); ako (cifre< 10) Serial.print("0"); Serial.print(cifre); ) void setTimeFromFormatString(Vrijeme niza) ( //DD.MM.GG hh:mm:ss int dan = time.substring(0, 2).toInt(); int mjesec = time.substring(3, 5).toInt(); int godina = time.substring(6, 8).toInt(); int sati = time.substring(9, 11).toInt(); int minuta = time.substring(12, 14).toInt(); int sekundi = time.substring(15, 17).toInt(); TimeElementste; te.Second = sekunde; te.Minute = minute; te.Sat = sati; te.Dan = dan ; te.Mjesec = mjesec; te.Godina = godina + 30; //godina u biblioteci se računa od 1970. Mi želimo od 2000 time_t timeVal = makeTime(te); RTC .set(timeVal); setTime(timeVal); )