DS3231 – priključak sata realnog vremena. Sat - dizajner na visokopreciznom (iznimno preciznom I2C) čipu DS3231 SDA i SCL pinovi na različitim Arduino pločama

💖 Sviđa li vam se? Podijelite vezu sa svojim prijateljima

Zašto je sve ovo potrebno?

60 sekundi * 60 minuta * 24 sata * 365 dana = 31 536 000 sekundi godišnje.

Za svaki od tih milijuna, 2 sekunde mogu ići u jednom ili drugom smjeru. Podijelimo 31,5 milijuna s milijun i pomnožimo s 2: dobivamo 63 sekunde godišnje (maksimum). Prihvatljiva opcija? Vrlo. Ali jednom u šest mjeseci uskladio bih vrijeme tako da stane u 1 minutu.

Na koje načine općenito možete postaviti vrijeme na satu modula?

Tradicionalno, počevši od modula DS3107, vrijeme je postavljeno pomoću Arduino skice među primjerima korištenja biblioteke. Algoritam je sljedeći: otvorite skicu, kliknite na “compile and upload” i kada se kontroler prvi put pokrene, postavlja se vrijeme. Ostaje pitanje: u koje vrijeme? Kako Arduino može točno znati koje vrijeme postaviti? I vrlo je jednostavno - vrijeme kompilacije skice. Međutim, vidim nekoliko nedostataka u ovom pristupu:
  • vrijeme kompilacije ovisi o "snazi" računala;
  • vrijeme preuzimanja ovisi o brzini kojom se kompilirana skica prenosi na Arduino ploču;
  • učitana skica je "za jednokratnu upotrebu" (zastarijeva odmah nakon učitavanja na Arduino).
Kako možete "zaobići" ta ograničenja? Pa, na primjer, znajući (eksperimentalno postavljajući) vrijeme kompilacije, možete "potjerati" sat na računalu naprijed do ovog vremena. Zatim pokrenite kompilaciju, bljeskajte ploču i vrijeme će biti postavljeno. Prednost metode je njezina relativna jednostavnost. Nedostaci - relativno nezgodna, relativno neprecizna, jednokratna metoda.

Čega se još možete sjetiti? Možete, primjerice, ručno postaviti potrebno vrijeme u skici, dati gumb koji se može pritisnuti pravi trenutak postavit će određeno vrijeme "ručno", na primjer, 2 minute od trenutnog trenutka: dok se skica "popuni", dok se pripremimo za ručno praćenje vrlo potrebnog trenutka pritiskanja gumba, proći će upravo tih nekoliko minuta . A onda, gledajući na sat na računalu, pričekajte “baš taj” trenutak da pritisnete gumb. Pros - teže prethodna metoda, ali još uvijek relativno jednostavan, ali točniji od prve metode. Nedostaci - ova metoda je još nezgodnija, traje duže i još uvijek je "jednokratna" skica.

Tko je kriv i što učiniti?

Nakon što sam si postavio ova dva retorička pitanja, otišao sam na internet potražiti tko je već napisao sinkronizaciju vremena satnog modula s računalom. A, kao što znate, tko traži uvijek nađe. Našao sam opciju s . U teoriji, sve je jednostavno: obična "batch datoteka" analizira trenutno puno vrijeme dobiveno u "prvoj" metodi (jer osim samog vremena, potreban vam je i datum), povećava vrijeme za 2 sekunde i " pogoni” praznu petlju do trenutka kada stigne ova nova , “plus_two_seconds”, vrijeme za “bacanje” podataka u COM port. Štoviše, vrijeme “novo plus_dvije_sekunde” prati se na drugačiji način (putem %time%, ako nekoga zanima). Ali o "jampovima" takve odluke kasnije. Podatke "izbačene" u COM port analizira Arduino i zatim postavlja vrijeme u modulu. Sve izgleda jednostavno, logično i zgodno. Ali postoji vrlo loša riječ "ALI". Sve ovo kao da je napisao Nijemac, a njegovi regionalni standardi u Windowsima razlikuju se od “naših”, a posebno se razlomak odvaja točkom, a ne zarezom. Kada se pokrene s domaćim regionalnim standardima, batch datoteka ne radi jer je u njoj vrijeme za izlazak iz prazne petlje opisano uvjetom usporedbe s XX:XX:XX.xxx. Pa, trebate staviti zarez umjesto točke - i to je to, "Sve sam popravio." Ali to nije sve (možete provjeriti tko se još sjeća kakvo je zlo programirati u “batch books”). Kartoteku tijela treba ozbiljnije korigirati. I popravio sam to pomoću "podmetača za premotavanje" i "priručnika" za DOS. "Batnik" je to popravio, ali skica i dalje nije radila - vrijeme nije bilo namješteno. Odnosno, podaci su poslani na port, Arduino ih je vidio, ali "nešto je pošlo po zlu."

Pogledajmo što batch datoteka šalje Arduinu iu kojem formatu (za referencu).

Slučaj 83: //S = drugi slučaj 68: //D = Minuta (Daghigheh na perzijskom) slučaj 72: //H = Sat slučaj 84: //T = Dan u mjesecu (Oznaka na njemačkom) slučaj 77: /// M = mjesec padež 74: /// J = godina (Jahr na njemačkom)
Podaci se šalju u formatu S**~D**~H**~T*~M**~J****~, gdje je ~ 2 bajta povratnog reda. Ukupno, 31 bajt. Ne čini se puno, podaci će biti brzo poslani.

Međutim, postoji i neugodnost - kao što vidite, dan u tjednu nije poslan. Samo dan u mjesecu. Bit će problema s implementacijom satova s ​​alarmima koji ovise o danima u tjednu. Dan u tjednu morat će se postaviti "ručno" u skici, što opet upućuje na neku "upotrebljivost" skice, njegovu inferiornost.

Zbrajajući čimbenike - inferiornost skice "iz tvornice", njeno odbijanje da normalno radi, potrebu za ispravljanjem "tjelesne datoteke" za "naše" geografske širine - odlučio sam sve razviti sam. A ako je tako, tada mogu ukloniti nedostatke i optimizirati format podataka.

Softver i hardver.

Da bi sve radilo potrebne su vam 2 komponente: program za Windows i Arduino hardversko-softverska kombinacija.

Prvo, opći podaci o protokolu razmjene. Nakon što sam mogao slobodno odabrati format podataka za slanje, odlučio sam da slanje 31 bajta informacija nije racionalno i smanjio sam prenesene podatke na 4 bajta. Dakle, je li to bilo dovoljno? Što možete stati u 4 bajta? Da, dosta je. Sve što vam treba stane unutra. Siguran sam da su mnogi pogodili što su 4 bajta. Za one koji nisu pogodili, citirat ću fragment članka iz Wikipedije:

UNIX vrijeme (POSIX vrijeme) - sustav za opisivanje trenutaka u vremenu, usvojen u UNIX-u i drugim POSIX-kompatibilnim operativni sustavi. Definirano kao broj sekundi koje su prošle od ponoći (00:00:00 UTC) 1. siječnja 1970. (četvrtak).
UNIX vrijeme predstavljeno je kao cijeli broj koji se povećava sa svakom sekundom bez potrebe za izračunima za određivanje godine, mjeseca, dana, sata ili minute za čitljivost. Moderno UNIX vrijeme je u skladu s UTC - brojanje se odvija u SI sekundama.

Dakle, cijeli broj koji pohranjuje UNIX vrijeme zauzima 4 bajta, što je dovoljno da traje do 2.147.483.648 sekundi. I onda moguće potencijalni problemi. Zašto potencijal? Jer ovo je prag na kojem broj Može biti protumačiti kao negativan (kao i iPhonei mnogih radoznalih drugova u svoje vrijeme). Možda, ali neće se nužno dogoditi - ovisi o tome hoće li programeru ruke rasti s mjesta koje im je priroda dala. Navedeni broj sekundi odgovara 03:14:08 19. siječnja 2038. Do tog vremena možete polako prijeći na 64-bitnu verziju OS-a, gdje će vrijeme biti pohranjeno u 8-bajtnoj varijabli, što će lako trajati sljedećih 292 milijarde godina. Postoji mogućnost da će nam to biti dovoljno za cijeli život. A onda ćete morati nadograditi na 128-bitnu verziju UNIX-a.

Koje sam probleme riješio dolaskom na ovu opciju? Prvo, uvelike je smanjio broj prenesenih bajtova, što povećava točnost postavljanja vremena za milisekunde. Sjajno, zar ne? I drugo: (vjerojatno) sam olakšao kompatibilnost s Linuxom. Na moju sramotu, ne mogu se naviknuti na Linux i uglavnom koristim samo Windows. Mogu napisati program za prosljeđivanje za ovaj isti Windows, ali ne i za Linux. Ali vjerujem da u Linuxu možete mnogo lakše dobiti UNIX vremensku vrijednost nego u Windowsima i poslati taj broj na COM priključak.

Nijedan dodatni Nema potrebe za prijenosom podataka kao što su dan u tjednu i slično. Samo vrijeme UNIX-a. Sve ostalo se radi u Arduinu.

Sada malo specifičnosti izravno o prvi komponenta - program za Windows. Program je napisan u dobrom starom Delphiju. Kada se pokrene, skočni prozor od vas traži da odaberete COM port na koji želite poslati podatke. Izaberimo. Preostale postavke treba ostaviti kao zadane.

Kako program radi? Ponovno se izračunava iz formata vremena Windows podaci za UNIX format, odnosno broj sekundi od ponoći 1. siječnja 1970. godine. Zatim dodaje 3 sekunde i “pada” u praznu petlju (koja očito traje manje od te dodatne 3 sekunde), izlazak iz koje se događa u potrebnom broju sekundi, što je moguće bliže 000 milisekundi. Drugim riječima, prati se pojava samog početka te sekunde vremena, čija se vrijednost mora poslati Arduinu. Slažete se, slanje podataka koji je, na primjer, sada XXXXXXXXX5 sekundi, a zapravo je već, na primjer, XXXXXXXXX5 i 756 tisućinki (na primjer) sekundi, ne bi bilo ispravno. Zbog toga morate pratiti sam početak sekunde da biste započeli prijenos podataka. Nakon prijenosa podataka, program prijateljski javlja status "Gotovo:)". Ovo dovršava misiju programa.


Drugi komponenta - hardver i softver - Arduino. Postoje 2 sorte hardver za ovaj projekt: "puna" verzija sa zaslonom i gumbom i "ogoljena" verzija za brza instalacija vrijeme modula, sastavljeno od "sranja i palica". O njihovim razlikama - u nastavku. "Puna" verzija sastoji se od Arduino Nano, 1602 štita s "adapterom" od I2C do štita, opcionalnog Arduino gumba za resetiranje i zaglavlja pina (ženski) za povezivanje modula sata. Također, po želji, s tijela uređaja s "slatkom" naljepnicom. „Skraćena“ verzija sastoji se od Arduina (Uno, Nano, Pro Mini + „ispravni“ USB adapter s DTR-om) i 4 žice za spajanje modula sata.



Kao što se može vidjeti iz dijagrama, "puna" verzija, osim "skraćene", sadrži gumb za resetiranje i 1602 ekran s "adapterom". Zaslon je potreban samo za prikaz faza procesa, a nakon završetka procesa postavljanja vremena, prikazat će se novo postavljeno vrijeme, datum i dan u tjednu očitavati sa samog modula sata. U "ogoljenoj" verziji, LED dioda ugrađena u Arduino ploču počinje svijetliti sve naznake.

Čemu služi gumb za resetiranje? Za ono što je unutra Puna verzija nakon postavljanja vremena, Arduino će ući beskrajni ciklus prikazivanjem upravo tog novonamještenog vremena, odnosno zapravo će postati sat. Štoviše, to su satovi napravljeni na brzinu, pa stoga ne mogu zamijeniti normalan sat iz nekoliko razloga (odabir sekundi se provodi putem odgode, prikaz vremena će nestati kada se napajanje isključi). Uostalom, cilj je osigurati da je vrijeme točno sinkronizirano, ništa više. Stoga, za sinkronizaciju sljedećeg modula sata, ne možete bez resetiranja (točnije, možete to učiniti ako "iskrivite" USB kabl). Drugim riječima, svrha gumba je čisto utilitarna. Ako želite, možete i bez toga.

Kako flashati Arduino, budući da postoje dvije hardverske verzije, ali samo jedna skica? Da biste kompajlirali "ispravnu" verziju firmvera, morate postaviti željenu vrijednost parametra u zaglavlju skice Puna verzija: pravi za "punu" verziju, odn lažno - za “ogoljeno”. Kompajler će tako odrediti za koju će verziju hardvera prevesti firmware.

Dakle, imamo dijagram povezivanja, trebamo šifru skice. Imajte na umu da je za ispravan rad skice s "punom" verzijom potrebna biblioteka LiquidCrystal I2C autora Franka de Brabandera(instalirano iz repozitorija pomoću Library Managera). Trebamo i knjižnicu za podršku modulu sata, i to ne bilo koju :). Preuzmite ovdje: . Sredili smo knjižnice.

Evo koda za skicu:

//================================================== ====== postavka dostupna za promjenu === ====================================== #define fullVersion true //true = "puna" verzija sa zaslonom; false = "ogoljena" verzija s ugrađenim LED-om //===================================== ============ korištene biblioteke i deklaracija varijabli = ================================ ==== #uključi #uključi #if (puna verzija) #include #endif unsigned long t1 = 0; //varijabla za primljeno vrijeme unsigned long t2 = 0; //varijabla za primljeni vremenski bajt b; //spremnik za primanje podataka s COM porta #if (puna verzija) byte day = 0; #endif DS3231 sat; RTCDateTime dat1; #if (puna verzija) LiquidCrystal_I2C lcd(0x3F,16,2); //Kinezi obožavaju novu adresu za "adaptere" s i2c na ekran #endif //=============================== == ================================================== ===== ===================================== void setup())( #if ( !fullVersion) // relevantno samo za "skraćenu" verziju - početak odjeljka koda pinMode(13, OUTPUT); #endif // relevantno samo za "skraćenu" verziju - kraj sekcija koda clock.begin(); #if (fullVersion) //relevantno samo za "punu" verziju - početak sekcije koda lcd.backlight(); .setCursor(0,0); lcd.print("COMport 9600 8N1"); ; //poruka statusa - spreman za odgodu sinkronizacije (1000); #endif //relevantno samo za "punu" verziju - kraj odjeljka koda) void loop())( if (Serial.available())( / /ako postoji "barut u boci" COM porta Serial.readBytes(b,4); //brojimo sva 4 bajta (ne očekujemo ništa drugo) t1=b; t2=(t1<<24); //поместить значение байта в 4-байтную переменную и передвинуть его на 3 байта влево t1=b; t2+=(t1<<16); //поместить значение байта в 4-байтную переменную и передвинуть его на 2 байта влево t1=b; t2+=(t1<<8); //поместить значение байта в 4-байтную переменную и передвинуть его на 1 байт влево t2+=b; //поместить значение байта в 4-байтную переменную clock.setDateTime(t2); //установить полученное время на DS3231 #if (fullVersion) //актуально только для "полной" версии - начало участка кода lcd.clear(); lcd.setCursor(0,0); lcd.print("Done:) : :"); while (true){ //начало бесконечного цикла по отображению свежеустановленных времени и даты dat1 = clock.getDateTime(); if (dat1.day != day){ day = dat1.day; lcd.setCursor(0,1); if (dat1.day < 10) lcd.print("0"); lcd.print(day); lcd.print("-"); switch (dat1.month){ //выбираем буквенное соответствие месяца по цифре case 1:{ lcd.print("Jan"); break; } case 2:{ lcd.print("Feb"); break; } case 3:{ lcd.print("Mar"); break; } case 4:{ lcd.print("Apr"); break; } case 5:{ lcd.print("May"); break; } case 6:{ lcd.print("Jun"); break; } case 7:{ lcd.print("Jul"); break; } case 8:{ lcd.print("Aug"); break; } case 9:{ lcd.print("Sep"); break; } case 10:{ lcd.print("Oct"); break; } case 11:{ lcd.print("Nov"); break; } case 12:{ lcd.print("Dec"); break; } default:{ lcd.print("???"); break; } }//switch month lcd.print("-"); lcd.print(dat1.year); lcd.print(" "); switch(dat1.dayOfWeek){ //выбираем буквенное соответствие дня недели по цифре case 1:{ lcd.print("Mon"); break; } case 2:{ lcd.print("Tue"); break; } case 3:{ lcd.print("Wed"); break; } case 4:{ lcd.print("Thu"); break; } case 5:{ lcd.print("Fri"); break; } case 6:{ lcd.print("Sat"); break; } case 7:{ lcd.print("Sun"); break; } default:{ lcd.print("???"); break; } }//switch dayOfWeek }//if date changed lcd.setCursor(8,0); if (dat1.hour < 10) lcd.print("0"); lcd.print(dat1.hour); lcd.setCursor(11,0); if (dat1.minute < 10) lcd.print("0"); lcd.print(dat1.minute); lcd.setCursor(14,0); if (dat1.second < 10) lcd.print("0"); lcd.print(dat1.second); delay(995); }//while #else //актуально только для "урезанной" версии - начало участка кода digitalWrite(13, HIGH); delay(3000); digitalWrite(13, LOW); #endif //актуально только для "полной" версии - конец участка кода }//if Serial }//loop


Nekoliko fotografija "pune" verzije gotovog uređaja.


I za kraj, video rada uređaja "u borbi":

Gdje mogu preuzeti skicu i program?

Preuzmite skicu (Dropbox).
Preuzmite program za Windows (Dropbox).

"Prednosti i nedostatci".

Teško je formulirati "za" i "protiv" u ovom slučaju. Prema tome, svatko za sebe odlučuje što je dobro, a što loše.

Ukupno.

Jako mi se svidjelo kako je vrijeme sada postavljeno u modulima! Kada trebam postaviti vrijeme, ne moram se svaki put sjećati koja mi je skica potrebna i razmišljati o tome koliko će točno vrijeme biti postavljeno u modulu. Štoviše, uskoro će biti recenzija ručnog sata u koji sam ugradio takvu metodu sinkronizacije - toliko mi se svidjela metoda. Nadam se da će nekom od čitatelja ova metoda također biti korisna.

Projekt je besplatan, nekomercijalan. Svatko ima pravo koristiti podatke iz recenzije u bilo koju svrhu osim komercijalne.

Sve najbolje.

Planiram kupiti +48 Dodaj u favorite Svidjela mi se recenzija +60 +114

Modul DS3231 (RTC, ZS-042) je jeftina ploča s izuzetno preciznim satom stvarnog vremena (RTC), s temperaturnom kompenzacijom kristalnog oscilatora i kristala. Modul uključuje litijsku bateriju koja održava nesmetan rad čak i kada je napajanje isključeno. Integrirani generator poboljšava točnost uređaja i smanjuje broj komponenti.

Tehničke specifikacije

Napon napajanja: 3,3V i 5V
Memorijski čip: AT24C32 (32 KB)
Točnost: ±0,432 sek po danu
Frekvencija kvarca: 32,768 kHz
Podržani protokol: I2C
Dimenzije: 38 mm x 22 mm x 15 mm

Opće informacije

Većina mikro krugova, kao što je DS1307, koristi vanjski kvarcni oscilator s frekvencijom od 32 kHz, ali imaju značajan nedostatak: kada se temperatura promijeni, frekvencija kvarca se mijenja, što dovodi do pogreške u vremenu. Ovaj problem je otklonjen u čipu DS3231 koji sadrži kristalni oscilator i temperaturni senzor koji kompenzira promjene temperature tako da vrijeme ostaje točno (po potrebi se podaci o temperaturi mogu očitati). DS3231 čip također podržava informacije o sekundama, minutama, satima, danu u tjednu, datumu, mjesecu i godini, a također prati broj dana u mjesecu i vrši prilagodbe za prijestupne godine. Podržava satove u dva formata: 24 i 12, a moguće je programirati i dva alarma. Modul radi na dvožilnoj I2C sabirnici.


Sada malo o samom modulu, izgrađen je na DS3231N čipu. Sklop otpornika RP1 (4,7 kOhm) potreban je za podizanje 32K, SQW, SCL i SDA linija (usput, ako se koristi nekoliko modula s I2C sabirnicom, potrebno je odlemiti pull-up otpornike na drugim modulima) . Drugi sklop otpornika potreban je za zatezanje vodova A0, A1 i A2; potrebni su za promjenu adrese memorijskog čipa AT24C32N. Otpornik R5 i dioda D1 služe za punjenje baterije; u principu se mogu ukloniti, jer obična baterija SR2032 traje godinama. Također je instaliran memorijski čip AT24C32N, to je kao bonus; nije potrebno za rad sata RTC DS3231N. Otpornik R1 i Power LED signaliziraju da je modul uključen. Kao što je spomenuto, modul radi na I2C sabirnici; te su sabirnice usmjerene na dva konektora J1 i J2; raspored preostalih kontakata može se vidjeti u nastavku. Namjena J1
32K: izlaz, frekvencija 32 kHz
SQW: izlaz
SDA: podatkovna linija (Serial Dfta)
VCC: “+” modul napajanja
GND: “-” napajanje modula Namjena J2
SCL: Serijski sat
SDA: Linija serijskih podataka
VCC: “+” modul napajanja
GND: “-” napajanje modula


Reći ću vam nešto o čipu AT24C32N, ovo je čip s 32k memorije (EEPROM) od proizvođača Atmel, sastavljen u paketu SOIC8, koji radi na dvožičnoj I2C sabirnici. Adresa mikro kruga je 0x57; ako je potrebno, može se lako promijeniti pomoću skakača A0, A1 i A2 (ovo vam omogućuje povećanje broja spojenih mikro krugova AT24C32/64). Budući da čip AT24C32N ima tri adresna ulaza (A0, A1 i A2), koji mogu biti u dva stanja, ili log “1” ili log “0”, osam adresa je dostupno čipu. od 0x50 do 0x57.

Spajanje DS3231 na Arduino

Potrebni dijelovi:
Arduino UNO R3 x 1 kom.
Sat realnog vremena na DS3231, RTC, SPI, AT24C32 x 1 kom.
DuPont žica, 2,54 mm, 20 cm, F-M (žensko - muško) x 1 kom.
USB 2.0 A-B kabel x 1 kom.

veza:
U ovom primjeru koristit ću samo DS3231 modul i Arduino UNO R3, svi će podaci biti prebačeni u “Port Monitoring”. Strujni krug nije kompliciran, potrebne su samo četiri žice, prvo spojimo I2C sabirnicu, SCL u A4 (Arduino UNO) i SDA u A5 (Arduino UNO), preostaje samo spojiti napajanje GND na GND i VCC na 5V (može se pisati od 3.3V), krug je sastavljen, sada moramo pripremiti softverski dio.

Ne postoji biblioteka koja radi s DS3231 u Arduino IDE-u, trebate preuzeti “DS3231” i dodati ga u Arduino razvojno okruženje.

Postavljanje vremena DS3231
Kada ga prvi put uključite potrebno je programirati vrijeme, otvoriti primjer iz DS3231 biblioteke “File” -> “Examples” -> “DS3231” -> “Arduino” -> “DS3231_Serial_Easy”, ili kopirati kod odozdo

/* Testiranje je provedeno na Arduino IDE 1.8.0 Datum testiranja 31.08.2018. */ #uključi // Povežite biblioteku Wire DS3231 rtc(SDA, SCL); // Inicijaliziraj DS3231 void setup() ( Serial.begin(115200); // Postavi serijsku vezu rtc.begin(); // Inicijaliziraj rtc // Postavi vrijeme rtc.setDOW(PETAK); // Postavi dan tjedna rtc. setTime(16, 29, 0); // Postavite vrijeme na 16:29:00 (24-satni format) rtc.setDate(31, 8, 2018); // Postavite datum na 31. kolovoza, 2018) void loop() ( Serial. print(rtc.getDOWStr()); // Pošalji dan-tjedan Serial.print(" "); Serial.print(rtc.getDateStr()); // Pošalji datum Serial .print(" -- "); println(rtc.getTimeStr()); // Odgoda slanja (1000);

Testiranje je provedeno na Arduino IDE 1.8.0

Datum testiranja: 31.08.2018

#uključi // Uključite biblioteku Wire

DS3231 rtc (SDA, SCL); // Inicijaliziraj DS3231

void setup()

Serijski. početak(115200); // Uspostavite serijsku vezu

rtc. početi(); // Inicijaliziraj rtc

// Postavite vrijeme

rtc. setDOW(PETAK); // Postavi dan u tjednu

rtc. setTime(16, 29, 0); // Postavite vrijeme na 16:29:00 (24-satni format)

void petlja()

Serijski. ispis (rtc . getDOWStr () ) ; // Pošalji dan-tjedan

Serijski. ispis (" " );

Serijski. ispis (rtc . getDateStr () ) ; // Pošalji datum

Serijski. ispis (" -- " );

Serijski. println(rtc. getTimeStr()); // Vrijeme slanja

kašnjenje (1000); // Kašnjenje od jedne sekunde

Prenesite skicu na Arduino kontroler i otvorite “Port Monitoring”

Čip DS3231 je RTC sat stvarnog vremena visoke preciznosti koji ima ugrađen kvarcni oscilator s kompenziranom temperaturom, što rezultira vremenskim pomakom od samo ±2 minute godišnje. Dodatno, implementirana je funkcija alarma, a postoji i prekidni izlaz. Sat se može kupiti kao gotov Arduino modul s elementima za vezivanje i pretincem za baterije.

Ovdje sam naručio modul. Dijagram je prikazan na slici ispod:


Mikro krug koristi naširoko korišteni . Podržava standardne (100 kHz) i visoke (400 kHz) brzine prijenosa podataka. Adresa mikro kruga (7 bita) na I2C sabirnici je 1101000. Dodatno, modul ima I2C memoriju (24C32), koja nije prikazana na dijagramu.

Načini napajanja

Napon napajanja mikro kruga može biti u rasponu od 2,3 ... 5,5 V, postoje dvije linije napajanja, za vanjski izvor (Vcc linija) i također za bateriju (Vbat). Napon vanjskog izvora se stalno prati, a kada padne ispod praga Vpf=2,5V, prebacuje se na baterijski vod. Sljedeća tablica prikazuje uvjete za prebacivanje između električnih vodova:

Točnost sata održava se praćenjem temperature okoline. Mikrokrug pokreće internu proceduru za podešavanje frekvencije generatora takta; količina podešavanja se određuje pomoću posebnog grafikona ovisnosti frekvencije o temperaturi. Postupak počinje nakon uključivanja napajanja, a zatim se izvodi svake 64 sekunde.

Kako bi se očuvao naboj, kada je baterija spojena (napon se primjenjuje na Vbat liniju), generator takta se ne pokreće sve dok napon na Vcc liniji ne prijeđe graničnu vrijednost Vpf, ili se ispravna adresa mikro kruga ne prenese preko I2C sučelje. Vrijeme pokretanja generatora takta manje je od jedne sekunde. Otprilike 2 sekunde nakon što se uključi napajanje (Vcc) ili kada se adresa primi preko I2C sučelja, počinje postupak korekcije frekvencije. Nakon što se generator takta pokrene, nastavlja raditi sve dok je Vcc ili Vbat prisutan. Kada se prvi put uključe, registri datuma i vremena se poništavaju i imaju sljedeće vrijednosti: 01/01/00 – 01 – 00/00/00 (dan/mjesec/godina/ – dan u tjednu – sat/minute /sekundi).

Potrošnja struje pri napajanju baterijom od 3,63 V je 3 µA, bez prijenosa podataka preko I2C sučelja. Maksimalna potrošnja struje može doseći 300 µA kada se koristi vanjsko napajanje od 5,5 V i visoka I2C brzina prijenosa podataka.

Vanjska funkcija resetiranja

RST linija se može koristiti za vanjsko resetiranje i također ima funkciju niskonaponskog alarma. Linija se visoko povlači kroz unutarnji otpornik; nije potrebno vanjsko povlačenje. Za korištenje vanjske funkcije resetiranja, gumb se može spojiti između RST linije i zajedničke žice, mikro krug ima zaštitu od odbijanja kontakata. Funkcija alarma se aktivira kada napon napajanja Vcc padne ispod vrijednosti praga Vpf, dok je RST linija postavljena na nisku logičku razinu.

Opis DS3231 registara

Donja tablica prikazuje popis registara sata u stvarnom vremenu:

AdresaD7D6D5D4D3D2D1D0FunkcijaOgraničenja
0x000 10 sekundisekundisekundi00-59
0x010 10 minutaminutaminuta00-59
0x020 12/24 PRIJEPODNE POSLJEPODNE10 satiSatGledati1-12 + AM/PM ili 00-23
10 sati
0x030 0 0 0 0 DanDan u tjednu1-7
0x040 0 10Brojdatum01-31
0x05stoljeća0 0 10 mjeseciMjesecMjeseci/stoljeće01-12 + Stoljeće
0x0610 godinaGodinaGodine00-99
0x07A1M110 sekundisekundiSekunde, 1. alarm00-59
0x08A1M210 minutaminutaMinute, 1. alarm00-59
0x09A1M312/24 PRIJEPODNE POSLJEPODNE10 satiSatSat, 1. alarm1-12 + AM/PM ili 00-23
10 sati
0x0AA1M4DY/DT10DanDan u tjednu, 1. alarm1-7
BrojDatum, 1. alarm01-31
0x0BA2M210 minutaminutaMinute, 2. alarm00-59
0x0CA2M312/24 PRIJEPODNE POSLJEPODNE10 satiSatSat, 2. alarm1-12 + AM/PM ili 00-23
10 sati
0x0DA2M4DY/DT10DanDan u tjednu, 2. alarm1-7
BrojDatum, 2. alarm01-31
0x0EEOSCBBSQWKONVRS2RS1INTCNA2IEA1IERegistar postavki (kontrola)
0x0FO.S.F.0 0 0 EN32 kHzBSYA2FA1FRegistar stanja
0x10ZNAKPODACIPODACIPODACIPODACIPODACIPODACIPODACIRegistar pomaka starenja
0x11ZNAKPODACIPODACIPODACIPODACIPODACIPODACIPODACIRegistar temperature, visoki bajt
0x12PODACIPODACI0 0 0 0 0 0 Registar temperature, niski bajt

Podaci o vremenu pohranjeni su u binarnom decimalnom formatu, to jest, svaka znamenka decimalnog broja (od 0 do 9) predstavljena je kao skupina od 4 bita. U slučaju jednog bajta, niži nibble broji jedinice, visoki nibble desetke, itd. Vrijeme se broji u registrima s adresama 0x00-0x06; za brojanje sati možete odabrati 12 ili 24 satni način rada. Postavljanjem 6. bita registra sata (adresa 0x02) postavlja se 12-satni način rada, u kojem 5. bit označava doba dana, vrijednost 1 odgovara popodnevu (PM), vrijednost 0 odgovara popodnevu (AM). Nulta vrijednost 6. bita odgovara 24-satnom načinu rada, ovdje je 5. bit uključen u brojanje sati (vrijednosti 20-23).

Registar dana u tjednu se povećava u ponoć, brojeći od 1 do 7, registar mjeseca (adresa 0x05) sadrži bit stoljeća (7. bit), koji se prebacuje kada se registar za brojanje godina (adresa 0x06) prelije, od 99 do 00 .

DS3231 čip implementira dvije budilice, 1. budilica je konfigurirana pomoću registara s adresama 0x07-0x0A, 2. budilica je konfigurirana pomoću registara 0x0B-0x0D. Bitovi A1Mx i A2Mx mogu se koristiti za konfiguriranje različitih načina rada za alarme; postavljanje bita isključuje odgovarajući registar iz operacije usporedbe. Donje tablice prikazuju kombinacije bitova za različite načine alarma:

Kombinacije bitova koje nisu navedene u tablicama dovode do neispravnog rada alarma. Ako je bit DY/DT obrisan, tada se podudaranje datuma (dan u mjesecu) prati za budilicu; kada je bit DY/DT postavljen, provjerava se podudaranje dana u tjednu.

Većina funkcija se konfigurira u upravljačkom registru. EOSC bit kontrolira početak generatora takta, resetiranje bita pokreće generator takta. Postavljanje bita zaustavlja generator, samo za baterijski način rada (Vbat). Kada se napaja iz vanjskog izvora (Vcc), oscilator uvijek radi bez obzira na stanje EOSC bita. Kada je omogućeno, zadana vrijednost bita je 0.

Postavljanje BBSQW bita omogućuje INT/SQW izlazu (3. pin) da radi u načinu rada baterije, u nedostatku vanjskog napajanja. Kada je bit postavljen na nulu, INT/SQW izlaz prelazi u stanje 3 (deaktivirano) ako napon vanjskog izvora Vcc padne ispod vrijednosti praga Vpf. Nakon dovoda napajanja, zadana vrijednost bita je 0.

Bit CONV je odgovoran za prisilno mjerenje temperature; podešavanje bita pokreće proces pretvorbe, tijekom kojeg se podešava i frekvencija generatora takta; Pokretanje je moguće samo ako je prethodna konverzija završena prije pokretanja, trebate provjeriti oznaku zauzetosti BSY. Prisilna pretvorba temperature ne utječe na interni ciklus podešavanja frekvencije od 64 sekunde. Postavljanje bita CONV ne utječe na oznaku BSY 2 ms. Bitovi CONV i BSY automatski se brišu nakon završetka pretvorbe.

Bitovi RS2, RS1 postavljaju frekvenciju pravokutnih impulsa (kvadratni val) na INT/SQW izlazu. Prema zadanim postavkama, kada su omogućeni, bitovi su postavljeni na 1. Tablica u nastavku prikazuje moguće kombinacije bitova:

INTCN bit kontrolira INT/SQW izlaz. Ako se bit resetira, na izlazu se pojavljuju pravokutni impulsi (kvadratni valovi), čija se frekvencija postavlja bitovima RS2, RS1. Kada je INTCN bit postavljen, izlaz se koristi za generiranje prekida alarma. Standardno, vrijednost bita je 1. Vrsta izlaza je INT/SQW - otvoreni odvod, stoga ga je potrebno povući kroz otpornik na visoku logičku razinu, aktivna razina je niska.

Postavljanje bitova A1IE, A2IE omogućuje prekide na 1. odnosno 2. signalu alarma. Resetiranje bitova, onemogućuje prekide. Zadana vrijednost je 0.

Statusni registar sadrži oznake događaja i kontrolira izlaz od 32 kHz. OSF zastavica odražava stanje generatora takta, vrijednost 1 znači da je generator takta zaustavljen, ovaj događaj se može dogoditi u sljedećim slučajevima:

  • Prvi put nakon uključivanja struje
  • Baterija ili vanjski napon nisu dovoljni za rad generatora takta
  • Generator se isključuje postavljanjem EOSC bita u baterijski način rada
  • Vanjski čimbenici koji utječu na kristalni oscilator (buka, curenje itd.)

Jednom postavljena vrijednost bita se ne mijenja; bit se mora ručno resetirati.

Postavljanje bita EN32kHz omogućuje generiranje pravokutnih impulsa (kvadratnih valova) na izlazu od 32kHz (1. pin), frekvencija impulsa je fiksna i jednaka je 32,768 kHz. Ponovno postavljanje bita onemogućuje ovu funkciju i pomiče izlaz u 3. stanje (visoka ulazna impedancija). Prema zadanim postavkama vrijednost bita je 1; nakon što se napajanje pojavi, na izlazu se pojavljuju impulsi. Tip izlaza je 32kHz open drain, tako da zahtijeva podizanje na visoku logičku razinu.

Oznaka zauzetosti BSY postavljena je tijekom procesa konverzije temperature i podešavanja sata. Oznaka se poništava kada je konverzija dovršena.

Zastavice budilice A1F, A2F postavljaju se kada se vrijednosti registara za brojanje vremena i registara budilice podudaraju. Ako su alarmni prekidi A1IE, A2IE omogućeni i dodijeljen je prekidni izlaz (postavljen je INTCN bit), tada se na INT/SQW izlazu pojavljuje signal prekida (prijelaz s visoke na nisku logičku razinu). Zastavice se moraju poništiti ručno upisivanjem vrijednosti 0.

Registar Aging Offset dizajniran je za podešavanje frekvencije generatora takta. Vrijednost registra dodaje se frekvenciji oscilatora tijekom internog postupka podešavanja, ako se detektira promjena temperature, a također i kada je konverzija temperature pokrenuta bitom CONV. Vrijednost pomaka je potpisana, odnosno pozitivne vrijednosti (1-127) smanjuju frekvenciju, negativne vrijednosti (128-255) povećavaju. Za isti pomak, promjena frekvencije bit će različita ovisno o temperaturi. Na +25°C, promjena frekvencije bit će 0,1 ppm/LSB.

Trenutna vrijednost temperature pohranjuje se u registre s adresama 0x11 i 0x12, odnosno visoki i niski bajt, vrijednost temperature u registrima se povremeno ažurira. Postavljeno je lijevo poravnanje, rezolucija je 10 bita ili 0,25°C/LSB, odnosno visoki bajt sadrži cjelobrojni dio temperature, a 6., 7. bit u niskim registrima čine frakcijski dio. U visokom bajtu, 7. bit označava predznak temperature, na primjer, vrijednost 00011011 01 odgovara temperaturi od +27,25 °C, vrijednost 11111110 10 odgovara temperaturi od -2,5 °C.

Kod čitanja vremenskih registara preporučuje se korištenje dodatnog međuspremnika, odnosno čitanje više registara odjednom, a ne zasebno, jer između pojedinih operacija čitanja vremenski registri mogu mijenjati svoju vrijednost. Ovog se pravila također preporučuje pridržavati se prilikom upisa novih podataka u matične knjige računa. Zapisivanje nove vrijednosti u registar sekundi pauzira sat na 1 sekundu, preostali registri moraju se ponovno upisati za to vrijeme.

Spajanje DS3231 na mikrokontroler

Spojio sam sat na mikrokontroler PIC16F628A i koristio . Dijagram povezivanja prikazan je u nastavku:


Nakon uključivanja napajanja, na indikatorima se prikazuju crtice (– – – – – –), zatim se sat inicijalizira, vrijednost vremena se pojavljuje na indikatorima s odgodom od 1 sekunde, što je potrebno za pokretanje generatora takta. Indikatori prikazuju sate, minute i sekunde, odvojene decimalnom točkom, a format vremena je 24-satni. Pomoću tipke SB1 “Indikacija” možete promijeniti format prikaza, pri čemu će indikatori prikazivati ​​temperaturu, kao i vrijednost sati i minuta, odvojene decimalnom točkom, koja treperi frekvencijom od 2 Hz. Temperatura se prikazuje bez razlomka; program čita samo visoki bajt memorije temperature na adresi 0x11.

Vrijednost vremena se očitava sa sata preko prekida na liniji SQW/INT, koji se kontrolira 1. alarmnim signalom; tijekom inicijalizacije sata, budilica se postavlja na svaki drugi signal. HL1 LED služi kao indikator i trepće na signal prekida svake sekunde. HL2 LED svijetli ako postoji greška u prijenosu podataka preko I2C sučelja.

Dodatno, u program sam dodao mogućnost postavljanja sata pomoću gumba SB2 “Postavke”, SB3 “Instalacija”. U način podešavanja ulazi se pritiskom na tipku SB2; umjesto minuta i sekundi indikatori prikazuju 00 sati i crtice (00 – – – –). Pomoću tipke SB3 postavljate vrijednost sata (povećava se svakim pritiskom), zatim pritiskom na tipku SB2 prelazite na uređivanje minuta, umjesto crtice bit će prikazano 00 minuta. Gumb SB3 također postavlja traženu vrijednost i tako dalje. Nakon uređivanja sekundi i pritiska na tipku SB2, vrijeme na satu se ponovno upisuje, a na indikatorima se prikazuje ažurirano vrijeme.

Djelomični programski kod je naveden u nastavku (cijela verzija se može preuzeti na kraju članka):

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; #uključi LIST p=16F628A __CONFIG H"3F10" ;Razina pogreške konfiguracije mikrokontrolera -302 ;ne prikazuj poruke s greškom 302 u popisu Sec equ 0020h ;registri pomoćnih računa Sec1 equ 0021h ; Sec2 equ 0022h; scetbit equ 0024h;pomoćni registar za brojanje broja bitova perem equ 0025h;pomoćni registar za prijem/prijenos bajtova preko spi, i2c temp equ 0026h;temperaturni registar perem_1 equ 0027h;pomoćni registar za binarno-decimalni pretvarač. rezultat equ 0028h ;binarni-decimalni pretvarač pomoćni registar dat_ind equ 0029h ;registar podataka za prijenos preko spi protokola adr_ind equ 002Ah ;adresni registar za prijenos preko spi protokola second equ 002Bh ;registar pohrane sekundi za podešavanje vremena minut equ 002Ch ;registar pohrane minuta za podešavanje vremena sat equ 002Dh ; registar pohrane sati za postavke vremena adr_i2c equ 002Eh ;registri podrutine prijenosa podataka i2c sučelja tmp_i2c equ 002Fh slave_adr equ 0030h data_i2c equ 0031h flag equ 007Fh ;flag register #DEFINE int PORTB,0 ;prekidna linija INT/SQW DS3231 #DEFINE sda PORT B ,1 ;linija SDA za veze DS3231 #DEFINE scl PORTB,2 ;SCL linija za povezivanje DS3231 #DEFINE sda_io TRISB,1 ;smjer SDA linije #DEFINE scl_io TRISB,2 ;smjer SCL linije #DEFINE datai PORTB,5 ;linija unosa podataka MAX7219 drajvera #DEFINE cs PORTB ,6 ;linija odabira drajvera MAX7219 #DEFINE clk PORTB,7 ;linija takta drajvera MAX7219 #DEFINE led PORTB,4 ;i2c greška LED #DEFINE led_sec PORTB,3 ;indikator napretka takta LED 1Hz #DEFINE regim PORTA,2 ;Tipka za indikaciju - promjena načina prikaza #DEFINE nast PORTA,3 ;Tipka za podešavanje - ulazak u mod za podešavanje vremena #DEFINE ust PORTA,4 ;Tipka za podešavanje - podešavanje vrijednosti sata;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;započnite izvršavanje programa s adrese 0000h goto Start ;idite na oznaku Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Pokretanje glavnog programa movlw b"00000000" ;postavljanje vrijednosti izlaznih zasuna priključka A movwf PORTA ; movlw b"01000000" ;postavite vrijednosti izlaznih zasuna priključka B movwf PORTB ; movlw b"00000111" ;isključi komparatore movwf CMCON ; bsf STATUS,RP0 ;odaberite 1. banku movlw b"00000111" ;postavite ulazne/izlazne linije porta B movwf TRISB ;RB0-RB2 - za ulaz, ostalo za izlaz movlw b"11111111" ;postavite ulaz/ izlazne linije porta A movwf TRISA ;sve linije za unos bcf STATUS,RP0 ;odaberite banku 0 clrf zastavu ;resetirajte registar zastavice poziv init_lcd ;pozovite potprogram za inicijalizaciju upravljačkog programa (MAX7219) poziv viv_not ;izlaz simbola crtice " ------ " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; movlw b"11010000" ;adresa uređaja (DS3231) movwf slave_adr ;Upišite 4 bajta u registre za primanje/prijenos preko i2c;ovdje je konfiguriran prvi alarm, oglašava se svaki drugi movlw data_i2c ;postavite prvi registar za primanje/prijenos putem i2c movwf FSR ; movlw b"10000000" ;podaci za registar sekundi 1. alarma movwf INDF ; incf FSR,F ; movlw b"10000000" ;podaci za zapisnik minuta 1. alarma movwf INDF ; incf FSR,F ; movlw b"10000000" ;podaci za satni registar 1. budilice movwf INDF ; incf FSR,F ; movlw b"10000000" ;podaci za registar datum/dan u tjednu 1. alarma movwf INDF ; movlw. 4 ;prijenos 4 bajta putem i2c movwf tmp_i2c ; movlw 0x07 ;postavljanje adrese sekundnog registra 1. budilice movwf adr_i2c ; poziv write_i2c ;pozivanje potprograma za pisanje preko i2c sučelja poziv err_prov ;provjera I2C grešaka pisanja/čitanja movlw .1 ;prijenos 1. bajta preko i2c movwf tmp_i2c ; movlw 0x0E ;postavljanje adrese kontrolnog registra movwf adr_i2c ; movlw data_i2c ;postavljanje prvog registra prijenosa/prijema putem i2c movwf FSR ; movlw b"00000101" ;pokretanje generatora takta, zabrana rada INT/SQW pina za movwf INDF ;način rada baterije, frekvencija impulsa na INT/SQW izlazu je 1Hz, ;INT/SQW izlaz se koristi za generiranje alarma prekidi sata, ;omogući prekide budilice 1. poziv alarma write_i2c ;pozivanje potprograma snimanja preko i2c sučelja poziv err_prov ;provjera grešaka I2C pisanja/čitanja met_2 movlw .1 ;prijenos 1. bajta putem i2c movwf tmp_i2c ; movlw 0x0F ;postavljanje adrese statusnog registra movwf adr_i2c ; movlw data_i2c ;postavljanje prvog registra prijenosa/prijema putem i2c movwf FSR ; movlw b"00000000" ;resetirati OSF bit, zabraniti generiranje impulsa na EN32kHz izlazu, movwf INDF ;resetirati zastavice prekida alarma A2F, A1F poziv write_i2c ;pozvati potprogram za snimanje preko i2c sučelja poziv err_prov ;provjeriti I2C pisanje /čitanje grešaka met_1 btfsc int ; ispitivanje linije prekida alarma goto met_3; bsf led_sec ;uključi LED indikator napredovanja sata goto met_4 ; met_3 bcf led_sec ;isključuje LED indikator napredovanja sata btfsc nast ;provjerava gumb za podešavanje sata goto met_5 ; poziv nast_time ;poziv potprograma za postavljanje vremena goto met_2 ; met_5 btfsc regim ;provjera gumba načina rada indikacije goto met_1 ; met_6 poziv paus_knp ; btfss režim; goto met_6 ; btfss zastavica,2 ;promjena vrijednosti zastavice načina indikacije goto met_7 ; bcf zastavica,2 ;zastavica resetiranja indikacije, način prikaza sata goto met_1 ; met_7 bsf zastavica,2 ;postavljanje zastavice indikacije, temperature i načina prikaza sata goto met_1 ; met_4 movlw .1 ;prijenos 1. bajta putem i2c movwf tmp_i2c ; movlw 0x11 ;postavljanje adrese registra visoke temperature movwf adr_i2c ; poziv read_i2c ;pozivanje potprograma za čitanje preko I2C poziv err_prov ;provjera I2C grešaka pisanja/čitanja movf INDF,W ;kopiranje vrijednosti temperature u temp registar movwf temp rd_time movlw .3 ;prijenos 3 bajta preko i2c movwf tmp_i2c ; movlw 0x00 ;postavljanje adrese sekundnog registra movwf adr_i2c ; poziv read_i2c ;pozivanje potprograma za čitanje putem I2C poziv err_prov ;provjera I2C grešaka pisanja/čitanja btfsc flag,2 ;provjera oznake načina indikacije goto met_8 ; poziv vivod ;pozivanje potprograma za prikaz vrijednosti sata na digitalnom displeju goto met_2 ; met_8 poziv vivod_temp ;pozivanje potprograma za prikaz temperature i sata na digitalnom displeju goto met_2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

#uključi

CONFIG H"3F10" ;Konfiguracija mikrokontrolera

errorlevel -302 ;ne prikazuj poruke o pogrešci 302 u popisu

Sec equ 0020h ;registri pomoćnih računa

Sec1 equ 0021h ;

Sec2 equ 0022h;

scetbit equ 0024h ;brojenje broja bitova pomoćnog registra

perem equ 0025h ; registar primanja/prijenosa pomoćnih bajtova putem spi, i2c

temp equ 0026h ;registar temperature

perem_1 equ 0027h ;BCD pomoćni registar

rezultat equ 0028h ;binarni-decimalni pretvarač pomoćni registar

dat_ind equ 0029h ;registar podataka za prijenos preko spi protokola

adr_ind equ 002Ah ;adresni registar za prijenos preko spi protokola

second equ 002Bh ;registar pohrane sekundi za podešavanje vremena

minut equ 002Ch ;registar pohrane minuta za podešavanje vremena

hour equ 002Dh ;registar pohrane sati za podešavanje vremena

adr_i2c equ 002Eh ;registri potprograma prijenosa podataka i2c sučelja

tmp_i2c equ 002Fh

slave_adr equ 0030h

data_i2c equ 0031h

flag equ 007Fh ;registar zastava

#DEFINE int PORTB,0 ;prekidna linija INT/SQW DS3231

#DEFINE sda PORTB,1 ;SDA linija za povezivanje DS3231

#DEFINE scl PORTB,2 ;SCL linija za povezivanje DS3231

#DEFINE datai PORTB,5 ;ulazni red podataka MAX7219 drajvera

#DEFINE cs PORTB,6 ; linija odabira upravljačkog programa MAX7219

#DEFINE clk PORTB,7 ; linija takta pokretačkog programa MAX7219

#DEFINE led PORTB,4 ;i2c LED greška

#DEFINE led_sec PORTB,3 ;LED indikator napretka sata 1Hz

#DEFINE regim PORTA,2 ;Indikatorska tipka - mijenja način prikaza

#DEFINE nast PORTA,3 ;Gumb Postavke - ulazi u mod podešavanja vremena

#DEFINE ust PORTA,4 ;Gumb Postavi - postavite vrijednost sata

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

org 0000h ;pokreni izvođenje programa s adrese 0000h

goto Start ;idite na oznaku Start

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

;Glavni program

Start movlw b"00000000" ;postavite vrijednosti izlaznih zasuna priključka A

movlw b"01000000" ;postavite vrijednosti izlaznih zasuna priključka B

movlw b"00000111" ;isključi usporednike

bsf STATUS,RP0 ;odaberite 1. banku

movlw b"00000111" ;konfiguriranje ulazno/izlaznih linija priključka B

movwf TRISB ;RB0-RB2 - na ulaz, ostalo na izlaz

movlw b"11111111" ;postavljanje ulazno/izlaznih linija priključka A

movwf TRISA ;svi redovi za unos

bcf STATUS,RP0 ;odaberite banku 0

clrf zastavica ;poništi registar zastavica

poziv init_lcd ;poziv rutine inicijalizacije upravljačkog programa (MAX7219)

poziv viv_not ;izlaz simbola crtice " ------ " na indikatore

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

movlw b"11010000" ;adresa uređaja (DS3231)

;Upišite 4 bajta u registre za primanje/prijenos putem i2c

movlw data_i2c ;postavljanje prvog registra za primanje/prijenos putem i2c

movlw b"10000000" ;podaci za registar sekundi 1. alarma

movlw b"10000000" ;podaci za registar minuta 1. alarma

movlw b"10000000" ;podaci za 1. registar budilice

movlw b"10000000" ;podaci za datum/dan u tjednu registar 1. alarma

movlw .4 ;prijenos 4 bajta putem i2c

movlw 0x07 ;postavljanje adrese registra sekundi prve budilice

Ova recenzija je za početnike radio amatere (one koji vole lemiti), za one koje zanima sam proces. Možete procijeniti svoju vještinu. Čip DS3231 je sat stvarnog vremena (RTC) s integriranim kristalnim oscilatorom i temperaturnom kompenzacijom.

Ovo, naravno, nije lemljenje osciloskopa. Nivo ispod. Ali to je zanimljiva aktivnost.
Idemo na brzinu proći kroz formu u kojoj je sve stiglo.


Sadržaj je bio u dvije torbe. Standardne torbe s bravom. Mala vrećica malih stvari bila je unutar velike.


Komplet uključuje:
- Kao tijelo postoje dvije ploče od prozirne plastike (tonirane i zaštićene filmom od ogrebotina).
- Daska (vrlo kvalitetna).


Dvije matrice.


S prednje strane su zaštićeni filmom. Noge su zaštićene poroznim polietilenom.


USB kabel je dugačak oko metar.


Izlio sam sve što je ostalo.


Podijeljen na dva dijela.
Vijci s maticama.


I činjenica da morate lemiti.


Utičnica za litijsku bateriju vrlo rijetkog formata CR1220, senzor položaja žive, par tranzistora, elektrolitski kondenzatori, AMS1117 stabilizator (3.3V), SMD kondenzatori i otpornici (10K), 3 tipke, USB konektor, zujalica.
Najvažnija stvar je STC 15w1k24s kontroler i visokoprecizni DS3231 čip. Bile su zapakirane u vrlo tvrdi blister, bilo ga je jako teško zgužvati.


Nije bilo sheme. Međutim, nije bilo nikakvih pitanja, sve je bilo jasno.
Svi detalji na ploči nisu samo označeni, već su i (uvjetno) nacrtani.
Jednostavno je.
Ali prvo sam se pripremio.


Počeo sam lemljenjem dva najsloženija (tako sam mislio) mikro kruga. Postavljen i zgrabljen na dva mjesta (dijametralno suprotna). I onda sam ga zalemio kako treba. Ne zaboravite ga držati kako ne bi "pobjegli".


Zatim stabilizator.


Tranzistor.


Četiri SMD otpornika i dva SMD kondenzatora. Pozicioniranje i hvatanje s jednog ruba nije bilo tako lako (potrebna je vještina). I nemam ga dovoljno :).


Dva elektrolita.


USB priključak.


Utičnica za litijsku bateriju.


cviker. Ne zaboravite na plus i minus. Nakon lemljenja sam odgrizao noge kako treba, ne želim da se kasnije miješaju prilikom lemljenja matrica.


Merkurov senzor položaja.


3 gumba.


I na kraju, matrice. Obratite pažnju na orijentaciju. Ovo je vrh (visokotonac će biti s lijeve strane).


Evo što se dogodilo.


Istina, ostali su rezervni dijelovi (u slučaju gubitka, vjerojatno): jedan tranzistor, dva otpornika i kondenzator.


Isperem ga od fluksa.
Provjeravam.
Oni rade!
Skidam zaštitne folije.


skupljam.

Nakon uključivanja, sat mi je čestitao Novu godinu.


Nije ni čudo, sat 1. siječnja 2000. godine je 00 sati 01 minuta.


Ne obraćajte pozornost na različite boje matrice. Brzina osvježavanja "zaslona" usporediva je s brzinom zatvarača kamere. Ljudsko oko sve vidi u ispravnoj crvenoj boji. Zato sam malo zasjenio prozore dok sam snimao video (da povećam brzinu zatvarača).
Sada ga moramo konfigurirati.
Sat ima tri gumba na stražnjoj strani. I sam sam ih konvencionalno nazvao (odozgo prema dolje):
1. Izbornik.
2. Plus.
3. Minus.
Pogledajte algoritam postavljanja. Imaš li sat u rukama i ono što nije jasno bit će jasnije 
Za ulazak držite gornju tipku (izbornik) neko vrijeme. Zatim radimo s kratkim prešama.

Dopusti da ti nešto objasnim. Ukupno je šest menija. Mijenjaju se u krug. Možete koristiti gumb plus, možete koristiti gumb minus.
TIME – podešavanje vremena.
DATUM – podešavanje datuma.
ALAR – podešavanje alarma.
FONT – izbor fontova (ukupno 5 vrsta: tanki, široki, glatki...).
DISP – izbor algoritma izlaza informacija (možete koristiti samo sat, možete imati sekvencijalno mijenjanje informacija: vrijeme, temperatura, datum, praznici u puzajućem redu...).
MIDP – odaberite vrstu razdjelnih točaka.


Nije lako sve objasniti riječima. To sam detaljno pokazao u videu (link na kraju).
A u ovom videu (30 sekundi) možete vidjeti algoritam za prikaz informacija o matricama (izbornik DISP type2).


Važna nota. Bez litijske baterije, nakon podešavanja vrijeme i datum se gube. Preostale postavke ostaju u memoriji.
Spojio ga na obični punjač. Izmjerio sam potrošnju.


USB uređaj ne pokazuje ništa kada troši manje od 50mA (ovo je značajka).
Zaključak: u clock modu potrošnja struje je manja od 50mA, u ticker modu je oko 70mA. Ne tako puno.
Izmjerio sam dimenzije: 105*85mm.
Brojevi na standardnom zaslonu su 20*30mm svaki.


Stavio sam ga ispred TV-a.


Skoro sam zaboravio na senzor položaja žive.
Sat će uvijek pokazivati ​​točno, čak i ako je okrenut naopako. Živina kuglica ili zatvara ili otvara kontakte. Sukladno tome, kontroler mijenja algoritam za izlaz informacija u matrice.
To je u biti to.
Vrijeme je za svođenje računa.
Dobar DIY komplet za početnike radio amatere da testiraju svoje vještine. Štoviše, ovo nije samo set za trening, već se na kraju pokazao kao dobar sat.
Ovo što sam napisao trebalo bi biti dovoljno za ispravan zaključak.
Ako nešto nije jasno, postavljajte pitanja. Nadam se da je bar nekome pomoglo.
Sretno!

Proizvod je dostavljen za pisanje recenzije od strane trgovine. Recenzija je objavljena u skladu s klauzulom 18 Pravila stranice.

Planiram kupiti +61 Dodaj u favorite Svidjela mi se recenzija +66 +122

Izrazite značajke:

  • Preciznost ±2 ppm preko temperaturnog raspona od 0°C do +40°C
  • Preciznost ±3,5 ppm preko temperaturnog raspona od -40°C do +85°C
  • Ulaz za spajanje autonomnog izvora napajanja kako bi se osigurao kontinuirani rad
  • Raspon radne temperature komercijalno: od 0°C do +70°C industrijsko: -40°C do +85°C
  • Mala potrošnja
  • Sat u stvarnom vremenu koji broji sekunde, minute, sate, dane u tjednu, dane u mjesecu, mjesec i godinu s korekcijom prijestupne godine do 2100
  • Dva dnevna alarma
  • Pravougaoni izlaz s programabilnom frekvencijom
  • Brzo (400 kHz) I 2 C sučelje
  • 3,3 V snage
  • Digitalni senzor temperature s točnošću mjerenja ±3°C
  • Registar koji sadrži podatke o potrebnom usklađivanju
  • nonRST poništi ulaz/izlaz

Primjena:

  • poslužitelji
  • Elektronička brojila električne energije
  • Telematska oprema
  • GPS sustavi

Tipični dijagram povezivanja za DS3231:

Opći opis:

DS3231 je vrlo precizan sat stvarnog vremena (RTC) s ugrađenim I 2 C sučeljem, temperaturno kompenziranim kristalnim oscilatorom (TCXO) i kvarcnim rezonatorom. Uređaj ima ulaz za spajanje rezervnog autonomnog izvora napajanja, što omogućuje mjerenje vremena i temperature čak i kada je glavni napon isključen. Ugrađeni kvarcni rezonator povećava radni vijek uređaja i smanjuje potreban broj vanjskih elemenata. DS3231 dostupan je u verzijama za komercijalnu i industrijsku temperaturu i pakiran je u 300 mil 16 pinski SO paket.

RTC omogućuje brojanje sekundi, minuta, sati, dana u tjednu, dana u mjesecu i godine. Datum završetka mjeseca određuje se automatski uzimajući u obzir prijestupne godine. Sat realnog vremena radi u 24 ili 12 satnom formatu s indikacijom trenutne polovice dana (AM/PM). Uređaj ima dva dnevna alarma i pravokutni izlaz s frekvencijom koja se može programirati. Razmjena podataka s uređajem odvija se preko ugrađenog serijskog I 2 C kompatibilnog sučelja.



reci prijateljima
Pročitajte također