A intra
Toate secretele computerului pentru începători și profesioniști
  • Galeriile moderne. Galeria Regelui
  • Top 9 jocuri de societate pentru companii De ce avem nevoie de astfel de jocuri?
  • Descărcați versiunea extinsă protanki modpack pentru modurile necesare în luptă
  • Codurile promoționale Papa John pentru septembrie
  • Technopoint mobil. Despre companie. Lanțul de retail are și dezavantajele sale.
  • Hack League of Angels pe resurse pentru Android și iOS
  • Sincronizăm ora de pe modulul DS3231 cu computerul. Diagrama de conectare pentru ceasul în timp real DS3231 și un program simplu

    Sincronizăm ora de pe modulul DS3231 cu computerul.  Diagrama de conectare pentru ceasul în timp real DS3231 și un program simplu

    ". Să facem cunoștință cu modulul de ceas în timp real DS3231. Articolul conține instrucțiuni video, liste de programe, scopul și metodele de conectare a modulelor din familia DS la Arduino.

    Modul de ceas în timp real DS3231

    Ce este modulul de ceas în timp real DS3231?

    Modul ceas în timp real- acesta este un circuit electronic destinat înregistrării datelor cronometrice (ora curentă, data, ziua săptămânii etc.), și este un sistem format dintr-o sursă de alimentare autonomă și un dispozitiv de înregistrare.

    modul DS3231 Este în esență un ceas obișnuit. Plăcile Arduino au deja un senzor de timp încorporat Millis, cu toate acestea, funcționează numai atunci când este aplicată puterea plăcii. Dacă opriți și apoi porniți Arduino, timpul Millis va fi resetat la zero. Și DS3231 are o baterie la bord, care, chiar și atunci când placa Arduino este deconectată, continuă să „alimenteze” modulul, permițându-i să măsoare timpul.

    Modulul poate fi folosit ca ceas sau ceas cu alarmă bazat pe plăci Arduino. Sau ca alertă pentru diverse sisteme, de exemplu într-o casă inteligentă.

    Specificații DS3231:

    • modulul calculează ore, minute, secunde, date, luni, ani (se iau în calcul anii bisecți până în 2100);
    • Pentru a vă conecta la diferite dispozitive, ceasul este conectat printr-o interfață I2C.

    32K— Ieșire proiectată pentru a furniza energie externă >12V.

    S.Q.W.— Ieșire de semnal cu undă pătrată programabilă.

    SCL– Prin acest pin, datele sunt schimbate cu ceasul prin interfața I2C.

    S.D.A.– Datele de la ceas sunt transmise prin acest pin.

    VCC– Alimentare pentru ceas în timp real, necesar 5 volți. Dacă nu există tensiune furnizată acestui pin, ceasul intră în modul de repaus.

    GND- Pământ.

    Diagrama de conectare pentru ceasul în timp real DS3231 și un program simplu

    Pini SDA și SCL pe diferite plăci Arduino:

    S.D.A. SCL
    O.N.U. A4 A5
    Mini A4 A5
    Nano A4 A5
    Mega2560 20 21
    Leonardo 2 3

    Să conectăm modulul de ceas în timp real la Arduino UNO. SDA - pin A4, SCL - pin A5.

    Următorul program este potrivit pentru ca modelul să funcționeze (puteți copia pur și simplu programul în Arduino IDE):

    #include

    void setup() (
    întârziere (300);
    Serial.begin(9600);
    time.begin();
    }
    buclă goală ()



    }
    }

    În această schiță, timpul pur și simplu se numără invers.

    În primul rând, în sktech, conectați biblioteca iarduino_RTC.h.

    Acolo, indicați numele exact al modulului pentru a lucra corect cu acesta.

    Ca rezultat, obținem ieșirea de timp de la modulul DS3231 la monitorul portului. Sunt afișate ore, minute, secunde.

    În următoarea schiță vom adăuga o funcție potriveste ora, care vă permite să setați timpul inițial de numărătoare inversă.

    #include
    iarduino_RTC time(RTC_DS3231);
    void setup() (
    întârziere (300);
    Serial.begin(9600);
    time.begin();
    time.settime(0,0,18,24,04,17,1); // 0 sec, 0 min, 18 ore, 24 aprilie 2017, luni
    }
    buclă goală ()
    if(millis()%1000==0)( // dacă a trecut 1 secundă
    Serial.println(time.gettime("d-m-Y, H:i:s, D")); // afișează ora
    întârziere(1); // face o pauză de 1 ms pentru a nu afișa timpul de mai multe ori în 1 ms
    }
    }

    În exemplu, timpul începe să conteze de la 0 sec, 0 min, ora 18, 24 aprilie 2017, luni.

    Postări de lecție:

    1. Prima lectie: .
    2. A doua lecție: .
    3. A treia lecție: .
    4. A patra lecție: .
    5. A cincea lecție: .
    6. Lecția a șasea: .
    7. A șaptea lecție: .
    8. A opta lecție: .
    9. A noua lecție:

    Descriere

    Modul de ceas în timp real cu alimentare independentă. Controlerele Arduino/Genuino nu au un ceas în timp real încorporat. Pentru a lucra cu timpul, există funcția millis(). Cu toate acestea, pentru proiectele în care sunt necesare ora și data, capacitățile acestei funcții nu sunt suficiente și un ceas în timp real vine în ajutor.

    Modulul DS3231 este un ceas I2C în timp real, cu cost redus, precis, cu compensare de temperatură TCXO. Dispozitivul conține un conector pentru o baterie CR2032 și menține cronometrarea exactă atunci când alimentarea dispozitivului este întreruptă. Ceasul acceptă informații despre secunde, minute, ore, zi, lună și an. Data de sfârșit de lună este ajustată automat pentru lunile care conțin mai puțin de 31 de zile, inclusiv ajustarea pentru anul bisect. Acestea funcționează în unul dintre modurile: format de 24 sau 12 ore (cu indicator AM/PM). Au două alarme programabile.

    Principalele caracteristici ale ceasului:

      Ceas în timp real cu numărătoarea secundelor, minutelor, orelor, zilei, lunii și anului (cu ajustări ale datei, inclusiv anii bisecți până la 2100)

      Eroare de călătorie: ±2 minute pe an

      Senzor de temperatură cu o eroare de ±3°С

      Două ceasuri cu alarmă

    Specificații

      Temperatura de funcționare: -40°С - +85°С

      Tensiune de alimentare: 2,3 - 5,5 V

      Tensiune de alimentare a bateriei: 2,3 - 5,5 V

      Consum maxim de curent: 650 nA

    Dimensiuni fizice

      Modul (L x l x H): 45 x 23 x 15 mm

    Avantaje de utilizare

      Precizie mare a ceasului

      Există două ceasuri cu alarmă cu funcție de întrerupere

      Gamă largă de temperatură de funcționare

    Dezavantaje de utilizare

      Mai scump decât unii analogi

    Biblioteca pentru lucrul cu modulul

    Exemple de conectare și utilizare

    Exemplul 1: Exemplul ilustrează conectarea unui modul de ceas la controler, setarea orei și datei pe ceas, transmiterea orei, datei și zilei săptămânii către monitorul portului serial, precum și primirea temperaturii de la modulul curent. (Exemplele au fost testate pe controlerul Smart UNO)

    Schema de conectare:

    Schiță de descărcat:

    //Conectarea bibliotecilor#include #include „DS3231.h” DS3231 RTC; //Creează obiectul DS3231 char weekDay [ 4 ] = ( „Sum” , „Luni” , „Tue” , ​​​Mier” , „Jo” , „Fri” , „Sat” ) ; //Crearea unei serii de zile ale săptămânii //Crearea unei variabile de tip DateTime pentru a seta data în formatul: //an, luna, zi, ora, minut, secunda si ziua saptamanii (de la 0 - duminica la 6 - sambata) DateTime dt(2016, 8, 22, 16, 10, 0, 1); void setup () ( Serial . begin ( 9600 ) ; //inițializarea portului serial Wire.begin(); //inițializați biblioteca Wire RTC.begin(); //inițializați ceasul RTC.ajustare (dt); //Setați data-ora așa cum este specificată în variabila dt) bucla void () ( DateTime acum = RTC.now () ; //obținerea datei și orei curente //iesire anul primit Serial.print(acum.an(), DEC); Serial.print("/"); //se iese luna Serial .print (acum.lună () , DEC) ; Serial.print("/"); //zi Serial .print (acum.data () , DEC) ; Serial.print(" "); //oră Serial .print (acum.ora () , DEC) ; Serial.print(":"); //minute Serial .print (acum.minut () , DEC) ; Serial.print(":"); //secunde Serial .print (acum.second () , DEC) ; Serial.println(); //ziua săptămânii Serial .print (weekDay[ now.dayOfWeek () ] ) ; Serial.println(); întârziere (1000); //întârziere 1 secundă RTC.convertTemperature(); //conversia temperaturii curente în registre Serial.print(RTC.getTemperature()); //citește registrele și scoate temperatura rezultată Serial.println("C"); întârziere (1000); //întârziere 1 secundă }

    Astăzi vom continua căutarea cipului perfect pentru ceasul în timp real (RTC). Vom face ceasuri bazate pe . Afișajul va fi mai convenabil pentru dezvoltare - un afișaj LCD, care va afișa toate informațiile simultan, cu excepția setărilor. În această formă, ceasul este convenabil de utilizat ca opțiune de desktop.

    Deci, să ne uităm la cipul DS3231 în sine. DS3231 este un ceas în timp real cu mișcare extrem de precisă (producătorii au ales cuvântul) datorită unui rezonator de cuarț încorporat cu compensare de temperatură. Interfața de transfer de date este I 2 C. Acest microcircuit are, de asemenea, o intrare pentru tensiunea bateriei de rezervă atunci când alimentarea principală este oprită, microcircuitul trece automat la funcționare de la bateria de rezervă, precizia funcționării de la bateria de rezervă nu este; afectat. Este foarte plăcut, nu-i așa? DS3231 acceptă numărarea secundelor, minutelor, ore, zile ale lunii (data), zile ale săptămânii, luni și ani (inclusiv anul bisect pentru luni). Acceptă lucrul în format de 12 și 24 de ore. Există 2 ceasuri cu alarmă cu posibilitatea de a le configura și de a le monitoriza starea. Reglarea preciziei de compensare a temperaturii. Și, de asemenea, două ieșiri - la 32 kHz (ieșirea este de 32,768 kHz) și o ieșire programabilă de la 1 Hz la 8,192 kHz. Există, de asemenea, un pin de resetare - RST. Cipul de ceas în timp real este disponibil într-un pachet SO-16. Carcasa este destul de mare, dar daca te gandesti ca inauntru deja este cuart, si este si compensat cu temperatura, atunci mi se pare ca totul este in regula cu dimensiunile. DS3231 are un geamăn sub formă de DS3232, care, însă, are încă 2 picioare. Toate acestea amintesc foarte mult de produsele NXP - cipurile de ceas PCA2129 și PCF2129. Rezonator de cuarț încorporat, compensat cu temperatură similar, ambii sunt aceiași gemeni doar cu numere diferite de n.c. pini și funcții similare referitoare la DS3231, în plus față de cronometrarea.

    RTC DS3231 sunt disponibile pentru vânzare sub formă de module cu cablajul necesar, precum și complet cu un cip EEPROM, care cel mai adesea nu este necesar, doar adaugă greutate:

    Pe lângă piesele necesare, pe placa modulului există și un LED, a cărui funcție este de a indica conexiunea de alimentare la bornele. Probabil că l-au livrat doar pentru frumusețe.

    Ceea ce este important de știut atunci când lucrați cu un astfel de cip de ceas în timp real este cum să extrageți date din acesta sau să le scrieți acolo. Ceasul are o interfață I 2 C Pentru a scrie date (și acest lucru este necesar și pentru a citi datele), trebuie să treceți condiția de pornire (aceste comenzi sunt efectuate folosind hardware sau software I 2 C pentru. microcontroler), apoi treceți adresa cipului cu înregistrarea de biți, apoi treceți adresa registrului la care vom accesa și apoi transferați un octet de date în acest registru, dacă apoi transferați un alt octet de date, acesta va fi scrise la următorul registru și așa mai departe. Când ați terminat, trebuie să treceți o condiție de oprire. Reprezentare grafică a celor de mai sus în figură:

    Înregistrarea datelor este necesară pentru configurarea inițială, precum și pentru setarea orei curente. În continuare, trebuie să primim în mod constant date despre ora și data curente. Pentru a face acest lucru, este necesar să citiți din registrele care stochează aceste informații. Citirea constă din două proceduri - setarea unui pointer către registrul dorit și citirea acestuia. Pentru a seta un pointer către registrul dorit, trebuie să treceți condiția de pornire, apoi să treceți adresa cipului cu bitul de scriere și un octet cu adresa registrului. Urmează fie o condiție de oprire și apoi o condiție de pornire, fie doar o repornire. Acum, a doua procedură este citirea directă din registre. Pornirea este transmisă, apoi trebuie să trimiteți adresa microcircuitului cu un bit de citire și apoi să citiți registrele în numărul necesar, iar la finalizare, să transmiteți condiția de oprire. Dacă informațiile din registru au fost citite, pointerul se deplasează automat la următorul registru fără acțiuni inutile din partea microcontrolerului (device master). Figura ilustrează tot ce s-a spus mai sus cu privire la citirea registrelor folosind interfața I 2 C:

    Adresa cipului:

    • pentru înregistrare - 0b11010000
    • pentru citire - 0b11010001

    Codul C va arăta astfel:

    // funcţionează cu ceasul =============================================== =============== ==================================== ================== ======== // inițializarea setărilor inițiale void RTC_init(void)( i2c_start_cond(); // pornirea i2c i2c_send_byte(RTC_adr_write); // transferul adresei dispozitivului, modul de înregistrare i2c_send_byte(0x0E // transferul adresei de memorie i2c_send_byte(0b00100000); // opriți i2c ) // obțineți ora și data void RTC_read_time(void)( i2c_start_cond() ; // porniți i2c_send_byte(RTC_adr_write); // transferați adresa dispozitivului, modul de scriere i2c_stop_cond(); // opriți i2c_send_byte_(RTC_dr_adrte) ; / transmite adresa dispozitivului, modul de citire sec = bcd(i2c_get_byte(0)); / citire ceas, ACK wday = bcd(i2c_get_byte(0)); // citirea zilei săptămânii, ACK day = bcd(i2c_get_byte(0)); // citirea numărului, ACK luna = bcd(i2c_get_byte(0)); // citire luna, ACK year = bcd(i2c_get_byte(1)); // citirea anului, NACK i2c_stop_cond(); // opriți i2c ) // setați timpul void RTC_write_time(unsigned char hour1, unsigned char min1, unsigned char sec1)( i2c_start_cond(); // porniți i2c i2c_send_byte(RTC_adr_write); // transferați adresa dispozitivului, modul de înregistrare i2c_send_byte(); 0x00) ; // transferul adresei de memorie i2c_send_byte(bin(sec1) // 0x00 secunde (este recomandabil să specificați și secunde?) i2c_send_byte(bin(min1) // 0x01 minute i2c_send_byte(hour)); ; clock i2c_stop_cond(); // stop i2c ) // setarea datei void RTC_write_date(unsigned char wday, unsigned char month, unsigned char year)( i2c_start_cond(); // start i2c i2c_send_byte(RTC_write); / transfer adresele dispozitivului, modul de înregistrare i2c_send_byte(0x03 // transfer adresa de memorie i2c_send_byte(bin(wday) // 0x03 ziua săptămânii (duminică - 1, luni 2, miercuri 4, joi 5); Fri 6, Sat 7 ) i2c_send_byte(bin(day)); // 0x04 day month i2c_send_byte(bin(month) // 0x05 month i2c_send_byte(bin(year)); // opri i2c ) // citește temperatura void RTC_read_temper(void)( i2c_start_cond(); // pornește i2c i2c_send_byte(RTC_adr_write); // transferă adresa dispozitivului, modul de scriere i2c_send_byte(0x11); // transferă adresa de memorie pictograma_stop__ (); // stop i2c i2c_start_cond(); / stop i2c t2=(t2/128); // deplasare cu 6 - precizie 0,25 (2 biți) // deplasare cu 7 - precizie 0,5 (1 bit) t2=t2*5;

    Acesta este tot codul sursă folosit pentru a funcționa cu microcircuitul, reglarea vitezei ceasului nu a fost afectată, deoarece ceasul nu a pierdut o secundă în câteva zile.

    Da - o caracteristică grozavă DS3231 este că același cip îndeplinește funcțiile unui termometru (altfel cum să efectueze compensarea temperaturii) și capacitatea de a citi temperatura curentă. Rezoluția maximă a temperaturii este de 0,25 grade Celsius. De asemenea, perioada de actualizare a temperaturii este destul de lungă - aproximativ 1 minut. Da, nu trebuie să-l actualizăm rapid.

    Diagrama întregii structuri a ceasului arată astfel:

    Microcontrolerul a fost ales de Atmega8 pentru disponibilitatea sa pe scară largă și prețul scăzut. Acest microcontroler poate fi folosit atât într-un pachet DIP-28, cât și într-o versiune SMD într-un pachet TQFP-32. Rezistorul R3 este necesar pentru a preveni repornirea spontană a microcontrolerului în cazul unui zgomot aleatoriu pe pinul PC6. Rezistorul R3 trage puterea plus la acest pin, creând în mod fiabil un potențial peste el. Pentru afișare este utilizat un afișaj cu cristale lichide (LCD). Am folosit afișajul 2004A - 4 rânduri de 20 de caractere sunt mai mult pentru frumusețe, așa că puteți folosi un afișaj mai familiar - 2 rânduri de 16 caractere. Ecranul LCD este conectat la microcontroler folosind un sistem pe patru biți. Rezistorul variabil R2 este necesar pentru a regla contrastul caracterelor de pe afișaj. Prin rotirea cursorului acestui rezistor obținem cele mai clare citiri de pe ecran pentru noi. Iluminarea de fundal a ecranului LCD este organizată prin pinii „A” și „K” de pe panoul de afișare. Lumina de fundal este aprinsă printr-un rezistor de limitare a curentului - R1. Cu cât valoarea este mai mare, cu atât ecranul va fi iluminat din spate. Cu toate acestea, acest rezistor nu trebuie neglijat pentru a evita deteriorarea luminii de fundal. Butoanele S1 - S4 controlează setările ceasului. LED-ul indică faptul că alarma s-a stins. LED-ul poate fi înlocuit cu un fel de circuit de sunet. Rezistoarele R5 - R8 sunt pull-up și sunt necesare pentru formarea impulsurilor dreptunghiulare la bornele cipului de ceas. Acest lucru este necesar și pentru funcționarea corectă a protocolului I2C. Pentru alimentarea circuitului, se folosește un cip stabilizator liniar L7805, acesta poate fi înlocuit cu un analog domestic al stabilizatorului liniar de cinci volți KR142EN5A sau puteți utiliza un alt cip stabilizator de tensiune în conformitate cu conexiunea acestuia în circuit (de exemplu, LM317 sau stabilizatoare de comutare LM2576, LM2596, MC34063 și așa mai departe). În continuare, 5 volți sunt stabilizați de un alt microcircuit - AMS1117 într-o versiune care oferă o ieșire de 3,3 volți. Cipul de ceas, conform fișei de date, este alimentat de o tensiune de 3,3 volți. Cu toate acestea, tensiunea maximă este de 5,5 volți. Prin urmare, acest stabilizator poate fi folosit sau nu, la discreția dumneavoastră. Stabilizatorul de tensiune AMS1117 poate fi înlocuit și cu versiunea ADJ (AMS1117ADJ) - adică o versiune reglabilă, va trebui să setați tensiunea necesară cu această alegerefolosind două rezistențe conectate la microcircuit în conformitate cu fișa tehnică a acestuia.

    Circuitul a fost asamblat și depanat folosind o placă de dezvoltare pentru microcontrolerul ATmega8:

    Scopul butoanelor:

    • S1 - oprește semnalul de alarmă sau iese în meniul principal din orice meniu de setări
    • S2- resetarea microcontrolerului
    • S3 - modifică ora sau data în meniul de setări
    • S4 - intrați în meniul de setări și derulați prin meniu

    Pinul de 32 kHz poate fi folosit pentru a controla frecvența cristalului. Conectăm un frecvențămetru sau un osciloscop la acest pin și controlăm frecvența:

    După cum se poate observa din captura de ecran a oscilogramei, frecvența corespunde aproximativ la 32,768 kHz (aproximativ din cauza limitărilor în rezoluția măsurătorilor de frecvență și este dificil de determinat atât de precis „cu ochi”).

    Rezultatul a fost un ceas cu următoarele caracteristici:

    • indicarea timpului
    • afișarea datei
    • indicarea zilei săptămânii
    • indicarea activității ceasului cu alarmă
    • 1 ceas deşteptător cu semnal de ieşire de la un microcontroler
    • indicarea temperaturii ambientale (doar temperatura pozitivă este implementată în software; temperatura negativă, cred, nu ne este de nici un folos)
    • setările alarmei
    • setări de timp
    • setări de dată
    • Display LCD cu iluminare de fundal
    • salvarea setărilor și continuarea ceasului când alimentarea principală este oprită

    Să rezumam. Cipul de ceas în timp real DS3231 este o soluție excelentă. Precizia este comparabilă cu unele DS1307 sau mai mari, dar PCA/PCF2129 poate concura în continuare cu el. Dintre cipurile de ceas în timp real pe care le-am examinat, această instanță se află în prezent pe primul loc în ceea ce privește funcționalitatea și acuratețea.

    Pentru a programa microcontrolerul Atmega8, trebuie să cunoașteți configurația biților siguranței (captură de ecran făcută în program):

    Articolul este însoțit de firmware pentru microcontrolerul Atmega8, un design de circuit în program, precum și un videoclip cu ceasul care funcționează (la început alarma se va stinge - LED-ul se va aprinde).

    Lista radioelementelor

    Desemnare Tip Denumire Cantitate NotăMagazinBlocnotesul meu
    IC1 MK AVR pe 8 biți

    ATmega8

    1 La blocnotes
    IC2 Ceas în timp real (RTC)

    DS3231

    1 La blocnotes
    VR1 Regulator liniar

    L7805AB

    1 La blocnotes
    VR2 Regulator liniar

    AMS1117-3.3

    1 La blocnotes
    VD1 Dioda redresoare

    1N4148

    1 La blocnotes
    C1 470 µF1 La blocnotes
    C2, C3, C5, C7 Condensator100 nF4 La blocnotes
    C4 Condensator electrolitic220 uF1 La blocnotes
    C6, C8 Condensator electrolitic10 uF2 La blocnotes
    R1 Rezistor

    22 ohmi

    1 La blocnotes
    R2 Rezistor trimmer10 kOhm1 3296W-1-103LF

    Cipul DS3231 este un ceas RTC în timp real de înaltă precizie, care are încorporat un oscilator de cuarț compensat de temperatură, rezultând o deviere a timpului de doar ±2 minute pe an. În plus, este implementată o funcție de alarmă și există și o ieșire de întrerupere. Ceasul poate fi achiziționat ca un modul Arduino gata făcut cu elemente de curele și un compartiment pentru baterii.

    Am comandat modulul aici. Diagrama este prezentată în imaginea de mai jos:


    Microcircuitul folosește cel mai utilizat . Acceptă rate de date standard (100 kHz) și înalte (400 kHz). Adresa microcircuitului (7 biți) pe magistrala I2C este 1101000. În plus, modulul are memorie I2C (24C32), neprezentată în diagramă.

    Moduri de putere

    Tensiunea de alimentare a microcircuitului poate fi în intervalul 2,3...5,5V, există două linii de alimentare, pentru o sursă externă (linia Vcc), precum și pentru baterie (Vbat). Tensiunea sursei externe este monitorizată constant, iar când scade sub pragul Vpf=2,5V, trece la linia bateriei. Următorul tabel prezintă condițiile de comutare între liniile de alimentare:

    Precizia ceasului este menținută prin monitorizarea temperaturii ambientale. Microcircuitul începe o procedură internă de reglare a frecvenței generatorului de ceas, cantitatea de reglare este determinată folosind un grafic special de frecvență în funcție de temperatură. Procedura începe după ce este aplicată alimentarea și apoi rulează la fiecare 64 de secunde.

    Pentru a conserva încărcarea, atunci când bateria este conectată (tensiunea este aplicată la linia Vbat), generatorul de ceas nu pornește până când tensiunea pe linia Vcc depășește valoarea de prag Vpf sau adresa corectă a microcircuitului este transmisă prin intermediul interfața I2C. Timpul de pornire a generatorului de ceas este mai mic de o secundă. La aproximativ 2 secunde după ce este aplicată alimentarea (Vcc) sau adresa este primită prin interfața I2C, începe procedura de corecție a frecvenței. Odată ce generatorul de ceas a pornit, acesta continuă să funcționeze atâta timp cât este prezent Vcc sau Vbat. Când sunt pornite pentru prima dată, registrele de dată și oră sunt resetate și au următoarele valori: 01/01/00 – 01 – 00/00/00 (zi/lună/an/ – ziua săptămânii – oră/minute /secunde).

    Consumul de curent atunci când este alimentat de o baterie de 3,63 V este de 3 µA, în absența transmiterii datelor prin interfața I2C. Consumul maxim de curent poate ajunge la 300 µA atunci când se utilizează o sursă de alimentare externă de 5,5 V și o viteză mare de transfer de date I2C.

    Funcție de resetare externă

    Linia RST poate fi utilizată pentru resetare externă și are, de asemenea, o funcție de alarmă de joasă tensiune. Linia este trasă în sus printr-un rezistor intern; Pentru a utiliza funcția de resetare externă, un buton poate fi conectat între linia RST și firul comun, microcircuitul are protecție la contact. Funcția de alarmă este activată atunci când tensiunea de alimentare Vcc scade sub valoarea de prag Vpf, în timp ce linia RST este setată la un nivel logic scăzut.

    Descrierea registrelor DS3231

    Tabelul de mai jos prezintă o listă de registre de ceas în timp real:

    AbordareD7D6D5D4D3D2D1D0FuncţieLimite
    0x000 10 secundesecundesecunde00-59
    0x010 10 minuteminuteminute00-59
    0x020 12/24 AM PM10 oreOraCeas1-12 + AM/PM sau 00-23
    10 ore
    0x030 0 0 0 0 ZiZi a săptămânii1-7
    0x040 0 al 10-leaNumărData01-31
    0x05Secol0 0 10 luniLunăLuni/secol01-12 + Secolul
    0x0610 aniAnAni00-99
    0x07A1M110 secundesecundeSecunde, prima alarmă00-59
    0x08A1M210 minuteminuteMinute, prima alarma00-59
    0x09A1M312/24 AM PM10 oreOraCeas, prima alarma1-12 + AM/PM sau 00-23
    10 ore
    0x0AA1M4DY/DTal 10-leaZiZiua săptămânii, prima alarmă1-7
    NumărData, prima alarmă01-31
    0x0BA2M210 minuteminuteMinute, a 2-a alarmă00-59
    0x0CA2M312/24 AM PM10 oreOraCeas, a doua alarmă1-12 + AM/PM sau 00-23
    10 ore
    0x0DA2M4DY/DTal 10-leaZiZiua săptămânii, a doua alarmă1-7
    NumărData, a 2-a alarmă01-31
    0x0EEOSCBBSQWCONVRS2RS1INTCNA2IEA1IERegistrul de setări (Control)
    0x0FO.S.F.0 0 0 EN32kHzBSYA2FA1FRegistrul de stare
    0x10SEMNDATEDATEDATEDATEDATEDATEDATERegistrul de compensare a vechimii
    0x11SEMNDATEDATEDATEDATEDATEDATEDATERegistrul de temperatură, octet mare
    0x12DATEDATE0 0 0 0 0 0 Registrul de temperatură, octet scăzut

    Informațiile de timp sunt stocate în format zecimal binar, adică fiecare cifră a unui număr zecimal (de la 0 la 9) este reprezentată ca un grup de 4 biți. În cazul unui octet, nibble-ul mic numără cei, nibble-ul mare numără zeci, etc. Timpul este numărat în registre cu adrese 0x00-0x06, puteți selecta modul 12 sau 24 de ore; Setarea celui de-al 6-lea bit al registrului de ceas (adresa 0x02) setează modul de 12 ore, în care al 5-lea bit indică ora din zi, valoarea 1 corespunde după-amiezii (PM), valoarea 0 corespunde după-amiezii (AM). Valoarea zero a celui de-al 6-lea bit corespunde modului de 24 de ore, aici al 5-lea bit este implicat în numărarea orelor (valori 20-23).

    Registrul zilei săptămânii este incrementat la miezul nopții, numărând de la 1 la 7, registrul lunii (adresa 0x05) conține bitul Century (al 7-lea bit), care comută atunci când registrul de numărare a anilor (adresa 0x06) depășește, de la 99 la 00 .

    Cipul DS3231 implementează două ceasuri cu alarmă, primul ceas alarmă este configurat folosind registre cu adrese 0x07-0x0A, al doilea ceas alarmă este configurat folosind registrele 0x0B-0x0D. Biții A1Mx și A2Mx pot fi utilizați pentru a configura diverse moduri pentru alarme. Setarea bitului exclude registrul corespunzător din operația de comparare. Tabelele de mai jos arată combinațiile de biți pentru diferite moduri de alarmă:

    Combinațiile de biți nespecificate în tabele conduc la funcționarea incorectă a alarmelor. Dacă bitul DY/DT este șters, atunci potrivirea datei (ziua lunii) este monitorizată pentru ceasul cu alarmă când este setat bitul DY/DT, se verifică potrivirea zilei săptămânii.

    Majoritatea funcțiilor sunt configurate în registrul de control. Bitul EOSC controlează pornirea generatorului de ceas, resetarea bitului pornește generatorul de ceas. Setarea bitului oprește generatorul, numai pentru modul baterie (Vbat). Când este alimentat de la o sursă externă (Vcc), oscilatorul funcționează întotdeauna, indiferent de starea bitului EOSC. Când este activată, valoarea implicită a bitului este 0.

    Setarea bitului BBSQW permite ieșirii INT/SQW (al treilea pin) să funcționeze în modul de alimentare cu baterie, în absența unei surse externe. Când bitul este setat la zero, ieșirea INT/SQW intră în starea 3 (dezactivată) dacă tensiunea sursei externe Vcc scade sub valoarea de prag Vpf. După ce este aplicată alimentarea, valoarea implicită a bitului este 0.

    Bitul CONV este responsabil pentru măsurarea forțată a temperaturii; setarea bitului începe procesul de conversie, în timpul căruia se reglează și frecvența generatorului de ceas, rezultatul măsurării este localizat în registrele cu adrese 0x11, 0x12. Pornirea este posibilă numai dacă conversia anterioară a fost finalizată înainte de a începe, trebuie să verificați indicatorul de ocupat BSY. Conversia forțată a temperaturii nu afectează ciclul intern de reglare a frecvenței de 64 de secunde. Setarea bitului CONV nu afectează indicatorul BSY timp de 2 ms. Biții CONV și BSY sunt șterși automat după finalizarea conversiei.

    Biții RS2, RS1 setează frecvența impulsurilor dreptunghiulare (undă pătrată) la ieșirea INT/SQW. În mod implicit, când sunt activați, biții sunt setați la 1. Tabelul de mai jos arată combinațiile posibile de biți:

    Bitul INTCN controlează ieșirea INT/SQW. Dacă bitul este resetat, la ieșire apar impulsuri dreptunghiulare (unde pătrate), a căror frecvență este setată de biții RS2, RS1. Când bitul INTCN este setat, ieșirea este utilizată pentru a genera întreruperi de alarmă. În mod implicit, valoarea bitului este 1. Tipul de ieșire este INT/SQW - scurgere deschisă, de aceea este necesar să-l trageți în sus printr-un rezistor la un nivel logic ridicat, nivelul activ este scăzut.

    Setarea biților A1IE, A2IE permite întreruperi la primul și, respectiv, al doilea semnal de alarmă. Resetați biții, dezactivează întreruperile. Valoarea implicită este 0.

    Registrul de stare conține steaguri de eveniment și controlează ieșirea de 32 kHz. Steagul OSF reflectă starea generatorului de ceas, o valoare de 1 înseamnă că generatorul de ceas este oprit, acest eveniment poate apărea în următoarele cazuri:

    • Pentru prima dată după aplicarea alimentării
    • Bateria sau tensiunea externă sunt insuficiente pentru a opera generatorul de ceas
    • Generatorul este oprit prin setarea bitului EOSC în modul baterie
    • Factori externi care afectează oscilatorul cu cristal (zgomot, scurgeri etc.)

    Odată setat, valoarea bitului nu se modifică;

    Setarea bitului EN32kHz permite generarea de impulsuri dreptunghiulare (unde pătrate) la ieșirea de 32kHz (primul pin), frecvența pulsului este fixă ​​și egală cu 32,768 kHz. Resetarea bitului dezactivează această funcție și mută ieșirea la a treia stare (impedanță de intrare mare). În mod implicit, valoarea bitului este 1 după ce este aplicată puterea, la ieșire apar impulsuri. Tipul de ieșire este de scurgere deschisă de 32 kHz, deci necesită o tragere la un nivel logic ridicat.

    Indicatorul de ocupat BSY este setat în timpul procesului de conversie a temperaturii și de reglare a ceasului. Indicatorul este resetat când conversia este finalizată.

    Indicatoarele ceasului cu alarmă A1F, A2F sunt setate atunci când valorile registrelor de numărare a timpului și ale ceasului cu alarmă se potrivesc. Dacă sunt activate întreruperile de la alarmele A1IE, A2IE și este atribuită o ieșire de întrerupere (bitul INTCN este setat), atunci la ieșirea INT/SQW apare un semnal de întrerupere (tranziție de la nivelul logic înalt la nivelul scăzut). Steagurile trebuie resetate manual prin scrierea valorii 0.

    Registrul Aging Offset este conceput pentru a regla frecvența generatorului de ceas. Valoarea registrului este adăugată frecvenței oscilatorului în timpul procedurii de reglare internă, dacă este detectată o schimbare de temperatură și, de asemenea, atunci când conversia temperaturii este declanșată de bitul CONV. Valoarea offset este semnată, adică valorile pozitive (1-127) reduc frecvența, valorile negative (128-255) o măresc. Pentru același offset, schimbarea frecvenței va fi diferită în funcție de temperatură. La +25°C, modificarea frecvenței va fi de 0,1 ppm/LSB.

    Valoarea curentă a temperaturii este stocată în registre cu adrese 0x11 și 0x12, octetul înalt și respectiv cel scăzut, valoarea temperaturii din registre este actualizată periodic. Alinierea la stânga este setată, rezoluția este de 10 biți sau 0,25°C/LSB, adică octetul înalt conține partea întreagă a temperaturii, iar al 6-lea, al 7-lea biți din registrele joase alcătuiesc partea fracțională. În octetul înalt, al 7-lea bit indică semnul temperaturii, de exemplu, valoarea 00011011 01 corespunde unei temperaturi de +27,25 °C, valoarea 11111110 10 corespunde unei temperaturi de -2,5 °C.

    La citirea registrelor de timp, se recomandă utilizarea unui buffer suplimentar, adică citirea mai multor registre deodată, și nu separat, deoarece între operațiunile individuale de citire, registrele de timp își pot modifica valoarea. De asemenea, se recomandă să fie respectată această regulă atunci când scrieți date noi în registrele de cont. Scrierea unei noi valori în registrul de secunde întrerupe ceasul timp de 1 secundă, registrele rămase trebuie rescrise în acest timp.

    Conectarea DS3231 la un microcontroler

    Am conectat ceasul la un microcontroler PIC16F628A și am folosit . Schema de conectare este prezentată mai jos:


    După aplicarea alimentării, pe indicatoare sunt afișate liniuțe (– – – – – –), apoi ceasul este inițializat, valoarea timpului apare pe indicatoare cu o întârziere de 1 secundă, care este necesară pentru pornirea generatorului de ceas. Indicatorii afișează orele, minutele și secundele, separate printr-un punct zecimal, iar formatul orei este de 24 de ore. Folosind butonul „Indicație” SB1, puteți schimba formatul de afișare, unde indicatorii vor afișa temperatura, precum și valoarea orelor și minutelor, separate printr-o virgulă zecimală, care clipește la o frecvență de 2 Hz. Temperatura este afișată fără o parte fracțională, programul citește doar octetul mare de stocare a temperaturii la adresa 0x11.

    Valoarea timpului este citită de la ceas printr-o întrerupere pe linia SQW/INT, care este controlată de primul semnal de alarmă în timpul inițializării ceasului, ceasul de alarmă este setat la un semnal la fiecare secundă; LED-ul HL1 servește ca indicator și clipește la semnalul de întrerupere în fiecare secundă. LED-ul HL2 se aprinde dacă există o eroare în transmiterea datelor prin interfața I2C.

    În plus, am adăugat programului posibilitatea de a seta ceasul folosind butoanele SB2 „Setări”, SB3 „Instalare”. Se intră în modul de configurare prin apăsarea butonului SB2; indicatoarele afișează 00 ore și liniuțe în loc de minute și secunde (00 – – – –). Folosind butonul SB3, setați valoarea orei (creștere cu fiecare apăsare), apoi apăsând butonul SB2 treceți la editarea minutelor în loc de liniuță, vor fi afișate 00 minute; Butonul SB3 setează, de asemenea, valoarea necesară și așa mai departe. După editarea secundelor și apăsarea butonului SB2, ora din ceas este rescrisă, iar ora actualizată este afișată pe indicatori.

    Codul parțial al programului este prezentat mai jos (versiunea completă poate fi descărcată la sfârșitul articolului):

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; #include LIST p=16F628A __CONFIG H"3F10" ;nivel de eroare de configurare microcontroler -302 ;nu se afișează mesaje cu eroarea 302 în listarea Sec equ 0020h ;înregistrează contul auxiliar Sec1 equ 0021h ; Sec2 equ 0022h ; scetbit equ 0024h;registru auxiliar pentru numărarea numărului de biți perem equ 0025h;registru auxiliar pentru recepția/transmisia octetului prin spi, i2c temp equ 0026h;registru de temperatură perem_1 equ 0027h;registru auxiliar pentru convertor binar-zecimal. rezultat equ 0028h ;registru auxiliar BCD dat_ind equ 0029h ;registru de date pentru transmitere prin protocolul spi adr_ind equ 002Ah ;registru de adrese pentru transmitere prin protocolul spi second equ 002Bh ;registru de stocare secunde pentru setarea timpului minut equ 002Ch ;registru de stocare minute pentru setarea orei equ 002Dh ; registru de stocare oră pentru setările de timp adr_i2c equ 002Eh ;registre ale subrutinei de transfer de date a interfeței i2c tmp_i2c equ 002Fh slave_adr equ 0030h data_i2c equ 0031h flag equ 007Fh ;flag registru #BDEF,0031H ;flag REGISTR PORTT #DEF ; INE sda PORTB ,1 ; cercetare SDA pentru conexiuni DS3231 #DEFINE scl PORTB,2 ;linie SCL pentru conectarea DS3231 #DEFINE sda_io TRISB,1 ;direcția liniei SDA #DEFINE scl_io TRISB,2 ;direcția liniei SCL #DEFINE datai PORTB,5 ;linia de introducere a datelor driverului MAX7219 #DEFINE cs PORTB ,6 ;linia de selecție driver MAX7219 #DEFINE clk PORTB,7 ;linia ceas driverului MAX7219 #DEFINE led PORTB,4 ;i2c LED error #DEFINE led_sec PORTB,3 ;clock indicator de progres LED 1Hz #DEFINE regim PORTA,2 ;Buton de indicare - schimbarea modului de afișare #DEFINE nast PORTA,3 ;Buton de setare - intrarea în modul de setare a orei #DEFINE ust PORTA,4 ;Buton de setare - setarea valorii ceasului;;;;; ;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;porniți execuția programului de la adresa 0000h goto Start ;mergeți la eticheta Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Program principal Start movlw b"00000000" ;setarea valorilor latch-urilor de ieșire ale portului A movwf PORTA ; movlw b"01000000" ;setați valorile zăvoarelor de ieșire ale portului B movwf PORTB; movlw b"00000111" ;opriți comparatoarele movwf CMCON ; bsf STATUS,RP0 ;selectați prima bancă movlw b"00000111" ;configurați liniile de intrare/ieșire ale portului B movwf TRISB ;RB0-RB2 - pentru intrare, restul pentru ieșire movlw b"11111111" ;setați intrarea/ linii de ieșire ale portului A movwf TRISA ;toate liniile de intrare bcf STATUS,RP0 ;selectare bancă 0 clrf flag ;resetare flag registru apel init_lcd ;apel subrutina de inițializare a driverului (MAX7219) call viv_not ;simboluri liniuțe de ieșire " ------ " ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;; movlw b"11010000" ;adresa dispozitivului (DS3231) movwf slave_adr ;Scrieți 4 octeți în registrele de primire/transmitere prin i2c;aici este configurată prima alarmă, emitând un bip la fiecare secundă movlw data_i2c ;setați primul registru de primire/transmitere prin i2c ; movlw b"10000000" ;date pentru registrul de secunde al primei alarme movwf INDF ; incf FSR,F ; movlw b"10000000" ;date pentru registrul minutelor primei alarme movwf INDF ; incf FSR,F ; movlw b"10000000" ;date pentru registrul de ceas al primului ceas deşteptător movwf INDF ; incf FSR,F ; movlw b"10000000" ;date pentru registrul de date/zi a săptămânii al primei alarme movwf INDF ; movlw. 4 ;transferă 4 octeți prin i2c movwf tmp_i2c ; movlw 0x07 ;setarea adresei registrului de secunde al primului ceas alarmă movwf adr_i2c ; apel write_i2c ;apelarea subrutinei de scriere prin interfața i2c apel err_prov ;verificarea erorilor de scriere/citire I2C movlw .1 ;transferul primului octet prin i2c movwf tmp_i2c ; movlw 0x0E ;setarea adresei registrului de control movwf adr_i2c ; movlw data_i2c ;setarea primului registru de transmisie/recepție prin i2c movwf FSR ; movlw b"00000101" ;porniți generatorul de ceas, interziceți funcționarea pinului INT/SQW pentru movwf INDF ;modul de alimentare a bateriei, frecvența pulsului la ieșirea INT/SQW este de 1Hz, ;ieșirea INT/SQW este utilizată pentru a genera alarma întrerupe ceasul, ;activează întreruperea ceasului de alarmă primul apel de alarmă write_i2c ;apelarea subrutinei de înregistrare prin apelul interfeței i2c err_prov ;verificarea erorilor de scriere/citire I2C met_2 movlw .1 ;transferul primului octet prin i2c movwf tmp_i2c; movlw 0x0F ;setarea adresei registrului de stare movwf adr_i2c ; movlw data_i2c ;setarea primului registru de transmisie/recepție prin i2c movwf FSR ; movlw b"00000000" ;resetează bitul OSF, interzice generarea de impulsuri la ieșirea EN32kHz, movwf INDF ;resetează semnalizatoarele de întrerupere de alarmă A2F, A1F apel write_i2c ; apelează subrutina de înregistrare prin apelul interfeței i2c pentru err_prov write I2C ; /read erorile met_1 btfsc int ; bsf led_sec ;porniți indicatorul de progres al ceasului LED-ul goto met_4 ; met_3 bcf led_sec ;oprește indicatorul de progres al ceasului LED btfsc nast ;sondează butonul de setare a ceasului goto met_5 ; call nast_time ;apelați subrutina pentru setarea orei goto met_2 ; met_5 btfsc regim ;sondarea butonului mod de indicare goto met_1 ; met_6 call paus_knp ; btfss regim ; goto met_6 ; btfss flag,2 ;schimbați valoarea flagului modului de indicare goto met_7 ; bcf flag,2 ;resetare indicator de indicație, modul de afișare a ceasului goto met_1 ; met_7 bsf flag,2 ;setarea indicatorului de indicare, a temperaturii și a modului de afișare a ceasului mergeți la met_1 ; met_4 movlw .1 ;transmiterea primului octet prin i2c movwf tmp_i2c ; movlw 0x11 ;setarea adresei registrului de temperatură ridicată movwf adr_i2c ; call read_i2c ;apelarea subrutinei de citire prin I2C call err_prov ;verificarea erorilor de scriere/citire I2C movf INDF,W ;copierea valorii temperaturii în registrul temp movwf temp rd_time movlw .3 ;transfer 3 bytes prin i2c movwf tmp_i2c; movlw 0x00 ;setarea adresei registrului secundelor movwf adr_i2c ; call read_i2c ;apelarea subrutinei de citire prin apelul I2C err_prov ;verificarea erorilor de scriere/citire I2C btfsc flag,2 ;sondajul indicatorului modului de indicare goto met_8 ; apel vivod ;apelarea subrutinei pentru afișarea valorii ceasului pe afișajul digital goto met_2 ; met_8 call vivod_temp ;apelarea subrutinei pentru afișarea temperaturii și a ceasului pe afișajul digital trece la met_2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    #include

    CONFIG H"3F10" ;Configurare microcontroler

    errorlevel -302 ;nu afișați mesajele de eroare 302 în listă

    Sec equ 0020h ;registre conturi auxiliare

    Sec1 equ 0021h ;

    Sec2 equ 0022h ;

    scetbit equ 0024h ;numărarea numărului de biți din registrul auxiliar

    perem equ 0025h ;registru de recepție/transmisie octet auxiliar prin spi, i2c

    temp equ 0026h ;registru de temperatură

    perem_1 equ 0027h ;registru auxiliar al convertorului binar-zecimal.

    rezultat equ 0028h ;registru auxiliar BCD

    dat_ind equ 0029h ;registru de date pentru transmitere prin protocolul spi

    adr_ind equ 002Ah ;registru de adrese pentru transmisie prin protocolul spi

    secunde equ 002Bh ;registru de stocare secunde pentru setarea orei

    minut equ 002Ch ;registru de stocare minute pentru setarea orei

    ora equ 002Dh ;registru de stocare pentru setarea orei

    adr_i2c equ 002Eh ;registre ale subrutinei de transfer de date a interfeței i2c

    tmp_i2c equ 002Fh

    slave_adr equ 0030h

    data_i2c equ 0031h

    flag equ 007Fh ;registru steag

    #DEFINE int PORTB,0 ;linie de întrerupere INT/SQW DS3231

    #DEFINE sda PORTB,1 ;Linie SDA pentru conectarea DS3231

    #DEFINE scl PORTB,2 ;Linie SCL pentru conectarea DS3231

    #DEFINE datai PORTB,5 ;linia de intrare a datelor a driverului MAX7219

    #DEFINE cs PORTB,6 ;linia de selecție a driverului MAX7219

    #DEFINE clk PORTB,7 ;linia de ceas a driverului MAX7219

    #DEFINE led PORTB,4 ;LED eroare i2c

    #DEFINE led_sec PORTB,3 ;indicator LED de progres al ceasului 1Hz

    #DEFINE regim PORTA,2 ;Buton de indicare - schimba modul de afisare

    #DEFINE nast PORTA,3 ;Buton Setări - intră în modul de setare a orei

    #DEFINE ust PORTA,4 ;Buton Set - setează valoarea ceasului

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    org 0000h ;porniți execuția programului de la adresa 0000h

    du-te la Start; du-te la eticheta Start

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;Program principal

    Porniți movlw b"00000000"; setați valorile zăvoarelor de ieșire ale portului A

    movlw b"01000000" ;setați valorile zăvoarelor de ieșire ale portului B

    movlw b"00000111" ;opriți comparatoarele

    bsf STATUS,RP0 ;selectați prima bancă

    movlw b"00000111" ;configurarea liniilor de intrare/ieșire ale portului B

    movwf TRISB ;RB0-RB2 - la intrare, restul la ieșire

    movlw b"11111111" ;setarea liniilor de intrare/ieșire ale portului A

    movwf TRISA ;toate liniile de introdus

    bcf STATUS,RP0 ;selectați banca 0

    clrf flag ;resetează registrul steagului

    apelați init_lcd; apelați rutina de inițializare a driverului (MAX7219)

    apelați viv_not ;imiteți simbolurile liniuțe " ------ " la indicatori

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    movlw b"11010000" ;adresa dispozitivului (DS3231)

    ;Scrieți 4 octeți în registrele de recepție/transmitere prin i2c

    movlw data_i2c ;setarea primului registru de primire/transmitere prin i2c

    movlw b"10000000" ;date pentru registrul de secunde al primei alarme

    movlw b"10000000" ;date pentru registrul minutelor primei alarme

    movlw b"10000000" ;date pentru primul registru al ceasului cu alarmă

    movlw b"10000000" ;date pentru registrul de date/zi a săptămânii a primei alarme

    movlw .4 ;transferă 4 octeți prin i2c

    movlw 0x07 ;setarea adresei registrului de secunde al primului ceas cu alarmă

    În multe proiecte Arduino, este necesar să se monitorizeze și să înregistreze timpul de apariție a anumitor evenimente. Modulul ceas în timp real, echipat cu o baterie suplimentară, vă permite să stocați data curentă fără a depinde de disponibilitatea alimentării pe dispozitiv în sine. În acest articol vom vorbi despre cele mai comune module RTC DS1307, DS1302, DS3231 care pot fi folosite cu placa Arduino.

    Modulul de ceas este o placă mică care conține, de regulă, unul dintre microcircuitele DS1307, DS1302, DS3231 În plus, pe placă se găsește practic un mecanism de instalare a bateriei. Astfel de plăci sunt adesea folosite pentru a urmări ora, data, ziua săptămânii și alți parametri cronometrici. Modulele funcționează cu alimentare autonomă - baterii, acumulatori și continuă să conteze chiar dacă alimentarea Arduino este oprită. Cele mai comune modele de ceasuri sunt DS1302, DS1307, DS3231. Acestea se bazează pe un modul RTC (ceas în timp real) conectat la Arduino.

    Ceasurile numără în unități care sunt convenabile pentru o persoană obișnuită - minute, ore, zile ale săptămânii și altele, spre deosebire de contoarele convenționale și generatoarele de ceasuri care citesc „căpușe”. Arduino are o funcție specială millis() care poate citi, de asemenea, diferite intervale de timp. Dar principalul dezavantaj al acestei funcții este că se resetează la zero atunci când temporizatorul este pornit. Cu ajutorul acestuia puteți citi doar ora este imposibil să setați data sau ziua săptămânii. Modulele de ceas în timp real sunt folosite pentru a rezolva această problemă.

    Circuitul electronic include un microcircuit, o sursă de alimentare, un rezonator cu cuarț și rezistențe. Rezonatorul de cuarț funcționează la o frecvență de 32768 Hz, ceea ce este convenabil pentru un contor binar convențional. Circuitul DS3231 are cuarț încorporat și stabilizare termică, ceea ce permite valori foarte precise.

    Comparație dintre modulele RTC populare DS1302, DS1307, DS3231

    În acest tabel am furnizat o listă cu cele mai populare module și principalele lor caracteristici.

    Nume Frecvență Precizie Protocoale acceptate
    DS1307 1 Hz, 4,096 kHz, 8,192 kHz, 32,768 kHz Depinde de cuarț - de obicei valoarea ajunge la 2,5 secunde pe zi, este imposibil să se obțină o precizie mai mare de 1 secundă pe zi. De asemenea, precizia depinde de temperatură. I2C
    DS1302 32,768 kHz 5 secunde pe zi I2C, SPI
    DS3231 Două ieșiri - prima la 32,768 kHz, a doua programabilă de la 1 Hz la 8,192 kHz ±2 ppm la temperaturi de la 0C la 40C.

    ±3,5 ppm la temperaturi de la -40C la 85C.

    Precizia măsurării temperaturii – ±3С

    I2C

    Modulul DS1307

    DS1307 este un modul care este folosit pentru cronometrare. Este asamblat pe baza cipului DS1307ZN, puterea este furnizată de la o baterie cu litiu pentru a asigura funcționarea autonomă pentru o perioadă lungă de timp. Bateria de pe placă este montată pe partea din spate. Modulul are un cip AT24C32 - aceasta este o memorie EEPROM nevolatilă de 32 KB. Ambele microcircuite sunt conectate printr-o magistrală I2C. DS1307 are un consum redus de energie și conține un ceas și un calendar pentru anul 2100.

    Modulul are următorii parametri:

    • Alimentare – 5V;
    • Interval de temperatură de funcționare de la -40C la 85C;
    • 56 de octeți de memorie;
    • baterie cu litiu LIR2032;
    • Implementează modurile de 12 și 24 de ore;
    • Suport pentru interfață I2C.

    Modulul este justificat în cazurile în care datele sunt citite destul de rar, la intervale de o săptămână sau mai mult. Acest lucru vă permite să economisiți energie, deoarece utilizarea neîntreruptă va necesita mai multă tensiune, chiar și cu o baterie. Prezența memoriei vă permite să înregistrați diferiți parametri (de exemplu, măsurarea temperaturii) și să citiți informațiile primite de la modul.

    Interacțiunea cu alte dispozitive și schimbul de informații cu acestea se realizează folosind interfața I2C de la pinii SCL și SDA. Circuitul conține rezistențe care vă permit să furnizați nivelul necesar de semnal. Placa are si un loc special pentru montarea senzorului de temperatura DS18B20. Contactele sunt distribuite in 2 grupuri, pas 2,54 mm. Primul grup de contacte conține următorii pini:

    • DS – iesire pentru senzor DS18B20;
    • SCL – linie de ceas;
    • SDA – linie de date;
    • VCC – 5V;

    Al doilea grup de contacte conține:

    • SQ – 1 MHz;
    • BAT – intrare pentru baterie cu litiu.

    Pentru a vă conecta la placa Arduino, aveți nevoie de placa în sine (în acest caz luăm în considerare Arduino Uno), un modul de ceas în timp real RTC DS1307, fire și un cablu USB.

    Pentru a conecta controlerul la Arduino, se folosesc 4 pini - VCC, masă, SCL, SDA.. VCC de la ceas este conectat la 5V pe Arduino, pământul de la ceas este conectat la masă de la Arduino, SDA - A4, SCL - A5.

    Pentru a începe să lucrați cu modulul de ceas, trebuie să instalați bibliotecile DS1307RTC, TimeLib și Wire. De asemenea, puteți utiliza RTCLib pentru lucru.

    Verificarea modulului RTC

    Când rulați primul cod, programul va citi datele din modul o dată pe secundă. În primul rând, puteți vedea cum se comportă programul dacă scoateți bateria din modul și o înlocuiți cu alta în timp ce placa Arduino nu este conectată la computer. Trebuie să așteptați câteva secunde și să scoateți bateria, eventual ceasul se va reporni. Apoi trebuie să selectați un exemplu din meniul Exemple→RTClib→ds1307. Este important să setați corect viteza de transmisie la 57600 bps.

    Când deschideți fereastra Monitor serial, ar trebui să apară următoarele linii:

    Ora va afișa 0:0:0. Acest lucru se datorează faptului că ceasul își pierde puterea și nu va mai număra timpul. Din acest motiv, bateria nu trebuie scoasă în timp ce modulul funcționează.

    Pentru a seta ora pe modul, trebuie să găsiți linia în schiță

    RTC.adjust(DateTime(__DATE__, __TIME__));

    Această linie va conține date de la computer care este folosit pentru a flash modulul ceasului în timp real. Pentru o funcționare corectă, trebuie mai întâi să verificați dacă data și ora de pe computer sunt corecte și abia apoi să începeți să clipească modulul ceasului. După configurare, monitorul va afișa următoarele date:

    Configurarea se face corect și nu este nevoie să reconfigurați suplimentar ceasul în timp real.

    Citirea timpului. Odată configurat modulul, pot fi trimise solicitări de timp. Acest lucru se face folosind funcția now(), care returnează un obiect DateTime care conține informații despre oră și dată. Există o serie de biblioteci care sunt folosite pentru a citi timpul. De exemplu, RTC.year() și RTC.hour() - obțin separat informații despre an și oră. Când lucrați cu ei, poate apărea o problemă: de exemplu, o solicitare de afișare a orei va fi făcută la 1:19:59. Înainte de a afișa ora 1:20:00, ceasul va afișa ora 1:19:00, adică, în esență, se va pierde un minut. Prin urmare, este recomandabil să folosiți aceste biblioteci în cazurile în care citirea are loc rar - o dată la câteva zile. Există și alte funcții pentru timpul de apel, dar dacă trebuie să reduceți sau să evitați erorile, este mai bine să utilizați now() și să extrageți citirile necesare din acesta.

    Exemplu de proiect cu modul de ceas i2C și afișaj

    Proiectul este un ceas obișnuit; ora exactă va fi afișată pe indicator, iar două puncte dintre numere vor clipi la intervale de o dată pe secundă. Pentru a implementa proiectul, veți avea nevoie de o placă Arduino Uno, un indicator digital, un ceas în timp real (în acest caz, modulul ds1307 descris mai sus), un scut pentru conectare (în acest caz, se folosește Troyka Shield), o baterie pentru ceas și fire.

    Proiectul folosește un indicator simplu de patru cifre pe cipul TM1637. Dispozitivul are o interfață cu două fire și oferă 8 nivele de luminozitate a monitorului. Folosit numai pentru a afișa timpul în format ore:minute. Indicatorul este ușor de utilizat și ușor de conectat. Este benefic de utilizat pentru proiecte în care nu este necesară verificarea datelor pe minute sau pe oră. Pentru a obține informații mai complete despre oră și dată, se folosesc monitoare LCD.

    Modulul de ceas este conectat la pinii SCL/SDA, care aparțin magistralei I2C. De asemenea, trebuie să conectați la pământ și la alimentare. Este conectat la Arduino în același mod ca cel descris mai sus: SDA – A4, SCL – A5, masă de la modul la masă de la Arduino, VCC -5V.

    Indicatorul este conectat simplu - pinii săi CLK și DIO sunt conectați la orice pini digital de pe placă.

    Schiță. Pentru a scrie cod, utilizați funcția de configurare, care vă permite să inițializați ceasul și indicatorul și să înregistrați timpul de compilare. Imprimarea timpului pe ecran se va face folosind bucla.

    #include #include "TM1637.h" #include "DS1307.h" //trebuie să includeți toate bibliotecile necesare pentru a lucra cu ceasul și afișajul. char compileTime = __TIME__; //timpul de compilare. #define DISPLAY_CLK_PIN 10 #define DISPLAY_DIO_PIN 11 //numerele de la ieșirile Arduino la care este conectat ecranul; void setup() ( display.set(); display.init(); //conectați și configurați ecranul. clock.begin(); //porniți ceasul. byte hour = getInt(compileTime, 0); byte minute = getInt( compileTime, 2 byte = getInt(compileTime, 4) //obținere clock.fillByHMS(hour, minute, second); informații în memoria internă, începeți să citiți timpul. = clock.hour % 10; timeDisp = clock.minute / 10; timeDisp = clock.minute % 10; .point(clock.second % 2 ? POINT_ON: POINT_OFF);//activează și dezactivează două puncte după o secundă) char getInt(const char* string, int startIndex) ( return int(string - "0") * 10 + int(șir) - „0”; //acțiuni pentru a scrie corect timpul într-un număr întreg de două cifre. În caz contrar, doar câteva simboluri vor fi afișate pe ecran. )

    După aceasta, schița trebuie încărcată și ora va fi afișată pe monitor.

    Programul ar putea fi ușor modernizat. Când alimentarea este oprită, schița scrisă mai sus va face ca afișajul să arate ora care a fost setată în timpul compilării după pornire. În funcția de configurare, se va calcula de fiecare dată timpul care a trecut de la 00:00:00 până la începutul compilării. Acest hash va fi comparat cu ceea ce este stocat în EEPROM, care este reținut atunci când este întreruptă alimentarea.

    Pentru a scrie și a citi timpul în sau din memoria nevolatilă, trebuie să adăugați funcțiile EEPROMWriteInt și EEPROMReadInt. Sunt necesare pentru a verifica dacă hash-ul se potrivește/nepotrivește cu hash-ul înregistrat în EEPROM.

    Proiectul poate fi îmbunătățit. Dacă utilizați un monitor LCD, puteți realiza un proiect care să afișeze data și ora pe ecran. Conexiunea tuturor elementelor este prezentată în figură.

    Ca rezultat, codul va trebui să specifice o nouă bibliotecă (pentru ecranele cu cristale lichide, acesta este LiquidCrystal) și să adauge linii la funcția loop() pentru a obține data.

    Algoritmul de operare este următorul:

    • Conectarea tuturor componentelor;
    • Verificați - ora și data de pe ecranul monitorului ar trebui să se schimbe în fiecare secundă. Dacă ora de pe ecran este incorectă, trebuie să adăugați la schiță funcția RTC.write (tmElements_t tm). Problemele cu orele incorecte se datorează faptului că modulul de ceas resetează data și ora la 00:00:00 01/01/2000 când este oprit.
    • Funcția de scriere vă permite să obțineți data și ora de la computer, după care parametrii corecti vor fi indicați pe ecran.

    Concluzie

    Modulele de ceas sunt folosite în multe proiecte. Sunt necesare pentru sistemele de înregistrare a datelor, atunci când se creează cronometre și dispozitive de control care funcționează după un program dat, în aparatele de uz casnic. Cu module disponibile pe scară largă și ieftine, puteți crea proiecte precum un ceas cu alarmă sau un senzor de înregistrare de date, înregistrând informații pe un card SD sau afișând ora pe un ecran de afișare. În acest articol, am analizat scenariile tipice de utilizare și opțiunile de conectare pentru cele mai populare tipuri de module.