Sursa de alimentare Ds1307. Conexiunea modulului RTC DS1307 la Arduino. Proiect de testare pentru DS1307

Modul de ceas în timp real DS1307
Modul mic RTC I2C 24C32 memorie ceas DS1307

Un mic modul care îndeplinește funcțiile unui ceas în timp real. Realizat pe baza cipului DS1307ZN+. Cronometrarea continuă are loc datorită alimentării autonome de la o baterie instalată în modul. Modulul conține, de asemenea, o memorie EEPROM de 32 KB, care reține informații atunci când toate tipurile de alimentare sunt oprite. Memoria și ceasul sunt conectate printr-o magistrală comună de interfață I2C. Semnalele magistralei I2C sunt transmise la contactele modulului. Când este conectat alimentare externă Bateria este reîncărcată printr-un circuit de încărcare primitiv. Placa are spațiu pentru montarea unui senzor digital de temperatură DS18B20. Nu este inclus in pachet.
Acest dispozitiv este utilizat atunci când se măsoară intervale de timp mai mari de o săptămână cu dispozitive bazate pe microcontroler. Utilizarea resurselor proprii ale MK în acest scop este nejustificată și adesea imposibilă. Furnizați alimentare neîntreruptibilă pe pe termen lung scump, este imposibil să instalați o baterie pentru alimentarea MK din cauza consumului de curent semnificativ. Aici este locul în care modulul de ceas în timp real DS1307 vine în ajutor.
De asemenea, modulul de ceas în timp real DS1307, datorită propriei memorie, vă permite să înregistrați date de la evenimente care au loc de mai multe ori pe zi, de exemplu, măsurători de temperatură. Jurnalul de evenimente este citit ulterior din memoria modulului. Aceste capabilități vă permit să utilizați modulul ca parte a unei stații meteo automate autonome sau pentru cercetarea climei în locuri greu accesibile: peșteri, vârfuri de stânci. Devine posibilă înregistrarea parametrilor tensometrici ai structurilor arhitecturale, cum ar fi suporturile de pod și altele. Când echipați dispozitivul cu comunicație radio, este suficient să îl instalați în zona studiată.

Caracteristici

Tensiune de alimentare 5 V
Dimensiuni 27 x 28 x 8,4 mm

Schema electrica

Dispozitivul comunică cu electronica instrumentului folosind semnale SCL și SDA. Cipul IC2 este un ceas în timp real. Condensatorii C1 și C2 reduc zgomotul pe linia de alimentare VCC. Rezistoarele R2 și R3 asigură nivelul adecvat pentru semnalele SCL și SDA. De la pinul 7 al IC2 se primește semnalul SQ, constând din impulsuri dreptunghiulare cu o frecvență de 1 Hz. Este folosit pentru a verifica funcționalitatea MS IC2. Componentele R4, R5, R6, VD1 asigură reîncărcarea bateriei BAT1. Pentru a stoca date, modulul de ceas în timp real DS1307 conține IC1, un cip de memorie pe termen lung. US1 - senzor de temperatură. Semnalele modulului și ale liniei de alimentare sunt transmise la conectorii JP1 și P1.

Autobuz de informare

I2C este o interfață serială standard care utilizează două linii de semnal SCL, SDA și un fir comun. Liniile de interfață formează un autobuz. Mai multe cipuri pot fi conectate la liniile de interfață I2C, nu doar cipuri de module. Pentru a identifica microcircuitul pe magistrală, și anume, scrieți date în MS-ul necesar și determinați din ce MS provin datele. Fiecare cip are o adresă unică pentru magistrala rută. DS1307 are adresa 0x68. Se înregistrează la fabrică. Cipul de memorie are adresa 0x50. ÎN software Arduino include o bibliotecă de software care oferă suport I2C.

Cip de ceas în timp real

DS1307 are consum redus de energie, face schimb de date cu alte dispozitive prin interfața I2C, conține o memorie de 56 de octeți. Conține un ceas și un calendar de până la 2100. Cipul de ceas în timp real oferă altor dispozitive informații despre momentul prezent: secunde, minute, ore, ziua săptămânii, dată. Numărul de zile din fiecare lună este luat în considerare automat. Există o funcție de compensare pentru anii bisecți. Există un indicator pentru a determina dacă ceasul funcționează în modul 24 de ore sau în modul 12 ore. Pentru a funcționa în modul de 12 ore, cipul are un bit din care sunt citite date pentru transmisie despre perioada de timp: înainte sau după masă.

Cip de memorie pe termen lung

Desen al modulului de ceas în timp real DS1307 din partea bateriei cu senzorul de temperatură U1 instalat.

Baterie

În suport pe partea din spate Placa este echipată cu o baterie cu disc litiu CR2032. Este produs de mulți producători, de exemplu, fabricat de GP oferă o tensiune de 3,6 V și un curent de descărcare de 210 mAh. Bateria se reincarca la pornirea curentului, intalnim acest mod de functionare al unei baterii cu litiu pornit placa de baza calculator.

Încărcarea bateriei

Software

Pentru a opera modulul ca parte a Arduino, o bibliotecă învechită de pe site-ul web Adafruit numită RTCLib este destul de potrivită. Schița se numește DS1307.pde. Există o versiune actualizată. Ar trebui să descărcați arhiva, să o despachetați, să o redenumiți și să copiați biblioteca în directorul bibliotecii Arduino.

Conectarea la Arduino Mega

Pentru a face acest lucru, ar trebui să utilizați schițe
SetRTC setează timpul în ore în funcție de timpul specificat în schiță.
GetRTC afișează ora.
Ambele schițe necesită biblioteca Wire și definesc adresa I2C. Pentru a seta adresa de ceas pe magistrala I2C, utilizați acest scaner I2C.

Conexiune cu Arduino Mega.

Conectați SCL și SDA la pinii corespunzători 21 și 20 de pe Arduino Mega 2560. Conectați alimentarea.

Conexiune cu Arduino Uno


Setați ora în schița SetRTC și încărcați-o pe Arduino. Apoi apăsați butonul de resetare pentru a seta ceasul. Acum descărcați schița GetRTC. Deschide monitorul serial și ceas. Există o bibliotecă specială de timp. Are multe caracteristici diferite care pot fi utile în funcție de situație. Pentru a seta ora folosind biblioteca, trebuie să descărcați . Când utilizați schița, puteți sincroniza ceasul în timp real cu ceasul computerului personal.

Buna ziua!
Astăzi vreau să vă povestesc despre un microcircuit atât de interesant precum DS1307. Acesta este un ceas minunat plus un calendar și cel mai bun lucru este că acest ceas mic are o Biblie în CVAVR. Da, și tocmai mi-a venit în mână și am decis să-l torturez 8) În primul rând, avem nevoie de o diagramă pentru conectarea lui. Este destul de simplu și a fost preluat din fișa de date. Dar există o mică excepție. Fișa tehnică necesită să conectați un rezistor între pinul de alimentare și pinul de ieșire a impulsului dreptunghiular. Deoarece făceam o placă separată pentru a putea testa proiecte ulterioare pe ea, am adăugat și un LED. S-a dovedit foarte convenabil. Puteți vedea, de exemplu, impulsuri secunde.
De fapt schema.

Și iată cum arată asamblat.

Am efectuat teste în combinație cu ATmega32 + LCD 16x2 + DS1307. În continuare sunt două opțiuni. În primul rând, puteți genera codul direct folosind generatorul CVAVR. În al doilea rând, scrie totul singur. Vă sugerez să o scrieți singur, dar mai întâi să trecem peste caracteristicile DS1307.
1. rtc_init(rs, sqwe, out) Aceasta este prima funcție de inițializare a cipului. Acum toate argumentele sunt în ordine. rs necesare pentru a seta frecvența impulsurilor dreptunghiulare de ieșire pe picior SQW/OUT . necesare pentru a activa ieșirea impulsurilor dreptunghiulare. 1 - posibil 0 - nu. afară necesare pentru a seta frecvența impulsurilor dreptunghiulare de ieșire pe picior necesar pentru a determina nivelul logic pe piciorul de ieșire dacă nu există permisiunea de a scoate impulsuri dreptunghiulare. Vo aplecat. Pe scurt, dacă nu trebuie să smuciți piciorul ., apoi parametrul 0 pune înăuntru 1 - posibil 0 - nu. iar acum dacă 1 egală 1 , atunci va fi pe picior 0 , iar dacă scriem 0 , apoi și pe picior . Exemplu: rtc_init(0,1,0); Aceasta înseamnă pornirea ieșirii impulsurilor dreptunghiulare cu o frecvență de 1 Hz. 2. rtc_set_time(oră, min, sec) Ei bine, după cum sugerează și numele, această funcție setează ora. Totul este simplu aici, argumentele sunt ore, minute și secunde. 3. rtc_set_date(zi, lună, an) Aceeași pălărie, dar cu o întâlnire. 4. rtc_get_time(&ora, &min, &sec)Și aici sunt mai multe detalii. Această funcție este necesară pentru a obține ora curentă. Argumentele funcției sunt adresele variabilelor unde va scrie ulterior valorile. Acest lucru se realizează datorită faptului că funcțiile pot returna doar un parametru (cum ar fi C). Adică, înainte de a apela funcția, trebuie să inițializați trei variabile caracter fără semn. 5. rtc_get_date(&ziua, &luna, &anul) Același lucru, dar cu data. Acum totul este la fel cu exemplele. rtc_set_time(15, 0, 0); Setați ora la 15:00:00 rtc_set_date(14, 2, 14); Data a fost stabilită pentru 14 februarie 2014. Rețineți că anul este scris cu două numere. Piesa de fisa de date: Ceasul în timp real (RTC) numără secundele, minutele, orele, data lunii, luna, ziua săptămânii și anul cu compensarea anului bisect valabilă până la 2100 Până în 2100 și din moment ce trecem un caracter fără semn funcției, valoarea poate fi luată de la 0 la 255. Nu am încercat să conduc mai mult de o sută, dar anul 2014, înregistrat de frică, a fost afișat ca 144. 8) nesemnat char hour, min, sec; rtc_get_time(&ora, &min, &sec); Mai întâi inițializam variabilele, apoi apelăm funcția. După ce îl apelați, puteți opera în siguranță cu timpul, care va fi scris în variabile. nesemnat char zi, lună, an; rtc_get_date(&ziua, &luna, &anul); În principiu, acesta este același lucru, doar data va fi în variabile. Și în sfârșit, tot programul cu comentarii, așa cum am promis. Mai întâi inițializam variabilele, apoi apelăm funcția. După ce îl apelați, puteți opera în siguranță cu timpul, care va fi scris în variabile. /************************************************ * *** Program pentru lucrul cu ceas în timp real Microcontroler DS1307: ATmega32 Frecvență Quartz: 3,686400 MHz ******************************** ****** ****************************/ #include // Conectați biblioteca pentru a lucra cu LCD Mai întâi inițializam variabilele, apoi apelăm funcția. După ce îl apelați, puteți opera în siguranță cu timpul, care va fi scris în variabile. // Conectați biblioteca pentru lucrul cu șiruri Mai întâi inițializam variabilele, apoi apelăm funcția. După ce îl apelați, puteți opera în siguranță cu timpul, care va fi scris în variabile. void main(void) ( // Inițializați tabloul pentru șir și variabile pentru date șir de caractere nesemnate; caracter nesemnat c, m, s, d, me, g; PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; // Inițializați magistrala I2C i2c_init(); // Inițializați DS1307 . Exemplu: // Inițializați afișarea lcd_init(16); // Am folosit aceste funcții o dată pentru a seta ora și data. // rtc_set_time(16, 0, 0); // rtc_set_date(13, 2, 14); în timp ce (1) ( // Am timp rtc_get_time(&c, &m, &s); lcd_gotoxy(0,0); // Formatat sprintf(șir, „Ora %02i:%02i:%02i”, c, m, s); // Afișează ora lcd_puts(șir); // Am data lcd_gotoxy(0,0); rtc_get_date(&d, &me, &g); lcd_gotoxy(0,1); sprintf(șir, „Data %02i.%02i.20%2i „, d, me, g);// Afișează data



lcd_puts(șir);

); )

Ei bine, se pare că asta-i tot. Pentru început, cred că este clar, dar apoi cui îi pasă. Iată cum arată în acțiune.

Roman 29.10.15 21:30

Multumesc pentru articol, totul este clar si fara apa.

Alexey 29.10.15 22:47

incerc)

Zhenya 07.11.15 09:33

Alexey multumesc mult!

Alexey 07.11.15 10:23

Vă rog.

Petru 04/05/16 00:11

Este cu adevărat posibil să repeți acest lucru în programul flowcode?
Alexey 04/05/16 08:52
Ce fel de program este acesta?

Mihail 09.09.16 00:18 Alexey 09.09.16 12:16 Serghei 20.11.16 12:28

Mulțumesc pentru explicația detaliată a exemplelor. Ați putea adăuga un exemplu?

instalare manuală timpul în RTC? Uneori sunt încă necesare ajustări de timp. Alexey 20.11.16 15:33

Pentru a lucra pe deplin cu ceasurile în timp real DS1307 și DS3231, am scris funcții care sunt incluse în bibliotecă. Recomand să-l folosiți pentru generarea de proiecte mai simplificată sub Atmel Studio. Poti sa te uiti si tu

video
despre utilizarea acestei biblioteci.

Veniamin 12/10/16 23:33

Rtc_set_date(13, 2, 14);

Compilatorul se poate plânge de o astfel de intrare ca „prea puține argumente”, deoarece trebuie trecute 4 argumente, dintre care primul este ziua săptămânii. Prin urmare, trebuie să transmiteți 4 numere și să ridicați - tot 4. Din câte știu, în unele versiuni de codevision funcționează cu trei, dar eu personal m-am chinuit destul de mult până am aflat de ce timpul este ușor. scris și citit pentru mine, dar data nu este.

Alexey 12/11/16 00:00

ANTONIM 04/03/17 15:18

Mult mai precis - cât mai exact? IMHO, precizia ceasului este determinată de o precizie de 99,9999999% rezonator cu cuarț.

Alexey 04/03/17 16:09

Ei bine, nu chiar. Persoana probabil a vrut doar compensarea temperaturii, deoarece frecvența cuarțului depinde și de temperatură.

Igor Kazantse 31.07.19 16:54

Situație: Am cumpărat un mikruhu DS1307. Ți-am lipit circuitul. Singura funcție necesară este emiterea de impulsuri secunde. Nu mai este nevoie de nimic. Ce să fac? Ce programator ar trebui să folosesc? [email protected]

Alexey 01.08.19 10:50

Nu este nevoie de programator. Trebuie să scrieți un program pentru orice microcontroler care va trimite o comandă pentru a seta frecvența pinului de ieșire SQW/OUT. În plus, atâta timp cât există tensiune pe microcircuit, ieșirea va avea o undă pătrată de 1 Hz.

În multe modele este util să știți ora curentă, dar acest lucru nu este întotdeauna posibil și, chiar dacă controlerul este încărcat puternic, ceasul va rămâne constant sau se va grăbi, ceea ce nu este foarte bun. Ieșirea poate fi o sursă externă de timp gata făcută - ceas în timp real - DS1307.

Ceasul este format dintr-un microcircuit DS1307, cuarț de 32,768 KHz, o baterie și 2 rezistențe pull-up pe liniile SDA și SLC. Datorită bateriei, acestea continuă să funcționeze atunci când alimentarea externă este oprită. DS1307 are, de asemenea, 56 de octeți liberi de RAM statică volatilă, care poate fi folosită în propriile scopuri.

Liniile SCL și SDA sunt I2C. Linia SQW conține un impuls de ceas cu o frecvență de la 1 Hz la 32,768 KHz, de obicei nu este utilizat.

Ceasul are câteva caracteristici:

1. Pentru ca aceștia să funcționeze, trebuie să aibă o baterie sau, în cazuri extreme, o rezistență de 4-10 kOhm, altfel nu vor funcționa și vor răspunde cu tot felul de gunoaie.
2. ar trebui să existe un circuit de pământ închis în jurul pistelor de cuarț și, de asemenea, este mai bine să conectați corpul de cuarț la pământ

Puțină teorie

Cronometrul are o adresă fixă ​​de 68h, într-o adresă de 7 biți + 1 bit indică acțiunea - citire/scriere.
Următorul algoritm este utilizat pentru înregistrare:
Primul octet este adresa ceasului 68h + 0 biți care indică înregistrarea, total D0h. După primirea confirmării, adresa de înregistrare este transmisă. Aceasta va seta indicatorul de registru. Apoi transferul de octeți de date începe să-l oprească - este generată o condiție de terminare.
Pentru citire:
Primul octet este adresa ceasului 68h + 1 bit care indică înregistrarea, total D1h. După decodificarea adresei și emiterea unei confirmări, dispozitivul începe să transmită date de la adresa specificată (stocate în registrul pointerului). Dacă indicatorul de registru nu este scris înainte de începerea citirii, atunci prima adresă citită este adresa care a fost stocată ultima dată în ea. DS1307 trebuie să accepte o „număr de confirmare” pentru a încheia citirea.

Pentru a porni ceasul, setați bitul CH la zero, acest lucru ar trebui făcut forțat, deoarece Ceasul este oprit în mod implicit când este pornit.

Ceasul stochează informații în formă zecimală binară - pentru a obține date este suficient să citiți registrul corespunzător.

DS1307 poate funcționa în ambele moduri de 24 și 12 ore - 12/24 de biți (02h 6 biți) este responsabil pentru acest lucru. În modul de 24 de ore, biții 5 și 4 din registrul 02h corespund zecei curente ale orei în modul de 12 ore, bitul 4 stochează zece, iar bitul 5 stochează semnul înainte de prânz / după amiază.

Registrul 7 este responsabil pentru generatorul de ceas de ieșire, ieșirea SQW. Bitul OUT inversează semnalul de ieșire, bitul SQWE pornește ceasul, iar biții RS0 și RS1 setează frecvența ceasului.

Practica

A fost fabricat un mic modul de ceas în timp real. Un ceas a fost asamblat pe o placă folosind un microcontroler PIC16F628A, un afișaj generator de caractere 2x16, un buton pentru setarea orei, un modul de ceas în timp real și o cantitate mică de cabluri.

Placa conține un cip DS1307 în versiunea SMD. Un cuarț la 32,768 KHz este lipit de el, într-o carcasă DT-38, ar trebui să existe un inel de masă în jurul cuarțului și carcasa de cuarț în sine ar trebui să fie, de asemenea, conectată la pământ, pentru aceasta există o gaură specială lângă el. . Pentru a lucra ore în modul offline Este furnizată o baterie CR120 de 3V. De asemenea, pentru a indica funcționarea modulului, puteți instala un LED SMD cu o rezistență de 470 Ohm într-o carcasă de dimensiune standard 0805.

PIC16F628A nu conține hardware I2C, așa că a fost implementat în software. Software-ul I2C a fost scris de la zero, este ușor diferit de protocolul standard prin faptul că nu așteaptă confirmarea de la slave. Software-ul I2C va fi discutat într-unul dintre articolele următoare. Pe baza funcțiilor I2C, au fost implementate următoarele funcții de control DS1307:

Void ds_write(unsigned char addr,unsigned char data) ( i2c_start(); i2c_write(0xD0); i2c_write(addr); i2c_write(data); i2c_stop(); ) unsigned char ds_read(unsigned char addr) (unsigned char addr; i2c_star ); i2c_write(0xD0); i2c_write(0xD1); return temp (0x00) | ( unsigned char i; // setați modul la 24 de ore i=ds_read(0x02); if ((i&0x40)!=0) ( ds_write(0x02,i&~0x40); ) // Dacă ceasul este oprit, atunci activați-l i=ds_read(0x00); if((i&0x80)!=0) ( ds_write(0x00,i& ~0x80); ) ) unsigned char IntToBoolInt(unsigned char data) (data=data%100; return data/10); *16+date%10);

ds_write( adresa , octet de date ) - trimite 1 octet de date la adresa specificată DS1307
octet de date ds_read( adresa ) - citește 1 octet de date de la adresa DS1307 specificată
ds_off()- opriți DS1307
ds_on()- porniți DS1307
ds_init()— inițializarea DS1307
octet IntToBoolInt( octet ) — funcția de conversie a unui număr în formă binară zecimală

În timpul inițializării, următorii biți sunt verificați și setați dacă sunt opriți: bitul responsabil pentru modul de funcționare de 24 de ore al ceasului și bitul responsabil pentru starea de pornire a ceasului. Au fost implementate 2 funcții pentru a activa și dezactiva ceasul. DS1307 poate trimite și primi mesaje atât pe un singur octet, cât și pe mai mulți octeți, dar pentru a simplifica lucrul cu ceasul, funcțiile pentru citire și scriere sunt doar pe un singur octet. Pentru a seta ceasul, există și o funcție de conversie a formei zecimale obișnuite de reprezentare a unui număr în zecimală binară, în care microcircuitul stochează indicatorii de timp. Funcțiile date pentru lucrul cu ceasul sunt destul de suficiente.

Firmware-ul implementează funcții pentru citirea și afișarea timpului - timp(), datele - data(). Într-o buclă nesfârșită, aceste funcții sunt apelate la anumite intervale pentru a afișa ora și data pe afișaj. Să vedem cum funcționează funcția de citire și apoi de ieșire a orei curente:

Void time() ( unsigned char i; SetLCDPotion(1, 0); i=ds_read(0x02); buffer = i/16+"0"; buffer = i%16+"0"; buffer = ":"; i =ds_read(0x01); buffer = i%16+"0"; tampon)

Cursorul este poziționat pe afișaj. Citim valoarea registrului responsabil pentru ora si jumatate de octet, deoarece Datele sunt stocate în formă zecimală binară și sunt scrise într-un buffer. Apoi, adăugați un separator de două puncte. Citim și scriem în buffer în același mod valorile minutelor și secundelor. Afișăm conținutul buffer-ului pe afișaj. Funcția de afișare a datei curente este concepută în același mod.

Firmware-ul are o funcție pentru setarea orelor și minutelor - set_time(). Această funcție setează ora cu un singur buton. Cum se face acest lucru: apăsați butonul - afișajul arată inscripția „Setați ora:” și numărul de ore, măriți ora apăsând scurt butonul; După setarea orei cu o apăsare lungă, trecem la setarea minutelor, dovadă fiind inscripția „Set min:”, în același mod setăm minutele, iar cu o apăsare lungă revenim la bucla nesfârșită a orelor. . Dar pentru că Această funcție este mare, prezentăm doar o linie din ea, care scrie valoarea minutelor în DS1307:

Ds_write(0x02,IntToBoolInt(time));

Scriem valoarea dorită, convertită anterior în formă zecimală binară, în registrul care corespunde minutelor.

Calculul timpului real în secunde, minute, ore, date ale lunii, luni, zile ale săptămânii și ani, ținând cont de înălțimea anului curent până la 2100.

56 de octeți de memorie RAM nevolatilă pentru stocarea datelor

Interfață serială cu 2 fire

Generator de impulsuri pătrate programabil. Poate ieși la 1 Hz, 4,096 kHz, 8,192 kHz și 32,768 kHz.

Detectarea automată a opririi sursei principale de alimentare și conectarea celei de rezervă

Mod 24 de ore și 12 ore

Consum nu mai mult de 500 nA atunci când este alimentat de o baterie de rezervă la o temperatură de 25C°

Microcircuitul este disponibil în pachete DIP și SOIC cu opt pini. Pinout-ul este același pentru toată lumea. Mai jos voi furniza rânduri din fișa de date pentru a completa imaginea.

Documentație pentru cip (fișă de date)

Atribuire PIN:

. X1, X2- Servește pentru conectarea unui rezonator cuarț de 32,768 kHz

. Vbat- Intrare pentru orice baterie standard cu litiu de trei volți sau altă sursă de alimentare. Pentru funcţionare normală DS1307 necesită ca tensiunea bateriei să fie în intervalul 2,0 ... 3,5 V. Baterie cu litiu cu o capacitate de 48 mAh sau mai mult va suporta DS1307 în absența puterii
mai mult de 10 ani la o temperatură de 25°C.

. GND- minus general

. Vcc- Aceasta este o intrare de +5V Când tensiunea de alimentare este peste 1,25 * VBAT, dispozitivul este complet activat și datele pot fi citite și scrise. Când o baterie de 3V este conectată la dispozitiv și Vcc este mai mic de 1,25 * VBAT, citirea și scrierea sunt interzise, ​​dar funcția de sincronizare continuă să funcționeze. Odată ce Vcc scade sub VBAT, RAM și RTC trec la alimentarea bateriei VBAT.

. necesare pentru a seta frecvența impulsurilor dreptunghiulare de ieșire pe picior- Semnal de ieșire cu impulsuri dreptunghiulare.

. SCL- (Serial Clock Input - serial clock input) - folosit pentru sincronizarea datelor prin interfața serială.

. S.D.A.- (Serial Data Input/Output) - pin de intrare/ieșire pentru o interfață serială cu două fire.

Lucrul cu SQW/OUT Pin.

Mai întâi, să ne uităm la structura de registru a DS1307.

Structura de registru a cipului DS1307

Ne interesează „Registrul de control” aflat la adresa 0x7, deoarece determină funcționarea pinului SQW/OUT.

Dacă bitul SQWE = 1, atunci începe formarea impulsurilor dreptunghiulare, dacă SQWE = 0, atunci ieșirea ieșirii va fi valoarea bitului OUT.

Biții RS0 și RS1 sunt responsabili pentru frecvența pulsului, și anume:

RS0 RS1 Frecvenţă
0 0 1 Hz
0 1 4,096 kHz
1 0 8,192 kHz
1 1 32,768 kHz

Iată un exemplu:

Dacă trebuie să începem să generăm impulsuri dreptunghiulare cu o frecvență de 1 Hz, atunci trebuie să trimitem octetul 00010000 sau 0x10 în sistemul numeric hexazecimal la registrul 0x7 al microcircuitului, care are adresa 0x68.

Folosind biblioteca Sârmă.h, se poate face după cum urmează:

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

Conexiune la Arduino:

Pinii responsabili pentru interfața I2C de pe plăcile Arduino bazate pe diferite controlere variază.

Biblioteci necesare:

pentru lucrul cu DS1307: http://www.pjrc.com/teensy/td_libs_DS1307RTC.html
pentru lucrul cu timpul: http://www.pjrc.com/teensy/td_libs_Time.html

Setarea orei

. Manual în cod

Ora este setată manual în codul programului și completată Placa Arduino. Această metodă nu cea mai precisă pentru că Timpii de compilare și de încărcare pot varia.

Exemplu de cod

#include Mai întâi inițializam variabilele, apoi apelăm funcția. După ce îl apelați, puteți opera în siguranță cu timpul, care va fi scris în variabile. gol înființat () { Serial.begin(9600); Serial ) ; în timp ce (! // Numai pentru tabla Leonardo Serial // obțineți timp de la RTC//sincronizarea a eșuat Serial altfel .println("RTC a setat ora sistemului");//instalează manual 16/02/2016 12:53 TimeElementste; time_t timeVal = makeTime(te); RTC .set(timeVal); setTime(timeVal); ) gol Serial Serial buclă Serial() ( digitalClockDisplay(); //întârziere de ieșire (1000); ) void digitalClockDisplay() ( Serial buclă Serial.print(" "); Serial buclă Serial.print(ziua()); Serial .print(luna()); Serial.print(an());< 10) Serial//timpul de ieșire prin „:” Serial.imprimare(":"); dacă (cifre

.print("0");.print(cifre); )

. Instalare de la

„Monitor port”

Exemplu de cod

Opțiune de setare a timpului mai precisă. Ora este setată prin intermediul „monitorului portului” pe măsură ce controlerul funcționează. Deschidem monitorul, introducem datele în formatul necesar, ne uităm la ceasul de referință, profităm de momentul și facem clic pe „trimite”. //format pentru indicarea orei curente „ZZ.LL.AA hh:mm:ss” Mai întâi inițializam variabilele, apoi apelăm funcția. După ce îl apelați, puteți opera în siguranță cu timpul, care va fi scris în variabile. Mai întâi inițializam variabilele, apoi apelăm funcția. După ce îl apelați, puteți opera în siguranță cu timpul, care va fi scris în variabile. //unde DD este ziua, MM este luna, YY este anul, hh este ore, mm este minute, ss este secunde //YY - de la 00 la 99 pentru 2000-2099 gol înființat () { Serial.begin(9600); Serial ) ; în timp ce (! bool isTimeSet = false ; // Numai pentru tabla Leonardo//steagul indicând dacă data a fost deja setată Serial setSyncProvider(RTC.get); // obțineți timp de la RTC//sincronizarea a eșuat Serial if (timeStatus() != timeSet) RTC .set(timeVal);.println(„Nu se poate sincroniza cu RTC”); Serial.println("RTC a setat ora sistemului"); ) gol () (dacă (.disponibil()) ( Serial//o comandă a fost primită în timp setTimeFromFormatString(.readStringUntil("\n" )); isTimeSet = adevărat;//data a fost stabilită Serial) dacă (esteTimeSet) Serial buclă Serial() ( digitalClockDisplay(); //întârziere de ieșire (1000); ) void digitalClockDisplay() ( Serial buclă Serial.print(" "); Serial buclă Serial.print(ziua()); Serial//dacă a fost specificată data .print(luna()); Serial.print(an());< 10) Serial//timpul de ieșire prin „:” Serial( digitalClockDisplay(); //afișare timp) întârziere (1000); ) void digitalClockDisplay() ( .print(ora()); printDigits(minut()); printDigits(second());.println(); ) void printDigits(int digits) (

Ceasul serial în timp real DS1307 este un ceas calendar BCD complet de putere redusă care încorporează 56 de octeți de SRAM nevolatil. Adresele și datele sunt transmise în serie printr-o magistrală bidirecțională cu două fire. Ceasul calendaristic numără secunde, minute, ore, ziua, data, luna și anul. Ultima dată a lunii este ajustată automat pentru lunile cu mai puțin de 31 de zile, inclusiv ajustările anului bisect. Ceasul funcționează atât în ​​modul de 24 de ore, cât și în modul de 12 ore, cu un indicator AM/PM. DS1307 are încorporat un circuit de monitorizare a puterii care detectează întreruperile de curent și trece automat la alimentarea bateriei.

Funcționarea microcircuitului.

DS1307 funcționează ca un dispozitiv slave pe magistrala serial. Se accesează setând condiția START și trimițând dispozitivului un cod de identificare urmat de adresa de înregistrare. Următoarele registre sunt accesate secvenţial până când condiţia STOP este îndeplinită.
Dacă V CC scade sub 1,25*V BAT, DS1307 întrerupe procesul de acces și resetează contorul de adrese, iar în acest moment semnale externe nu sunt acceptate (pentru a preveni scrierea datelor eronate).
Dacă V CC scade sub V BAT, DS1307 comută în modul de suport pentru baterie cu curent scăzut.
La pornire, DS1307 trece de la baterie la Vcc atunci când Vcc depășește V BAT + 0,2 V. Semnalele de intrare încep să fie percepute atunci când Vcc depășește 1,25*V BAT.
Descărcați descrierea în limba rusă Descărcat de 3077 ori

Descărcați documentația originală