DS3231 – valós idejű óra csatlakoztatása. Óra a DS3231 és az AVR mikrokontroller SDA és SCL érintkezőin különböző Arduino kártyákon

31.01.2023 Böngészők

A DS3231 chip egy nagy pontosságú RTC valós idejű óra, amely beépített hőmérséklet-kompenzált kvarcoszcillátorral rendelkezik, ami évente mindössze ±2 perces időeltolódást eredményez. Ezen kívül egy riasztási funkciót is megvalósítottak, és van egy megszakítási kimenet is. Az óra kész Arduino modulként vásárolható meg hevederes elemekkel és elemtartóval.

Itt rendeltem meg a modult. A diagram az alábbi képen látható:


A mikroáramkör a széles körben használt . Támogatja a szabványos (100 kHz) és a magas (400 kHz) adatátviteli sebességet. A mikroáramkör címe (7 bit) az I2C buszon 1101000. Ezenkívül a modulnak van I2C memóriája (24C32), amely nem látható az ábrán.

Energiagazdálkodási módok

A mikroáramkör tápfeszültsége 2,3...5,5V tartományban lehet, két tápvezeték van, külső forráshoz (Vcc vonal), valamint az akkumulátorhoz (Vbat). A külső forrás feszültségét folyamatosan figyelik, és amikor a Vpf=2,5V küszöb alá csökken, átkapcsol az akkumulátor vezetékére. Az alábbi táblázat az elektromos vezetékek közötti váltás feltételeit mutatja be:

Az óra pontosságát a környezeti hőmérséklet figyelésével tartják fenn. A mikroáramkör elindít egy belső eljárást az óragenerátor frekvenciájának beállítására; a beállítás mértékét a frekvencia-hőmérséklet speciális grafikonja határozza meg. Az eljárás a tápfeszültség bekapcsolása után kezdődik, majd 64 másodpercenként lefut.

A töltés megtakarítása érdekében az akkumulátor csatlakoztatásakor (feszültség van a Vbat vezetékre) az óragenerátor addig nem indul el, amíg a Vcc vezeték feszültsége nem haladja meg a Vpf küszöbértéket, vagy a mikroáramkör helyes címét nem továbbítják az I2C interfész. Az óragenerátor indítási ideje kevesebb, mint egy másodperc. Körülbelül 2 másodperccel a tápfeszültség (Vcc) bekapcsolása vagy a cím I2C interfészen keresztüli fogadása után megkezdődik a frekvenciakorrekciós eljárás. Miután az óragenerátor elindult, tovább működik, amíg a Vcc vagy a Vbat jelen van. Az első bekapcsoláskor a dátum- és időregiszterek alaphelyzetbe állnak, és a következő értékeket kapják: 01/01/00 – 01 – 00/00/00 (nap/hónap/év/ – a hét napja – óra/perc /másodperc).

Az áramfelvétel 3,63 V-os akkumulátorral 3 µA, az I2C interfészen keresztüli adatátvitel hiányában. A maximális áramfelvétel elérheti a 300 µA-t külső 5,5 V-os tápegység és nagy I2C adatátviteli sebesség esetén.

Külső reset funkció

Az RST vonal külső resetre használható, és alacsony feszültségű riasztási funkcióval is rendelkezik. A vezetéket egy belső ellenálláson keresztül magasra húzzák; nincs szükség külső felhúzásra. A külső reset funkció használatához egy gomb csatlakoztatható az RST vonal és a közös vezeték közé, a mikroáramkör érintés-visszapattanás elleni védelemmel rendelkezik. A riasztási funkció akkor aktiválódik, ha a Vcc tápfeszültség a Vpf küszöbérték alá esik, miközben az RST vonal alacsony logikai szintre van állítva.

A DS3231 regiszterek leírása

Az alábbi táblázat a valós idejű óraregiszterek listáját mutatja:

CímD7D6D5D4D3D2D1D0FunkcióKorlátok
0x000 10 másodpercMásodpercekMásodpercek00-59
0x010 10 percpercekpercek00-59
0x020 12/24 DÉLELŐTT DÉLUTÁN10 óraÓraNéz1-12 + AM/PM vagy 00-23
10 óra
0x030 0 0 0 0 NapA hét napja1-7
0x040 0 10Számdátum01-31
0x05Század0 0 10 hónapHónapHónapok/évszázadok01-12 + Század
0x0610 évÉvÉvek00-99
0x07A1M110 másodpercMásodpercekMásodpercek, 1. riasztás00-59
0x08A1M210 percpercekPercek, 1. riasztás00-59
0x09A1M312/24 DÉLELŐTT DÉLUTÁN10 óraÓraÓra, 1. ébresztő1-12 + AM/PM vagy 00-23
10 óra
0x0AA1M4DY/DT10NapA hét napja, 1. riasztás1-7
SzámDátum, 1. riasztás01-31
0x0BA2M210 percpercekPercek, 2. riasztás00-59
0x0CA2M312/24 DÉLELŐTT DÉLUTÁN10 óraÓraÓra, 2. ébresztő1-12 + AM/PM vagy 00-23
10 óra
0x0DA2M4DY/DT10NapA hét napja, 2. riasztás1-7
SzámDátum, 2. riasztás01-31
0x0EEOSCBBSQWCONVRS2RS1INTCNA2IEA1IEBeállítások regiszter (vezérlés)
0x0FO.S.F.0 0 0 EN32kHzBSYA2FA1FÁllapotnyilvántartás
0x10JELADATADATADATADATADATADATADATAging Offset Register
0x11JELADATADATADATADATADATADATADATHőmérsékletregiszter, magas bájt
0x12ADATADAT0 0 0 0 0 0 Hőmérsékletregiszter, alacsony bájt

Az időinformáció bináris decimális formátumban kerül tárolásra, vagyis egy decimális szám minden egyes számjegye (0-tól 9-ig) 4 bites csoportként van ábrázolva. Egy bájt esetén az alacsony nibble egyeseket, a magas nibble tízeseket, stb. Az időt 0x00-0x06 című regiszterekben számolja, az órák számlálásához 12 vagy 24 órás módot választhat. Az óraregiszter 6. bitjének beállítása (0x02 cím) beállítja a 12 órás üzemmódot, melyben az 5. bit a napszakot jelöli, az 1. érték a délutánt (PM), a 0 a délutánt (AM). A 6. bit nulla értéke a 24 órás módnak felel meg, itt az 5. bit vesz részt az órák számlálásában (20-23 értékek).

A hét napjai regiszter éjfélkor növekszik, 1-től 7-ig számolva, a hónap regiszter (0x05 cím) tartalmazza a Century bitet (7. bit), amely akkor vált át, ha az évszámláló regiszter (0x06 cím) túlcsordul, 99-ről 00-ra. .

A DS3231 chip két ébresztőórát valósít meg, az 1. ébresztőóra 0x07-0x0A címmel, a 2. ébresztőóra 0x0B-0x0D regiszterekkel van konfigurálva. Az A1Mx és A2Mx bitek különféle riasztási módok konfigurálására használhatók, a bit beállítása kizárja a megfelelő regisztert az összehasonlítási műveletből. Az alábbi táblázatok a különböző riasztási módokhoz tartozó bitkombinációkat mutatják be:

A táblázatokban nem szereplő bitkombinációk a riasztások hibás működéséhez vezetnek. Ha a DY/DT bit törlődik, akkor a dátumegyezést (a hónap napját) figyeli az ébresztőóra, a DY/DT bit beállításakor pedig a hét napjának egyezését ellenőrzi.

A legtöbb funkció a Control regiszterben van konfigurálva. Az EOSC bit vezérli az órajelgenerátor indítását, a bit alaphelyzetbe állítása elindítja az óragenerátort. A bit beállítása leállítja a generátort, csak akkumulátoros üzemmódban (Vbat). Ha külső forrásról (Vcc) táplálja, az oszcillátor mindig működik, függetlenül az EOSC bit állapotától. Ha engedélyezve van, az alapértelmezett bitérték 0.

A BBSQW bit beállítása lehetővé teszi, hogy az INT/SQW kimenet (3. érintkező) akkumulátoros üzemmódban működjön, külső tápellátás hiányában. Ha a bit nullára van állítva, az INT/SQW kimenet 3-as állapotba kerül (deaktiválva), ha a külső forrás Vcc feszültsége a Vpf küszöbérték alá esik. A tápfeszültség bekapcsolása után az alapértelmezett bitérték 0.

A CONV bit felelős a kényszerített hőmérsékletmérésért, a bit beállítása elindítja az átalakítási folyamatot, melynek során az órajelgenerátor frekvenciáját is beállítják, a mérési eredmény 0x11, 0x12 című regiszterekben található. Indítás csak akkor lehetséges, ha az előző konverzió befejeződött; indítás előtt ellenőrizni kell a BSY foglalt jelzőt. A kényszerített hőmérséklet-átalakítás nincs hatással a belső 64 másodperces frekvenciabeállítási ciklusra. A CONV bit beállítása nem befolyásolja a BSY jelzőt 2 ms-ig. A CONV és BSY bitek automatikusan törlődnek az átalakítás befejezése után.

Az RS2, RS1 bitek beállítják a téglalap alakú impulzusok (négyzethullám) frekvenciáját az INT/SQW kimeneten. Alapértelmezés szerint, ha engedélyezve van, a bitek 1-re vannak állítva. Az alábbi táblázat a bitek lehetséges kombinációit mutatja:

Az INTCN bit vezérli az INT/SQW kimenetet. Ha a bitet alaphelyzetbe állítjuk, a kimeneten téglalap alakú impulzusok (négyzethullámok) jelennek meg, melyek frekvenciáját az RS2, RS1 bitek állítják be. Ha az INTCN bit be van állítva, a kimenet riasztási megszakításokat generál. Alapértelmezésben a bit értéke 1. A kimenet típusa INT/SQW - nyitott lefolyó, ezért egy ellenálláson keresztül kell felhúzni egy magas logikai szintre, az aktív szint alacsony.

Az A1IE, A2IE beállítási bitek lehetővé teszik az 1. és 2. riasztási jel megszakítását. Reset bitek, letiltja a megszakításokat. Az alapértelmezett érték 0.

Az állapotregiszter eseményjelzőket tartalmaz, és vezérli a 32 kHz-es kimenetet. Az OSF zászló az óragenerátor állapotát tükrözi, az 1-es érték azt jelenti, hogy az óragenerátor leállt, ez az esemény a következő esetekben fordulhat elő:

  • A tápfeszültség bekapcsolása után először
  • Az akkumulátor vagy a külső feszültség nem elegendő az óragenerátor működtetéséhez
  • A generátor kikapcsolása az EOSC bit akkumulátoros üzemmódba állításával történik
  • A kristályoszcillátort befolyásoló külső tényezők (zaj, szivárgás stb.)

Beállítás után a bit értéke nem változik, a bitet kézzel kell visszaállítani.

Az EN32kHz bit beállítása lehetővé teszi téglalap alakú impulzusok (négyzethullámok) generálását a 32 kHz-es kimeneten (1. tű), az impulzusfrekvencia rögzített és 32,768 kHz. A bit visszaállítása letiltja ezt a funkciót, és a kimenetet a 3. állapotba (nagy bemeneti impedancia) mozgatja. Alapértelmezés szerint a bit értéke 1; a tápfeszültség bekapcsolása után impulzusok jelennek meg a kimeneten. A kimenet típusa 32kHz-es nyitott lefolyó, tehát magas logikai szintre való felhúzást igényel.

A BSY foglalt jelző a hőmérséklet-átalakítás és az órabeállítás folyamata során kerül beállításra. A zászló alaphelyzetbe áll, amikor az átalakítás befejeződött.

Az A1F, A2F ébresztőóra zászlókat akkor állítjuk be, ha az időszámláló regiszterek és az ébresztőóra regiszterek értékei megegyeznek. Ha az A1IE, A2IE riasztási megszakítások engedélyezve vannak, és megszakítási kimenet van hozzárendelve (INTCN bit be van állítva), akkor megszakítási jel jelenik meg az INT/SQW kimeneten (átmenet magasról alacsony logikai szintre). A zászlókat kézzel kell visszaállítani a 0 érték beírásával.

Az Aging Offset regiszter az óragenerátor frekvenciájának beállítására szolgál. A regiszterérték hozzáadódik az oszcillátor frekvenciájához a belső beállítási eljárás során, ha hőmérsékletváltozást észlel, és akkor is, ha a CONV bit hőmérséklet-átalakítást vált ki. Az eltolási érték előjeles, azaz a pozitív értékek (1-127) csökkentik a frekvenciát, a negatív értékek (128-255) növelik. Ugyanazon eltolás esetén a frekvenciaváltozás a hőmérséklettől függően eltérő lesz. +25°C-on a frekvenciaváltozás 0,1 ppm/LSB lesz.

Az aktuális hőmérsékleti értéket a 0x11 és 0x12 című regiszterek tárolják, a magas és alacsony bájt, a regiszterekben lévő hőmérsékleti érték időszakosan frissül. Balra igazítás van beállítva, a felbontás 10 bit vagy 0,25°C/LSB, vagyis a magas bájt tartalmazza a hőmérséklet egész részét, az alsó regiszterek 6., 7. bitje pedig a tört részt. A magas bájtban a 7. bit a hőmérséklet előjelét jelzi, például a 00011011 01 érték +27,25 °C-os hőmérsékletnek, az 11111110 10 érték -2,5 °C-os hőmérsékletnek felel meg.

Az időregiszterek kiolvasásánál ajánlatos kiegészítő puffert használni, vagyis egyszerre több regisztert olvasni, és nem külön-külön, hiszen az egyes olvasási műveletek között az időregiszterek értékét változtathatják. Ezt a szabályt ajánlott betartani az új adatok számlanyilvántartásokba írásakor is. Új érték beírása a másodpercregiszterbe 1 másodpercre szünetelteti az órát, a fennmaradó regisztereket ez idő alatt újra kell írni.

A DS3231 csatlakoztatása mikrokontrollerhez

Összekötöttem az órát egy PIC16F628A mikrokontrollerrel és használtam. A csatlakozási rajz az alábbiakban látható:


A tápfeszültség bekapcsolása után kötőjelek (– – – – – –) jelennek meg a kijelzőkön, majd az óra inicializálása megtörténik, az időérték 1 másodperces késleltetéssel jelenik meg a kijelzőkön, ami az óragenerátor indításához szükséges. Az indikátorok tizedesvesszővel elválasztva jelenítik meg az órát, percet és másodpercet, az idő formátuma pedig 24 órás. Az SB1 „Jelzés” gombbal módosítható a megjelenítési formátum, ahol a jelzők a hőmérsékletet, valamint az órák és percek értékét jelenítik meg, tizedesvesszővel elválasztva, amely 2 Hz-es frekvenciával villog. A hőmérséklet tört rész nélkül jelenik meg, a program csak a 0x11 címen lévő hőmérséklettároló magas bájtját olvassa be.

Az időértéket az óráról az SQW/INT vonal megszakítása olvassa ki, amelyet az 1. riasztási jel vezérel, az óra inicializálása során az ébresztőóra minden második jelzésre van állítva. A HL1 LED jelzőként szolgál, és másodpercenként villog a megszakítási jelnél. A HL2 LED kigyullad, ha az I2C interfészen keresztüli adatátvitel során hiba történik.

Ezenkívül hozzáadtam a programhoz az óra beállításának lehetőségét az SB2 „Beállítások”, az SB3 „Telepítés” gombokkal. A beállítási módba az SB2 gomb megnyomásával léphetünk be, a jelzőfények percek és másodpercek (00 – – – –) helyett 00 órát és kötőjeleket mutatnak. Az SB3 gombbal beállíthatja az óra értéket (minden megnyomással növelheti), majd az SB2 gomb megnyomásával átvált a percek szerkesztésére, kötőjel helyett 00 perc jelenik meg. Az SB3 gomb szintén beállítja a kívánt értéket és így tovább. A másodpercek szerkesztése és az SB2 gomb megnyomása után az óra átíródik, és a frissített idő megjelenik a kijelzőkön.

A részleges programkód alább található (a teljes verzió letölthető a cikk végén):

;;;;;;;; ;;;;;;;;;;;; ;;;;;;;;;;;;;; ; #beleértve LIST p=16F628A __CONFIG H"3F10" ;Mikrovezérlő konfigurációs hibaszint -302 ;ne jelenjenek meg a 302-es hibával rendelkező üzenetek a listában Sec equ 0020h ;segédszámla regiszterek Sec1 equ 0021h ; Sec2 equ 0022h ; scetbit equ 0024h;segédregiszter a bitek számának számlálására perem equ 0025h;segédregiszter a bájtok fogadásához/továbbításához spi-n keresztül, i2c temp equ 0026h;hőmérsékletregiszter perem_1 equ 0027h;segédregiszter a bináris-decimális konverterhez. eredmény equ 0028h ;bináris-decimális átalakító segédregiszter dat_ind equ 0029h ;adatregiszter az spi protokollon keresztül történő továbbításhoz adr_ind equ 002Ah ;címregiszter a spi protokollon keresztül történő átvitelhez second equ 002Bh ;másodperc tárolási regiszter az idő beállításához perc equ 002Ch ;perc tárolási regiszter az idő beállításához 0 óra 2h ; óra tárolási regiszter az időbeállításokhoz adr_i2c equ 002Eh ;az i2c interfész adatátviteli szubrutin regiszterei tmp_i2c equ 002Fh slave_adr equ 0030h data_i2c equ 0031h flag equ 007Fh ;INT LINE2DS PORTS ;flag inter 31 #DEFINE sda PORTB ,1 ;vonal SDA csatlakozásokhoz DS3231 #DEFINE scl PORTB,2 ;SCL vonal a DS3231 csatlakoztatásához #DEFINE sda_io TRISB,1 ;az SDA vonal iránya #DEFINE scl_io TRISB,2 ;az SCL vonal iránya #DEFINE datai PORTB,5 ;a MAX7219 illesztőprogram adatbeviteli sora #DEFINE cs PORTB ,6 ;illesztőprogram-választó sor MAX7219 #DEFINE clk PORTB,7 ;meghajtó órasora MAX7219 #DEFINE led PORTB,4 ;i2c hiba LED #DEFINE led_sec PORTB,3 ; LED 1Hz #DEFINE regim PORTA,2 ;Jelzőgomb - kijelzési mód váltása #DEFINE nast PORTA,3 ;Beállítás gomb - időbeállítási módba lépés #DEFINE ust PORTA,4 ;Beállítás gomb - óra ​​érték beállítása;;;;; ;;;;;;;;;; ;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;programvégrehajtás indítása a 0000h címről goto Start ;ugrás a Start címkére ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;; ;;;;;;;;;;;; ;Fő program Start movlw b"00000000" ;Az A port kimeneti reteszeinek értékeinek beállítása movwf PORTA ; movlw b"01000000" ;állítsa be a B port kimeneti reteszeinek értékeit movwf PORTB ; movlw b"00000111" ;komparátorok kikapcsolása movwf CMCON ; bsf STATUS,RP0 ;válassza ki az 1. bankot movlw b"00000111" ;állítsa be a B port bemeneti/kimeneti vonalait movwf TRISB ;RB0-RB2 - bemenethez, a többi kimenethez movlw b"11111111" ;állítsa be a bemenetet/ Az A port kimeneti sorai movwf TRISA ;minden sor a bcf bemenetére STATUS,RP0 ;válasszon bank 0 clrf flag ;reset flag register call init_lcd ;hívás illesztőprogram inicializálási alprogramja (MAX7219) hívás viv_not ;kimeneti kötőjel szimbólumok " ------ " ;;;;;;;;;;;; ;;;;;;;;;;; ;;;;;;;;;;;;;;; ;;;;;;; movlw b"11010000" ;eszköz címe (DS3231) movwf slave_adr ;Írjon 4 bájtot a vételi/átviteli regiszterekbe az i2c-n keresztül;itt van beállítva az 1. riasztás, minden második sípoló movlw data_i2c ;állítsa be az első vételi/átviteli regisztert az FSR-n keresztül ; movlw b"10000000" ;adatok az 1. riasztás másodpercregiszteréhez movwf INDF ; incf FSR,F ; movlw b"10000000" ;adatok az 1. riasztás jegyzőkönyvéhez movwf INDF ; incf FSR,F ; movlw b"10000000" ;adatok az 1. ébresztőóra óraregiszteréhez movwf INDF ; incf FSR,F ; movlw b"10000000" ;adatok az 1. riasztás dátuma/hét napja nyilvántartásához movwf INDF ; movlw. 4 ;átvitel 4 bájt i2c-n keresztül movwf tmp_i2c ; movlw 0x07 ;az 1. ébresztőóra másodpercregiszterének címének beállítása movwf adr_i2c ; a write_i2c hívása ;az írási szubrutin meghívása az i2c interfészen keresztül az err_prov hívása ;az I2C írási/olvasási hibák ellenőrzése movlw .1 ;az 1. bájt átvitele i2c-n keresztül movwf tmp_i2c ; movlw 0x0E ;a vezérlőregiszter címének beállítása movwf adr_i2c ; movlw data_i2c ;az első adási/vételi regiszter beállítása i2c-n keresztül movwf FSR ; movlw b"00000101" ;indítsa el az óragenerátort, tiltsa le a movwf INDF INT/SQW érintkezőjének működését ;elemes üzemmód, az INT/SQW kimenet impulzusfrekvenciája 1 Hz, ;az INT/SQW kimenet riasztás generálására szolgál az óra megszakítja, ;az ébresztőóra megszakításának engedélyezése 1. riasztási hívás írás_i2c ;A rögzítési szubrutin hívása az i2c interfészen keresztül hívás err_prov ;I2C írási/olvasási hibák ellenőrzése met_2 movlw .1 ;az 1. bájt átvitele i2c-n keresztül movwf tmp; movlw 0x0F ;az állapotregiszter címének beállítása movwf adr_i2c ; movlw data_i2c ;az első adási/vételi regiszter beállítása i2c-n keresztül movwf FSR ; movlw b"00000000" ;visszaállítja az OSF bitet, tiltja az impulzusok generálását az EN32kHz kimeneten, movwf INDF ;a riasztás megszakítási jelzők alaphelyzetbe állítása A2F, A1F call_i2c ;hívja a rögzítési szubrutint az i2c interfészen keresztül call errck for I2 writeche ; /read errors met_1 btfsc int ;a riasztási megszakítási sor lekérdezése goto met_3; bsf led_sec ;kapcsolja be az óra előrehaladását jelző LED-et goto met_4 ; met_3 bcf led_sec ;kikapcsolja az óra folyamatjelző LED-jét btfsc nast ;lekérdezi az órabeállító gombot goto met_5 ; hívja a nast_time ;hívja a szubrutint az idő beállításához goto met_2 ; met_5 btfsc regim ;a jelzés mód gombjának lekérdezése goto met_1 ; met_6 hívás paus_knp ; btfss regim ; goto met_6 ; btfss flag,2 ;módosítsa a jelzési mód jelző értékét goto met_7 ; bcf flag,2 ;reset display flag, óra megjelenítési mód goto met_1 ; met_7 bsf flag,2 ;a kijelzési zászló beállítása, a hőmérséklet és az óra kijelzési módja goto met_1 ; met_4 movlw .1 ;az 1. bájt továbbítása i2c-n keresztül movwf tmp_i2c ; movlw 0x11 ;magas hőmérsékletű regiszter címének beállítása movwf adr_i2c ; a read_i2c hívása ;az olvasási szubrutin meghívása I2C-n keresztül err_prov ;I2C írási/olvasási hibák ellenőrzése movf INDF,W ;a hőmérséklet érték bemásolása a temp regiszterbe movwf temp rd_time movlw .3 ;3 bájt átvitele i2c-n keresztül movw2c tmp ; movlw 0x00 ;a másodpercregiszter címének beállítása movwf adr_i2c ; hívás read_i2c ;az olvasási szubrutin hívása I2C híváson keresztül err_prov ;I2C írási/olvasási hibák ellenőrzése btfsc flag,2 ;az jelzésmód jelző lekérdezése goto met_8 ; call vivod ;az óraérték digitális kijelzőn történő megjelenítésére szolgáló szubrutin meghívása goto met_2 ; met_8 call vivod_temp ;az alprogram meghívása a hőmérséklet és az óra digitális kijelzőn történő megjelenítéséhez goto met_2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;

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

#beleértve

CONFIG H"3F10" ;Mikrovezérlő konfiguráció

errorlevel -302 ;ne jelenítse meg a 302-es hibaüzeneteket a listában

Sec equ 0020h ;kiegészítő számlanyilvántartások

Sec1 equ 0021h ;

Sec2 equ 0022h ;

scetbit equ 0024h ;a segédregiszter bitek számának számlálása

perem equ 0025h ;kiegészítő bájt vételi/átviteli regiszter spi, i2c-n keresztül

temp equ 0026h ;hőmérsékletregiszter

perem_1 equ 0027h ;BCD segédregiszter

eredmény equ 0028h ;bináris-decimális átalakító segédregiszter

dat_ind equ 0029h ;adatregiszter spi protokollon keresztüli továbbításhoz

adr_ind equ 002Ah ;címregiszter spi protokollon keresztüli továbbításhoz

second equ 002Bh ;másodperces tárolóregiszter az idő beállításához

perc equ 002Ch ;perc tárolási regiszter az idő beállításához

óra equ 002Dh ;óra tárolási regiszter az idő beállításához

adr_i2c equ 002Eh ;regiszterek az i2c interfész adatátviteli szubrutinjához

tmp_i2c equ 002Fh

slave_adr equ 0030h

data_i2c equ 0031h

zászló equ 007Fh ;zászlóregiszter

#DEFINE int PORTB,0 ;interrupt line INT/SQW DS3231

#DEFINE sda PORTB,1 ;SDA vonal a DS3231 csatlakoztatásához

#DEFINE scl PORTB,2 ;SCL vonal a DS3231 csatlakoztatásához

#DEFINE datai PORTB,5 ;a MAX7219 illesztőprogram adatbeviteli sora

#DEFINE cs PORTB,6 ;illesztőprogram-választó sor MAX7219

#DEFINE clk PORTB,7 ;a MAX7219 illesztőprogram órajele

#DEFINE led PORTB,4 ;i2c hibajelző LED

#DEFINE led_sec PORTB,3 ;LED órajel előrehaladást jelző 1Hz

#DEFINE regim PORTA,2 ;Jelzőgomb - megváltoztatja a megjelenítési módot

#DEFINE nast PORTA,3 ;Beállítások gomb - belép az időbeállítás módba

#DEFINE ust PORTA,4 ;Set gomb - az óra értékének beállítása

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

org 0000h ;a program végrehajtásának indítása a 0000h címről

goto Start ;lépjen a Start címkére

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

;Fő program

Start movlw b"00000000" ;állítsa be az A port kimeneti reteszeinek értékeit

movlw b"01000000" ;állítsa be a B port kimeneti reteszeinek értékeit

movlw b"00000111" ;kapcsolja ki az összehasonlítókat

bsf STATUS,RP0 ;válassza ki az 1. bankot

movlw b"00000111" ;A B port bemeneti/kimeneti vonalainak konfigurálása

movwf TRISB ;RB0-RB2 - a bemenetre, a többi a kimenetre

movlw b"11111111" ;az A port bemeneti/kimeneti vonalainak beállítása

movwf TRISA ;minden sor bemenetre

bcf STATUS,RP0 ;válassza ki a 0 bankot

clrf flag ;reset flag register

init_lcd hívása ;hívja az illesztőprogram inicializálási rutinját (MAX7219)

hívja a viv_not ;kimeneti kötőjel szimbólumokat " ------" az indikátorokhoz

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

movlw b"11010000" ;eszköz címe (DS3231)

;Írjon 4 bájtot a vételi/átviteli regiszterekbe az i2c-n keresztül

movlw data_i2c ;az első vételi/átviteli regiszter beállítása i2c-n keresztül

movlw b"10000000" ;adatok az 1. riasztás másodpercregiszteréhez

movlw b"10000000" ;adatok az 1. riasztás jegyzőkönyvéhez

movlw b"10000000" ;adatok az 1. ébresztőóra-regiszterhez

movlw b"10000000" ;adatok az 1. riasztás dátuma/hét napja nyilvántartásához

movlw .4 ;4 bájt átvitele i2c-n keresztül

movlw 0x07 ;az 1. ébresztőóra másodpercregiszterének címének beállítása

Megkülönböztető jellegzetességek:

  • Pontosság ±2 ppm 0°C és +40°C közötti hőmérséklet-tartományban
  • Pontosság ±3,5 ppm a -40°C és +85°C közötti hőmérséklet-tartományban
  • Bemenet autonóm áramforrás csatlakoztatásához a folyamatos működés érdekében
  • Üzemi hőmérséklet tartomány kereskedelmi: 0°C-tól +70°C-ig ipari: -40°C-tól +85°C-ig
  • Alacsony fogyasztás
  • Valós idejű óra másodperceket, perceket, órákat, a hét napjait, a hónap napjait, hónapját és évet számolja szökőév korrekcióval 2100-ig
  • Napi két riasztás
  • Négyszögletű kimenet programozható frekvenciával
  • Gyors (400 kHz) I 2 C interfész
  • 3.3V táp
  • Digitális hőmérséklet-érzékelő ±3°C mérési pontossággal
  • A szükséges beállítás adatait tartalmazó nyilvántartás
  • nonRST reset bemenet/kimenet

Alkalmazás:

  • Szerverek
  • Elektronikus villanyórák
  • Telematikai berendezések
  • GPS rendszerek

A DS3231 tipikus csatlakozási rajza:

Általános leírása:

A DS3231 egy nagy pontosságú valós idejű óra (RTC) beépített I 2 C interfésszel, hőmérséklet-kompenzált kristályoszcillátorral (TCXO) és kvarc rezonátorral. A készülék rendelkezik egy tartalék autonóm áramforrás csatlakoztatására szolgáló bemenettel, amely lehetővé teszi az időzítést és a hőmérséklet mérést a fő tápfeszültség kikapcsolása esetén is. A beépített kvarc rezonátor növeli a készülék élettartamát és csökkenti a szükséges külső elemek számát. A DS3231 kereskedelmi és ipari hőmérsékletű változatban kapható, és egy 300 miles 16 tűs SO csomagba van csomagolva.

Az RTC biztosítja a másodpercek, percek, órák, a hét napjai, a hónap napjai és az év számlálását. A hónap záró dátuma automatikusan kerül meghatározásra a szökőévek figyelembevételével. A valós idejű óra 24 vagy 12 órás formátumban működik, és a nap aktuális felét (AM/PM) jelzi. A készülék napi két riasztással és programozható frekvenciájú négyszögletes kimenettel rendelkezik. Az adatcsere a készülékkel a beépített soros I 2 C kompatibilis interfészen keresztül történik.

". Ismerkedjünk meg a DS3231 valós idejű óra modullal. A cikk videós utasításokat, programlistákat, a DS családból származó modulok Arduinohoz való csatlakoztatásának célját és módszereit tartalmazza.

DS3231 valós idejű óra modul

Mi az a DS3231 valós idejű óramodul?

Valós idejű óra modul- ez egy elektronikus áramkör, amelyet kronometrikus adatok rögzítésére terveztek (aktuális idő, dátum, a hét napja stb.), és egy autonóm áramforrásból és egy rögzítőeszközből álló rendszer.

DS3231 modul Lényegében egy közönséges óra. Az Arduino kártyákon már van beépített időérzékelő Millis azonban csak akkor működik, ha a tábla áram alá van kapcsolva. Ha kikapcsolja, majd bekapcsolja az Arduinót, a Millis-idő nullára áll vissza. A DS3231 fedélzetén pedig egy akkumulátor található, amely még az Arduino kártya leválasztása után is „táplálja” a modult, lehetővé téve az idő mérését.

A modul Arduino kártyákra épülő óraként vagy ébresztőóraként használható. Vagy riasztásként különböző rendszerekre, például egy okosotthonban.

DS3231 műszaki adatok:

  • a modul órákat, perceket, másodperceket, dátumokat, hónapokat, éveket számol (2100-ig a szökőéveket veszik figyelembe);
  • A különféle eszközökhöz való csatlakozáshoz az óra I2C interfészen keresztül csatlakozik.

32K— 12 V-nál nagyobb külső tápellátásra tervezett kimenet.

S.Q.W.- Programozható négyzethullámú jelkimenet.

SCL– Ezen a tűn keresztül történik az adatcsere az órával az I2C interfészen keresztül.

S.D.A.– Az óra adatai ezen a tűn keresztül kerülnek továbbításra.

VCC– Tápellátás a valós idejű órához, 5 volt szükséges. Ha ez a tű nem kap feszültséget, az óra alvó üzemmódba lép.

GND- Föld.

Csatlakozási rajz a DS3231 valós idejű órához és egy egyszerű programhoz

SDA és SCL érintkezők különböző Arduino kártyákon:

S.D.A. SCL
UNO A4 A5
Mini A4 A5
Nano A4 A5
Mega2560 20 21
Leonardo 2 3

Csatlakoztassuk a valós idejű óra modult az Arduino UNO-hoz. SDA - pin A4, SCL - tű A5.

A következő program alkalmas a modell működésére (egyszerűen átmásolhatja a programot az Arduino IDE-be):

#beleértve

void setup() (
késleltetés(300);
Serial.begin(9600);
time.begin();
}
void loop()



}
}

Ebben a vázlatban az idő egyszerűen visszaszámlál.

Először is az sktech-ben csatlakoztassa a könyvtárat iarduino_RTC.h.

Itt adja meg a modul pontos nevét, hogy megfelelően működjön.

Ennek eredményeként megkapjuk a DS3231 modul időkimenetét a portmonitorra. Órák, percek, másodpercek jelennek meg.

A következő vázlatban hozzáadunk egy függvényt beállítani az időt, amely lehetővé teszi a kezdeti visszaszámlálási idő beállítását.

#beleértve
iarduino_RTC time(RTC_DS3231);
void setup() (
késleltetés(300);
Serial.begin(9600);
time.begin();
time.settime(0,0,18,24,04,17,1); // 0 mp, 0 perc, 18 óra, 2017. április 24., hétfő
}
void loop()
if(millis()%1000==0)( // ha eltelt 1 másodperc
Serial.println(time.gettime("d-m-Y, H:i:s, D")); // megjelenítési idő
késleltetés(1); // szünet 1 ms-ig, hogy ne jelenjen meg többször az idő 1 ms alatt
}
}

A példában az idő 2017. április 24-én, hétfőn 0 másodperctől 0 perctől 18 órától kezdődik.

Leckék bejegyzései:

  1. Első lecke: .
  2. Második lecke: .
  3. Harmadik lecke: .
  4. Negyedik lecke: .
  5. Ötödik lecke: .
  6. Hatodik lecke: .
  7. Hetedik lecke: .
  8. Nyolcadik lecke: .
  9. Kilencedik lecke:

Ma folytatjuk a keresést a tökéletes valós idejű óra (RTC) chip után. alapján fogunk órákat készíteni. A kijelző kényelmesebb lesz a fejlesztéshez - LCD kijelző, amely a beállításokon kívül minden információt egyszerre jelenít meg. Ebben a formában az óra kényelmesen használható asztali lehetőségként.

Tehát nézzük magát a DS3231 chipet. A DS3231 egy valós idejű óra, rendkívül precíz mozgással (a gyártók választották ezt a szót) a beépített kvarc rezonátornak köszönhetően hőmérséklet-kompenzációval. Az adatátviteli interfész I 2 C. Ennek a mikroáramkörnek van egy bemenete a tartalék akkumulátor feszültségére is, a fő tápellátás kikapcsolásakor a mikroáramkör automatikusan átkapcsol a tartalék akkumulátorról történő működésre, a tartalék akkumulátor működésének pontossága nem érintett. Nagyon kellemes, nem? A DS3231 támogatja a másodpercek, percek, órák, a hónap napjai (dátum), a hét napjai, a hónapok és az évek számlálását (beleértve a szökőévet is). Támogatja a 12 és 24 órás formátumú munkát. 2 ébresztőóra van, amelyek konfigurálhatók és állapotuk figyelhető. A hőmérséklet-kompenzáció pontosságának beállítása. És két kimenet is - 32 kHz-en (a kimenet 32,768 kHz) és egy programozható kimenet 1 Hz-től 8,192 kHz-ig. Van még egy reset pin - RST. A valós idejű óra chip SO-16 kiszerelésben kapható. A tok elég nagy, de ha figyelembe vesszük, hogy már van benne kvarc, és hőmérséklet-kompenzált is, akkor nekem úgy tűnik, hogy a méretekkel minden rendben van. A DS3231-nek van egy ikertestvére DS3232 formájában, aminek azonban van még 2 lába. Mindez nagyon emlékeztet az NXP termékekre - PCA2129 és PCF2129 óralapkák. Hasonló hőmérséklet-kompenzált beépített kvarc rezonátor, mindkettő ugyanaz az iker, csak különböző számú n.c. tűk és hasonló funkciók a DS3231-hez képest az időmérőn kívül.

Az RTC DS3231 modulok formájában, a szükséges bekötéssel, valamint EEPROM chippel kiegészítve kapható, amelyre legtöbbször nincs is szükség, csak növeli a súlyt:

A modullapon a szükséges alkatrészeken kívül egy LED is található, aminek a funkciója a kapcsok tápellátásának jelzése. Valószínűleg csak a szépség miatt szállították.

Amit fontos tudni, ha ilyen valós idejű órachippel dolgozunk, az az, hogy hogyan lehet belőle adatokat kinyerni vagy oda írni. Az óra I 2 C interfésszel rendelkezik. Az adatok írásához (és ez az adatok olvasásához is szükséges) át kell adni a start feltételt (ezek a parancsok hardveres vagy szoftveres I 2 C segítségével kerülnek végrehajtásra mikrokontroller), majd adja át a chip címét a bitrekorddal, majd adja át annak a regiszternek a címét, amelyhez hozzá fogunk férni, majd egy bájt adatot vigyen át ebbe a regiszterbe, ha ezután még egy bájt adatot visz át, akkor az a következő regiszterbe írva stb. Ha végzett, teljesítenie kell egy megállási feltételt. A fentiek grafikus ábrázolása az ábrán:

Adatrögzítés szükséges a kezdeti beállításhoz, valamint az aktuális idő beállításához. Ezután folyamatosan adatokat kell kapnunk az aktuális időről és dátumról. Ehhez ki kell olvasni az ezeket az információkat tároló regiszterekből. Az olvasás két eljárásból áll: egy mutatót állít a kívánt regiszterre, és beolvassa. A kívánt regiszter mutatójának beállításához át kell adni a start feltételt, majd át kell adni a chip címét az írási bittel és egy bájtot a regiszter címével. Ezután vagy egy leállási feltétel, majd egy indítási feltétel, vagy csak egy újraindítás. Most a második eljárás közvetlenül a regiszterekből történő olvasás. Az indítás átvitelre kerül, majd egy olvasási bittel el kell küldeni a mikroáramkör címét, majd ki kell olvasni a regisztereket a kívánt számban, és a befejezés után továbbítani kell a stop feltételt. Ha a regiszter információi beolvasásra kerültek, a mutató automatikusan a következő regiszterre lép, anélkül, hogy a mikrokontroller (device master) szükségtelenné válna. Az ábra mindazt szemlélteti, amit fentebb elmondtunk az I 2 C interfész segítségével történő regiszterek olvasásával kapcsolatban:

Chip címe:

  • felvételhez - 0b11010000
  • olvasáshoz - 0b11010001

A C kód így fog kinézni:

// függvények az órával ============================================= =============== ==================================== ================= ======== // kezdeti beállítások inicializálása void RTC_init(void)( i2c_start_cond(); // i2c indítása i2c_send_byte(RTC_adr_write); // az eszköz címének átvitele, rögzítési mód i2c_send_byte(0x0E); // a memóriacím átvitele i2c_send_byte(0b00100000); // a hőmérséklet-átalakítás és a kimenet 1 Hz-en indítása i2c_send_byte(0b00001000); // ztop kimenet engedélyezése _i2cond(0b00100000); // // stop i2c ) // idő és dátum lekérése void RTC_read_time(void)( i2c_start_cond() ; // start i2c i2c_send_byte(RTC_adr_write); // eszköz címének átvitele, írási mód i2c_send_byte(0x00 átvitele); // i2c_stop_cond(); // i2c leállítása i2c_start_cond(); // i2c indítása i2c_send_byte(RTC_adr_read); // átviteli eszköz címe, olvasási mód sec = bcd(i2c_get_byte(0)); // másodpercek olvasása, ACKi_byte2 =cgetd (0)); // percek olvasása, ACK óra = bcd(i2c_get_byte(0)); / / óra beolvasása, ACK wday = bcd(i2c_get_byte(0)); // a hét napjának kiolvasása, ACK day = bcd(i2c_get_byte(0)); // a szám beolvasása, ACK hónap = bcd(i2c_get_byte(0)); // hónap olvasása, ACK év = bcd(i2c_get_byte(1)); // év olvasása, NACK i2c_stop_cond(); // i2c stop 0x00) ; // memóriacím átvitele i2c_send_byte(bin(sec1)); // 0x00 másodperc (célszerű másodperceket is megadni?) i2c_send_byte(bin(min1)); // 0x01 perc i2c_send_byte)(bin(hour1)) ; // 0x02 óra i2c_stop_cond(); // i2c leállítás ); // eszközcímek átvitele, rögzítési mód i2c_send_byte(0x03); // memóriacím átvitele i2c_send_byte(bin(wday)); // 0x03 a hét napja (vasárnap - 1, hétfő 2, kedd 3, szerda 4, Cs 5, P 6, Szo 7 ) i2c_send_byte(bin(day)); // 0x04 nap hónap i2c_send_byte(bin(month)); // 0x05 hónap i2c_send_byte(bin(year)); // 0x06 év_cond(_stop); // stop i2c ) // a hőmérséklet olvasása void RTC_read_temper(void)( i2c_start_cond(); // start i2c i2c_send_byte(RTC_adr_write); // az eszköz címének átvitele, írási mód i2c_send_byte(0x11); // a memória átvitele (); // i2c leállítása i2c_start_cond(); // i2c indítása i2c_send_byte(RTC_adr_read); // eszköz címének továbbítása, olvasási mód t1 = i2c_get_byte(0); // MSB hőmérséklet olvasása t2 = i2c_get_byte(1); // olvasás LSB hőmérséklet i2c_stop_cond (); // i2c leállítása t2=(t2/128); // eltolás 6-tal - pontosság 0,25 (2 bit) // eltolás 7-tel - pontosság 0,5 (1 bit) t2=t2*5; )

Ez az összes forráskód, amely a mikroáramkörrel működött, az órajel beállítását ez nem befolyásolta, mivel az óra napok óta egy másodpercet sem veszített.

Igen - nagyszerű funkció A DS3231 az, hogy ugyanaz a chip látja el a hőmérő funkcióit (egyébként hogyan lehet hőmérséklet-kompenzációt végrehajtani) és képes leolvasni az aktuális hőmérsékletet. A maximális hőmérsékleti felbontás 0,25 Celsius fok. Ezenkívül a hőmérséklet-frissítési időszak meglehetősen hosszú - körülbelül 1 perc. Igen, nem kell gyorsan frissítenünk.

A teljes óraszerkezet diagramja így néz ki:

A mikrokontrollert az Atmega8 széles körű elérhetősége és alacsony ára miatt választotta. Ez a mikrokontroller DIP-28 csomagban és SMD változatban is TQFP-32 csomagban használható. Az R3 ellenállásra azért van szükség, hogy megakadályozzuk a mikrokontroller spontán újraindulását, ha véletlenszerű zajt észlel a PC6 érintkezőjén. Az R3 ellenállás ehhez a tűhöz húzza a plusz feszültséget, megbízható potenciált teremtve rajta. A megjelenítéshez folyadékkristályos kijelzőt (LCD) használnak. Én a 2004A kijelzőt használtam - a 4 soros 20 karakter inkább a szépség kedvéért, így egy ismerősebb kijelző használható - 2 sor 16 karakter. Az LCD-kijelző négybites rendszerrel csatlakozik a mikrokontrollerhez. Az R2 változó ellenállás szükséges a kijelzőn megjelenő karakterek kontrasztjának beállításához. Ennek az ellenállásnak a csúszkáját elforgatva érjük el számunkra a legtisztább leolvasást a képernyőn. Az LCD-kijelző háttérvilágítása a kijelzőpanel „A” és „K” érintkezőiből áll. A háttérvilágítást az R1 áramkorlátozó ellenálláson keresztül kapcsolják be. Minél magasabb ez az érték, annál gyengébb a kijelző háttérvilágítása. Ezt az ellenállást azonban nem szabad elhanyagolni a háttérvilágítás károsodásának elkerülése érdekében. Az S1 - S4 gombok szabályozzák az órabeállításokat. A LED azt jelzi, hogy a riasztás kikapcsolt. A LED helyettesíthető valamilyen hangáramkörrel. Az R5 - R8 ellenállások felhúzhatóak, és szükségesek a négyszögletes impulzusok kialakításához az óralapka kapcsain. Ez az I2C protokoll megfelelő működéséhez is szükséges. Az áramkör táplálására egy L7805 lineáris stabilizátor chipet használnak; helyettesíthető a KR142EN5A öt voltos lineáris stabilizátor hazai analógjával, vagy használhat egy másik feszültségstabilizátor chipet az áramkörben való csatlakozásának megfelelően (például LM317 vagy kapcsolóstabilizátorok LM2576, LM2596, MC34063 és így tovább). Ezután az 5 voltot egy másik mikroáramkör stabilizálja - az AMS1117 olyan változatban, amely 3,3 voltos kimenetet ad. Az órachip az adatlap szerint 3,3 voltos feszültségről táplálkozik. A maximális feszültség azonban 5,5 volt. Ezért ezt a stabilizátort saját belátása szerint használhatja vagy sem. Az AMS1117 feszültségstabilizátor az ADJ változatra (AMS1117ADJ) is cserélhető - vagyis állítható változat, ezzel a választással kell beállítani a kívánt feszültségetkét, a mikroáramkörre csatlakoztatott ellenállás használatával, annak adatlapja szerint.

Az áramkör összeállítása és hibakeresése az ATmega8 mikrokontroller fejlesztőkártyájával történt:

A gombok célja:

  • S1 - kikapcsolja a riasztási jelzést, vagy bármely beállítási menüből kilép a főmenübe
  • S2- mikrokontroller reset
  • S3 - megváltoztatja az időt vagy a dátumot a beállítások menüben
  • S4 - lépjen be a beállítások menübe, és görgessen a menüben

A 32 kHz-es tűvel a kristályfrekvencia szabályozható. Ehhez a tűhöz csatlakoztatunk egy frekvenciamérőt vagy oszcilloszkópot, és szabályozzuk a frekvenciát:

Amint az az oszcillogram képernyőképen látható, a frekvencia hozzávetőlegesen 32,768 kHz-nek felel meg (körülbelül a frekvencia mérések felbontásának korlátai miatt, és „szemmel” nehéz ilyen pontosan meghatározni).

Az eredmény egy óra a következő jellemzőkkel rendelkezik:

  • időjelzés
  • dátum megjelenítése
  • a hét napjának jelzése
  • ébresztőóra tevékenység jelzése
  • 1 db ébresztőóra mikrokontroller jelkimenettel
  • környezeti hőmérséklet jelzése (csak pozitív hőmérséklet van szoftverben implementálva, a negatív hőmérséklet szerintem nem használ nekünk)
  • riasztás beállításai
  • időbeállítások
  • dátum beállítások
  • LCD kijelző háttérvilágítással
  • a beállítások elmentése és az óra folyamatos megjelenítése, ha a főkapcsoló ki van kapcsolva

Foglaljuk össze. A DS3231 valós idejű óra chip kiváló megoldás. A pontosság néhány DS1307-hez vagy magasabbhoz hasonlítható, de a PCA/PCF2129 továbbra is versenyezhet vele. Az általam áttekintett valós idejű óra chipek között ez a példány jelenleg az első helyen áll a funkcionalitás és a pontosság tekintetében.

Az Atmega8 mikrokontroller programozásához ismernie kell a biztosíték bitek konfigurációját (a programban készült képernyőkép):

A cikket kíséri az Atmega8 mikrokontroller firmware-je, a program áramköri kialakítása, valamint egy videó az óra működéséről (a kezdetben a riasztás kialszik - a LED világít).

Radioelemek listája

Kijelölés típus Megnevezés Mennyiség jegyzetÜzletA jegyzettömböm
IC1 MK AVR 8 bites

ATmega8

1 Jegyzettömbhöz
IC2 Valós idejű óra (RTC)

DS3231

1 Jegyzettömbhöz
VR1 Lineáris szabályozó

L7805AB

1 Jegyzettömbhöz
VR2 Lineáris szabályozó

AMS1117-3.3

1 Jegyzettömbhöz
VD1 Egyenirányító dióda

1N4148

1 Jegyzettömbhöz
C1 470 µF1 Jegyzettömbhöz
C2, C3, C5, C7 Kondenzátor100 nF4 Jegyzettömbhöz
C4 Elektrolit kondenzátor220 µF1 Jegyzettömbhöz
C6, C8 Elektrolit kondenzátor10 µF2 Jegyzettömbhöz
R1 Ellenállás

22 Ohm

1 Jegyzettömbhöz
R2 Trimmer ellenállás10 kOhm1 3296W-1-103LF

Sok készülék megköveteli a kronometrikus adatok (dátum, idő) folyamatos rögzítését, ezt a funkciót speciális elektronikus áramkörök, úgynevezett valós idejű órák látják el. Jelenleg egy valós idejű óra külön mikroáramkör formájában van megvalósítva, amelyhez hozzá kell adni egy kvarc rezonátort és egy autonóm tápegységet. Egyes mikroáramkörökben kvarc rezonátor van beépítve. Az egyik ilyen óra egy chipen DS3231SN az enyémnek vettem projektek . A példában egy valós idejű órát fogok csatlakoztatni egy kínai analóghoz Arduino UNO.

Ezek egy komplett ZS-042 modul, amely különféle eszközökhöz csatlakoztatható, nem csak az Arduino platformhoz.


A modul mikroáramkörre épül DS3231SN ami lényegében egy valós idejű óra. A régi óramodelltől eltérően, például a DS1307 chipen ez az óra belső kvarcrezonátort tartalmaz, aminek köszönhetően az óra pontos idővel rendelkezik.

Az Arduino órát a DS3231SN nélkül is megvalósíthatja, de ha az áramellátás megszakad, az időzítő értékei visszaállnak.Ugyanezek az órák tartalék tápellátással rendelkeznek, így ha az áram megszűnik, tovább működnek.

Az óra órákat, perceket, másodperceket, dátumokat, hónapokat, éveket tud számolni (2100-ig a szökőéveket veszik figyelembe). 12 vagy 24 órás üzemmódban működnek, két ébresztőórát tartalmaznak, és egy belső hőmérővel is rendelkeznek, amelynek tartománya -40 ° C és + 85 ° C között van. A különféle eszközökhöz való csatlakoztatáshoz az óra a I2C interfész.


A tűk elhelyezkedése és célja a ZS-042 modulon:

S.Q.W.- Programozható négyzethullámú jelkimenet.

SCLEzen a tűn keresztül adatcsere történik az órával az I2C interfészen keresztül.

S.D.A.Az óra adatai ezen a tűn keresztül kerülnek továbbításra.

VCCTápfeszültség valós idejű órához, 5 volt szükséges. Ha ez a tű nem kap feszültséget, az óra alvó üzemmódba lép.

GND- Föld.

A csatlakozáshoz Arduino UNO, Az óra SDA érintkezőjét az A4-es érintkezőhöz, az SCL-tűjét pedig az A5-öshöz kötjük. A GND(-) és VCC(+5v) érintkezők tápellátást biztosítanak.

SDA és SCL érintkezők különböző Arduino kártyákon:

S.D.A. SCL
UNO A4 A5
Mini A4 A5
Nano A4 A5
Mega2560 20 21
Leonardo 2 3

Tegyünk az órába egy CR2032 elemet, ezek az elemek a számítógépek BIOS-ának táplálására szolgálnak.

Amikor az USB-kábelt az Arduino-hoz csatlakoztatja, az órán lévő LED-nek világítania kell ERŐ"(piros LED).

Az óra Arduino IDE-n keresztüli programozásához könyvtárakat kell telepítenie.

Könyvtár letöltése Idő és DS1307RTC.

Az utolsó könyvtár a DS1307 lapkán lévő órára íródott, de interakciós protokolljai kompatibilisek a DS3231-gyel, így a könyvtár a mi óránkba illeszkedik.

A könyvtárakat le kell tölteni, ki kell csomagolni és el kell helyezni a mappába "könyvtárak" Az Arduino IDE indításakor a példákkal együtt meg kell jelenniük a " Minták».

Állítsa be a dátumot és az időt.

Ehhez másolja ezt a kódot az Arduino IDE-be.

A helyes beállításokhoz módosítani kell a sorban lévő adatokat

setTime(13;35;0;22;12;2016);



Zárójelben, vesszővel elválasztva, állítsa be a helyes értékeket: óra, perc, másodperc, nap, hónap, év. Az én példámban 13 óra 35 perc 0 másodpercre van beállítva, 2016. december 22. Töltse fel a vázlatot Arduino-ba.

Most az óra leolvasásának leolvasásához használhatja a következő példát: " Fájl» - « Minták» - « DS1307RTC» - « ReadTest"És mögött töltsd fel az Arduino-ba.

A megnyíló ablakban megjelenik az aktuális dátum és idő. Ha kikapcsolja az Arduino óramoduljának áramellátását, az Arduino nem tudja követni az értékeket, és egy idő után megjelenik az üzenet " ...olvasási hiba!"(pirossal kiemelve). Az áramellátás visszaállítása után a dátum és az idő visszaszámlálása folytatódik. A dátum és az idő nem lett visszaállítva, mert az óra CR2032 elemmel működött.