Ds1307 pievienošana avr mikrokontrollerim. DS1307 ķēdes pievienošana mikrokontrollerim, izmantojot TWI interfeisu. Manuāli kodā

DS1307 sauc arī par RTC (Real Time Clock). Šī mikroshēma ir reāllaika pulkstenis un kalendārs. Komunikācija ar mikroshēmu tiek veikta caur interfeisu I 2 C. Tās priekšrocība ir tā, ka tā darbojas (skaita laiku), kad galvenā strāva ir izslēgta no rezerves barošanas avota 3 volti (piemēram, no CR3022 akumulatora). Bet DS1307 ir viens trūkums: tas nepārbauda, ​​vai ievadītie dati ir pareizi. Lai strādātu ar mikroshēmu, jums būs nepieciešams minimāls komplekts: kvarcs ar frekvenci 32768 Hz, 3 voltu akumulators un divi 4,7 kOhm rezistori. Savienojuma shēma DS1307:

Darbs ar DS1307 BASCOM-AVR

Lai sāktu darbu ar mikroshēmu, jums jākonfigurē porti, kuriem mikroshēma ir pievienota; lai to izdarītu, izmantojiet komandu Konfig:
Sda konfigurācija =(Mikrokontrollera ports, kuram ir pievienota DS1307 mikroshēmas SDA kāja)
Config Scl =(Mikrokontrollera ports, kuram ir pievienota DS1307 mikroshēmas SCL kāja)
Piemēram:
Config Sda = Portb.1
Config Scl = Portb.0

Pēc portu konfigurēšanas varat sākt strādāt ar mikroshēmu: lasīt un rakstīt datus. Laiku un datumu no DS1307 mikroshēmas var nolasīt šādi:

I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte (mainīgais, kurā rakstām sekundes), Ack I2crbyte (mainīgais, kurā rakstām minūtes), Ack I2crbyte (mainīgais, kurā rakstām stundas), Ack I2crbyte (mainīgais, kurā mēs ierakstiet nedēļas dienas numuru), Ack I2crbyte (mainīgais, kurā rakstām datumu), Ack I2crbyte (mainīgais, kurā rakstām mēneša numuru), Ack I2crbyte (mainīgais, kurā rakstām gadu), Nack I2cstop

Pēc datu nolasīšanas tie jāpārveido decimālā formātā, piemēram:
(sekunžu mainīgais) = Makedec((sekunžu mainīgais) )
(minūtes mainīgs) = Makedec((minūtes mainīgs) )
(pulksteņa mainīgais) = Makedec((pulksteņa mainīgais) )
(nedēļas dienas mainīgais) = Makedec((nedēļas dienas mainīgais) )
(datuma mainīgais) = Makedec((datuma mainīgais) )
(mēneša mainīgais) = Makedec((mēneša mainīgais) )
(gada mainīgais) = Makedec((gada mainīgais) )

Tālāk ir sniegts piemērs, kā nolasīt laiku un datumu un pārvērst tos decimāldaļās.

I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte Seco , Ack I2crbyte Mine , Ack I2crbyte Hour , Ack I2crbyte Day , Ack I2crbyte Dat , Ack I2crbyte Dat , Ack I2crbyte ) Raktuves = Makedec(mine) Stunda = Makedec(stunda) diena = Makedec(diena) Dat = Makedec(dat) Mēnesis = Makedec(mēnesis) Gads = Makedec(gads)

Mēs esam iemācījušies nolasīt datus, tagad mēģināsim rakstīt datus uz DS1307. Kā šis:
(Mainīgais, ko mēs pierakstīsim) = Makebcd((Mainīgais, ko mēs pierakstīsim) )
I2cstart
I2cwbyte&HD0
I2cwbaits(Šūna, kurā ierakstīsim datus)
I2cwbaits(Mainīgais, ko mēs pierakstīsim)
I2cstop

Lūdzu, ņemiet vērā, ka komanda Makebcd pārvērš mainīgo binārā decimālā formātā. Šūnu numuri un apzīmējumi:

Šeit ir sekundes mainīgā rakstīšanas piemērs:
Seco = Makebcd (seco)
I2cstart
I2cwbyte&HD0
I2cwbaits 0
I2cwbyte Seco
I2cstop
Starp citu, jāņem vērā, ka pirmo reizi iedarbinot DS1307 (piemēram, pieslēdzot rezerves akumulatoru), mikroshēma sekundēs atgriezīs vērtību 80, kas nozīmē, ka pulkstenis ir apturēts. Lai tos palaistu, pierakstiet sekundēs vērtību 1. Ja DS1307, nolasot datus, atgriež vērtību 255 vai 168, tas nozīmē, ka mikroshēma nav pareizi pievienota vai nav rezerves akumulatora.

Praktiskais darbs ar DS1307 mikroshēmu

Tagad mēģināsim praktiski strādāt ar mikroshēmu DS1307: saliksim vienkāršu pulksteni ar laika iestatīšanu, izmantojot pogas. Lai to izdarītu, ņemsim pašu DS1307 mikroshēmu, Attiny2313 mikrokontrolleri, HD44780 kontrollera LCD indikatoru un vairākus atsevišķus komponentus. Saliksim vienkāršu diagrammu:

Un uzrakstīsim vienkāršu programmu, izmantojot iegūtās zināšanas:

$regfile = "attiny2313.dat" $crystal = 4000000 Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb .2 Config Lcd = 16 * 2 Config Pind.5 = Input Config Pind.4 = Input Config Sda = Portb.1 Config Scl = Portb.0 Dim Seco As Byte Dim Mine As Byte Dim Hour As Byte Initlcd Cls Kursors Off Do I2csStart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte Seco , Ack I2crbyte Mine , Ack I2crbyte Hour , Nack I2cstop Seco = Makedec(seco) Mine = Makedec(mine) Hour = Makedec(mine) Hour = Lodec(hour) urcate(hour) ":" ; Mans; ":" ; seco ; " " Ja Pind.5 = 0 then Incr Mine Mine = Makebcd(mine) I2cstart I2cwbyte &HD0 I2cwbyte 1 I2cwbyte Mine I2cstop Waitms 100 End If Pind.4 = 0 then Incr Hour Hour = Makebcd(stunda) I2byctew2HD I2byte Stunda I2cstop Waitms 100 End If Loop End

17. nodarbība

1. daļa

Reālā laika pulkstenis DS1307

Turpinām programmēšanas nodarbības MK AVR.

Un šodien mēs iepazīsimies ar ļoti labu mikroshēmu DS1307. Šī mikroshēma ir reālā laika pulkstenis (reālā laika pulkstenis vai RTC).

Arī tāpēc, ka saziņa starp mikrokontrolleri un šo mikroshēmu notiks, izmantojot interfeisu I2C, mēs vēlreiz pastiprināsim tēmu par šī autobusa programmēšanu.

Šo mikroshēmu piedāvā uzņēmums Dalasa, šeit ir tā spraudnis un galvenie tehniskie parametri

Šeit mēs redzam, ka mums ir kājas SDA un SCL, kuru mērķi mēs ļoti labi zinām. Ir arī tapas X1 un X2 kvarca rezonatora pieslēgšanai pie 32768 Hz, barošanas tapas - VCC un GND, izeja impulsiem, kas ilgst 1 sekundi vai cita frekvence atkarībā no noteiktu reģistru iestatījumiem, kā arī pozitīvs kontakts akumulatoram. kas ir pievienots, lai pulkstenis tikšķētu, kad galvenā strāva ir izslēgta. Mēs savienojam šī akumulatora negatīvo kontaktu ar kopējo strāvas vadu.

Mēs arī redzam, ka šī mikroshēma ir pieejama planārā un DIP pakotnēs.

Šo mikroshēmu var darbināt no 3 voltiem vai 5 voltiem.

Piekļuve šai mikroshēmai, izmantojot I2C saskarni, principā notiek tāpat. tāpat kā atmiņas mikroshēma, ko izmantojām pēdējā nodarbībā. Protams, būs dažas nianses, bet par to vēlāk.

Tā kā man šī mikroshēma ir uzstādīta tajā pašā modulī, kurā ir uzstādīta EEPROM mikroshēma, un mums ir viena apmaiņas kopne, tad DS1307 mikroshēma “atpazīs”, ka tā tiek adresēta, protams, adresē, kas atšķiras no tās. ka EEPROM mikroshēmā.

Šeit ir diagrammas par mikroshēmu, kas saņem un pārraida datus

Adrese, kurā mēs piekļūsim šai mikroshēmai, ir iezīmēta zilā krāsā.

Būtībā. Mēs neredzam lielas atšķirības ar EEPROM mikroshēmas diagrammām.

Vēl viena apstrādes atšķirība būs tāda, ka atmiņas adresēšana jau būs viena baita, jo atmiņas šūnas vai reģistrosŠajā mikroshēmā ir ļoti maz.

Tādi ir šie reģistri

Šo reģistru mērķis:

00h- sekundes. Sekundes tiek saglabātas binārā decimālā formātā. Tas ir, zemākie 4 biti glabā sekunžu vienības, bet augstākie trīs biti glabā desmitus. Ir arī SH bits - tas ir mikroshēmas sākuma bits.

01h- minūtes. Uzglabāts līdzīgi.

02h- universālāks reģistrs. Šeit tiek glabāts pulkstenis. Četros mazāk nozīmīgos bitos ir vienības, nākamajos augstākajos divos ir desmiti, nākamajā 6. bitā ir karogs, vai ir pēcpusdiena vai pirms pusdienlaika, 7. bitā ir uzglabāšanas režīms - 12 stundas vai 24 stundas.

03h- nedēļas diena. Saglabāts vismazāk nozīmīgajos 3 bitos, pārējie biti netiek izmantoti.

04h— šeit tiek saglabāta mēneša diena, arī binārā decimālā formātā. Četri vismazāk nozīmīgie biti satur vieniniekus, nākamie divi augstākie satur desmitus, pārējie biti netiek izmantoti.

05h- gada mēneša numurs - tiek saglabāts binārā decimālā formātā tāpat kā pulkstenis.

06h- gada numurs, un nevis pilns četrciparu, bet tikai divciparu skaitlis. Vismazāk nozīmīgie četri biti ir vieni, bet augstākie četri biti ir desmiti.

Mēs izmantosim šos septiņus reģistrus. Pēdējais reģistrs ir paredzēts impulsa frekvences konfigurēšanai pie mikroshēmas impulsa izejas; tas tiek darīts reģistra divos apakšējos bitos. pēc noklusējuma tā būs 1 Hz frekvence, ar to pietiek, lai mēs pamirkšķinātu kolu, tāpēc mēs neizmantosim šos bitus. SOWE un OUT biti tiek izmantoti arī, lai konfigurētu un iespējotu kvadrātveida viļņu formu.

Projekts darbam ar šo mikroshēmu tika izveidots parastajā veidā ar nosaukumu MyClock1307, no turienes tika noņemti faili, kas saistīti ar EEPROM, un faili tika pievienoti RTC.c Un RTC.h.

#ifndefMAIN_H_

#definētMAIN_H_

#definētF_CPU8000000UL

#iekļauts

#iekļauts

#iekļauts

#iekļauts

#iekļauts

#iekļauts"usart.h"

#iekļauts"twi.h"

#iekļauts"RTC.h"

#endif/* MAIN_H_ */

Galvenajā failā MyClock1307.c izveidosim globālos mainīgos, lai saglabātu laiku, datumu un nedēļas dienu un pēc tam pilns saturs pēc visu nevajadzīgo lietu noņemšanas tajā būs šāds

#iekļauts"galvenais.h"

neparakstītscharsek, min, stunda, diena, datums, mēnesis, gadā;

starptgalvenais( nederīgs)

I2C_Init();

USART_Init(8);

Kamēr(1)

Viss, kas paliek no iepriekšējā koda, ir I2C un USART inicializācija.

Tagad mums vispār kaut kā jāiedarbina mikroshēma. Ja mikroshēma ir jauna vai nekad nav lietota, vai arī kāds speciāli kādam nolūkam ir mainījis CH bita vērtību, tad tā vēl “nestrādā”.

Nu, kopumā, tiklīdz mēs iestatīsim visas vērtības mikroshēmas reģistros, tas sāksies un sāksies mūsu pulkstenis.

Savienojums vai shēma tiek izmantota arī no iepriekšējās nodarbības, tas ir, mēs skatīsimies laiku caur USART kopni termināļa programmā.

Tāpēc faktiski, izmantojot savas zināšanas no iepriekšējās nodarbības, mēs rakstīsim, lai uzrakstītu funkciju laika iestatīšanai.

Pirmkārt, mēs, protams, izturēsim START nosacījumu

//Iestatiet laiku

I2C_StartCondition();

Tad mēs pārsūtām adresi ar rakstīšanas bitu 0

I2C_StartCondition();

I2C_SendByte(0b11010000);

Dosimies uz adresi 0, kas nozīmē to atmiņas daļu, kurā atrodas pats pirmais reģistrs

I2C_SendByte(0b11010000);

I2C_SendByte(0); //Dodieties uz 0x00

Pirms jebkādu vērtību ierakstīšanas mikroshēmas reģistros atceramies, ka vispirms skaitļi ir jāpārvērš BCD formātā, kas būs ērti reģistriem. Lai to izdarītu, mēs pāriesim uz failu RTC.c un uzrakstīsim šādu funkciju. Tas būs ļoti vienkārši un neprasa nekādus paskaidrojumus.

neparakstītscharRTC_ConvertFromBinDec( neparakstītscharc)

{

neparakstītscharch= (( c/10)<<4)|( c%10);

atgrieztiesch;

}

Nu, uzrakstīsim arī apgrieztā tipa funkciju, pārvēršot skaitli no binārā-decimālā formāta uz decimālo. Ar tās palīdzību mēs, gluži pretēji, pārveidosim lasīšanas laika rādījumus mūsu uztverei ērtā formā (HRI - cilvēka lasāms interfeiss)

neparakstītscharRTC_ConvertFromDec( neparakstītscharc)

{

neparakstītscharch= (( c>>4)*10+(0b00001111&c));

atgrieztiesch;

}

Arī šeit viss ir ļoti skaidrs, baita augsto tetradu pārbīdām pa labi, reizinim ar desmit un pievienojam zemo tetradu (augsto tetradu maskējam ar nullēm)

Ierakstīsim failā šo funkciju prototipus RTC.c

#iekļauts"galvenais.h"

neparakstītscharRTC_ConvertFromDec( neparakstītscharc); //pārveidot BCD skaitli decimāldaļās

neparakstītscharRTC_ConvertFromBinDec( neparakstītscharc);

Programmētāju, RTC DS1307 moduli ar atmiņas mikroshēmu un USB-TTL adapteri var iegādāties šeit:

Programmētājs (uzticams pārdevējs) USBASP USBISP 2.0

Noskaties VIDEO PAMĀCĪBU (spied uz attēla)

Ziņas skatījumi: 7354

Atsauksmes par šo pulksteni internetā ir vispretrunīgākās. Daži saka, ka pulkstenis ir brīnišķīgs, savukārt citi to sauc par sliktu Dalasas radījumu. Un tāpēc, lai kliedētu visas nepatiesās baumas, es izņēmu mikruku no glabāšanas un sāku eksperimentēt.

Īpatnības:

  • Ļoti zems enerģijas patēriņš. Ražotājs sola 10 gadu pulksteņa darbību no viena standarta akumulatora. CR2032
  • 56 baiti atmiņa lietotāja datu glabāšanai. Es domāju, ka tas nav īpaši nepieciešams risinājums, bet kādam tas var noderēt.
  • Programmējama izeja ārējo ierīču pulksteņa nodrošināšanai. Var izvadīt 1 Hz, 4,096 kHz, 8,192 kHz un 32,768 kHz.
  • 24 stundu un 12 stundu režīms

Pinout

Pulksteņa tapas atrodas šādi:

X1, X2— tapas kvarca rezonatora pieslēgšanai ar frekvenci 32,768 kHz
VBAT— Izeja 3 voltu rezerves akumulatora pievienošanai
GND- Zeme
S.D.A.- i2c kopnes datu līnija
SCL— i2c autobusu pulksteņa līnija
SQW/OUT– izejas signāls ārējo ierīču pulksteņrādīšanai
VCC- 5 voltu barošanas avots

Savienojums ar kontrolieri
Iesiešana ir minimāla. Jums būs nepieciešams 32,768 kHz kvarcs, pāris rezistoru, lai darbinātu i2c kopni, un trīs voltu akumulators.

Pareizs dēļa izkārtojums
Pulksteņa precizitāte un pat pulksteņa veiktspēja kopumā ir atkarīga no iespiedshēmas plates izkārtojuma. Dalasa savā datu lapā iesaka līdz minimumam samazināt vadu garumu no mikroshēmas līdz kvarca rezonatoram un ieskaut šos vadītājus ar taisnstūri, kas savienots ar zemi. Turklāt uzticamības labad es pielodēju vadus, kas iet uz zemi, pie kvarca korpusa un paralēli barošanas blokam ievietoju 0,1 uF kondensatoru.

Starp citu, tas var darboties bez kvarca. Lai to izdarītu, kājai X1 tiek piegādāts ārējais pulksteņa signāls ar frekvenci 32,768 kHz, un X2 paliek gaisā.

Pulksteņa atmiņas organizēšana
Šī miniatūra ierīce ir aprīkota ar 64 baitu atmiņu. Pirmie astoņi baiti darbojas. Tie saglabā laiku, datumu, nedēļas dienu. Pārējais tiek piešķirts lietotāja vajadzībām. Tajos var saglabāt, piemēram, dažus iestatījumus vai ko citu. Protams, kad tiek zaudēta rezerves jauda, ​​visa šajā atmiņā esošā informācija tiek iznīcināta. Viss darbs ar pulksteni (lasīšana un laika/datuma iestatīšana) ir saistīts ar nepieciešamo atmiņas šūnu nolasīšanu un rakstīšanu.

Visi atmiņā esošie skaitļi tiek saglabāti binārā decimālā formātā. Tas nozīmē, ka vienā baitā var saglabāt divus ciparus. Piemēram, skaitlis 0x23 satur skaitli 2 un skaitli 3. Katram skaitlim tiek piešķirti 4 biti. Kāpēc tas tiek darīts? Ērtībai un atmiņas taupīšanai. Papildus laikam un datumam atmiņā tiek saglabāti vairāki iestatījumu biti:

  • Pulksteņa apturēšana- kontrolē pulksteni. Kad bits ir iestatīts, pulkstenis apstājas. Lai palaistu pulksteni, šim bitam jāraksta 0. Pēc rezerves baterijas pievienošanas šis bits tiek iestatīts un pulkstenis laiku neskaita! Jums tas ir jāatceras.
  • 24/12 - šis bits pulksteņa režīma izvēlei. Ja šis bits ir vienāds ar vienu, tiek izmantots 12 stundu režīms. Citādi 24 stundas. Ja tiek izmantots 12 stundu režīms, piektais bits tagad norāda AM vai PM. Ja bits ir 1, tas nozīmē PM. 24 stundu režīmā šis bits tiek izmantots, lai saglabātu desmitiem stundu kopā ar 4. bitu.
  • Izvade— kontrolē SQW/OUT posma stāvokli. Uzgalis ir iestatīts - baļķis atrodas uz kājas 1. Atiestatīt - uz kājas 0. Lai kontrolētu šādā veidā, uzgalis SQWE ir jāatiestata.
  • SQWE- kad bits ir iestatīts, uz SQW/OUT kājas parādās taisnstūrveida impulsi.
  • RS1, RS0— šie biti nosaka impulsa frekvenci. Frekvences atkarība no bitu kombinācijas ir parādīta tabulā:

Programmatūra

Lai strādātu ar pulksteni DS1307, tika izveidota vienkārša bibliotēka, kas satur šādas pamatfunkcijas:

DS_start— iedarbina pulksteni. Varat arī sākt pulksteni, iestatot laiku.
DS_stop- aptur pulksteni
DS_set_time — Laika iestatīšana. Pirms procedūras izsaukšanas jums jāievada sekundes tmp1, minūtes tmp2 un stundas tmp3. Pulkstenis 24 stundu formātā.
DS_get_time: — lasīšanas laiks no pulksteņa. sekundes tiks ierakstītas tmp1, minūtes tmp2, stundas tmp3
DS_get_date:— datuma nolasīšana no pulksteņa. Diena tiks ierakstīta tmp1, mēnesis tmp2, gads tmp3
DS_set_date: — datuma iestatīšana. Pirms procedūras izsaukšanas jums jāievada diena tmp1, mēnesis tmp2 un gads tmp3 (pēdējie 2 cipari)

Laika un datuma iestatīšanas/lasīšanas rutīnas var pieņemt/atgriezt ievades datus BCD un decimālā formātā. Lai izvēlētos vēlamo formātu, katrā procedūrā ir jākomentē vai jāatmet trīs rindiņas (kodā par to ir piezīmes).

Testa programma ļauj vadīt pulksteni, izmantojot UART (ātrums 9600, kontrolieris darbojas ar 8 MHz). Startējot, nekavējoties tiek parādīts laiks, datums un uzvedne ievadīt komandas no 1 līdz 3. Izvēloties opciju 1, laiks/datums tiek nolasīts vēlreiz. 2. iespēja ļauj iestatīt laiku, bet 3. iespēja - datumu. Ja vēlaties mēģināt spēlēt ar pulksteni, avota arhīvā ir iekļauts simulācijas fails.

Precizitāte
Šeit daudz kas ir atkarīgs no izmantotā kvarca un dēļa izkārtojuma. Datu lapā ir norādīts, ka kvarca kapacitātei jābūt 12,5 pF. Viņi saka, ka vislabāk ir izmantot kristālus no mātesplatēm. Lai koriģētu gājienu, jūs varat pielodēt apgriešanas kondensatoru pie rezonatora un izmantot to, lai mainītu frekvenci nelielās robežās. Man personīgi šis pulkstenis strādā divas dienas un atpaliek par 3 sekundēm. Kaut kas man saka, ka problēma ir kvarca ietilpībā, es izmēģināšu citu un ziņošu.

Secinājums
Nav slikts pulkstenis. Ideāli piemērots amatieru lietošanai. Lai gan daži raksta par kļūmēm, es ar tām vēl neesmu saskāries.

Atjaunināts 23.07.2018. Sveiki visiem. Lai strādātu ar pulksteņiem, pēdējā rakstā mēs apspriedām TWI saskarni, uz kuru mēs šodien atsauksimies. Nu sāksim. Šis pulkstenis ir saderīgs ar TWI, t.i. datu apmaiņas princips autobusā būs tāds pats kā mēs apsvērām.

Zemāk redzamajā attēlā ir parādīta tapu atrašanās vieta, apraksts un mūsu pulksteņa vai, kā mēs to vēlāk sauksim, RTC (Real-time clock) - reāllaika pulksteņa vai laika impulsu ģeneratora - izskats. Šī "ierīce" DS1307 Skaita sekundes, minūtes, stundas, mēneša dienu, mēnesi, nedēļas dienu un gadu, ieskaitot garos gadus. Kalendārs ir spēkā līdz 2100. gadam. Domāju, ka mūsu mūžam pietiks :).

Kā redzams no apraksta, kad ārējā barošana ir izslēgta, ir ieeja avārijas akumulatora jaudai. Šajā režīmā RTC atbalsta tikai tā galveno mērķi - laika noteikšanu, bez ārējiem pieprasījumiem. Akumulatora barošanas spriegumam jābūt 2–3,5 V. Tehniskajā aprakstā teikts, ka ar uzlādi, kas pārsniedz 48 mAh, 25 grādu temperatūrā mūsu ķēde darbosies aptuveni 10 gadus. Vairāk nekā nepieciešams. Zemāk esošajā attēlā parādīts CR2032 “planšetdators” un stiprinājums, ko mēs izmantosim.

Tagad apskatīsim ārējo barošanas avotu. Pulksteņa darba spriegums ir 5 V ar nelielu diapazonu no 4,5 - 5,5 V. Akumulatora spriegums 3V (minimums 2, maksimums 3,5V) RTC darbība ir sadalīta trīs sprieguma režīmos:

1. Vcc=5V – lasīt, rakstīt, skaitīt;
2. Vcc= zem 1.25*Vbat, bet virs Vbat +0.2V - tikai bateriju skaitīšana no ārējā barošanas.
3. Vcc zem Vbat: RTC un RAM pārslēdzas uz akumulatora enerģiju. Patēriņš aktīvā stāvoklī ir 1,5 mA, no akumulatora 500-800 nA.
Spriegums informācijas pārraidīšanai/saņemšanai:
Loģika 0: -0,5V - +0,8V
Loģika 1: 2,2 V – Vcc+0,3 V

Tāpat kā iepriekšējās ziņās, mēs mēģināsim to palaist programmā Proteus. Atkļūdosim kodu. Un mēs visu pārnesim uz aparatūru. Zemāk ir savienojuma shēma.

Kur SQW/OUT ir pulksteņa izvade, ko var ieprogrammēt izvades frekvencēm 1 Hz, 4,096 Hz, 8,192 Hz un 32,768 Hz. Tie. var izmantot, lai ārēji pārtrauktu kontrolieri ar frekvenci 1 s. Ļoti noderīga funkcija. Bet mums tas nebūs vajadzīgs. Starp citu, tas ir arī atvērts kolektors, tāpēc ir nepieciešams uzvilkšanas rezistors. Nominālā 4,7 kOhm.

Pins X1 un X2 – tiem pievienojam kvarca rezonatoru ar frekvenci 32,768 kHz. Vai arī varat izmantot ārēju pulksteņa ģeneratoru ar tādu pašu frekvenci. Bet šajā gadījumā kontakts X1 ir savienots ar signālu, un X2 paliek nesavienots (karājās gaisā.).

Nu, SDA un SCL secinājumi, ar kuriem mēs tikāmies pēdējā rakstā.

Nedaudz pakavēsimies pie rezonatora (attēls zemāk). Ko var saukt par pulksteņa sirdi un no kuras ir atkarīga kustības precizitāte. Paša rezonatora kvalitāte ir uz ražotāja sirdsapziņas, taču no savas puses mēs varam samazināt ārējo faktoru radīto kļūdu, ja ievērosim šādus rezonatora izvietošanas ieteikumus:

2. Ja iespējams, arī ceļa platums ir jāsamazina, lai samazinātu iespējamību saņemt traucējumus no citiem avotiem.

3. Ap kristālu ir jānovieto gredzenveida ķēde, kas palīdz izolēt kristālu no trokšņa.

4. Ievietojiet vadītājus gredzenā un pievienojiet tos zemei.

5. Pielodējiet rezonatoru pie zemes. Ja zeme ir pareizi izkārtota un ir pārliecība.

Zemāk esošajā attēlā ir parādīta ātrā ledus kontūra un atrašanās vieta uz zemes.

Mēs izdomājām, kā izveidot savienojumu. Dosimies tālāk un izdomāsim, kā ar to strādāt. RTC ir programmējams, un tam ir 8 baiti īpašu reģistru tā konfigurācijai un 56 baiti nemainīga statiskā atmiņa. Informācijas apmaiņai nepieciešama 2 vadu datu kopne, t.i. seriālā datu kopne - par kuru mēs runājām pēdējā rakstā. Tātad, lai sāktu, apskatīsim datu lapu. Kas mums nepieciešams:

Reģistrācijas tabula. Attēls zemāk. Pirmie astoņi reģistri ir paredzēti mūsu pulksteņa izvadīšanai un programmēšanai. Piekļūstot 7. bitam (CH) adresē 00H un iestatot to uz 0, mēs iedarbinām pulksteni. Vēlos atzīmēt, ka reģistru konfigurācija var būt jebkura, tāpēc, pirmo reizi startējot, tas ir jākonfigurē atbilstoši savām prasībām. Atlikušie septiņi biti ir viens un desmitiem sekunžu.

01H – minūtes.
02H – regulējams pulkstenis:
— 6. bits — ar 1 izvades 12 stundu formātu, 0–24.
— 5. bits — plkst. 1 (ar 12 stundu formātu) pēcpusdienā, 0:00
— 5. bits — (24 stundu formātā) šī ir otro desmit stundu (20–23 stundu) izvade.
— Bit4 ir pirmās desmit stundas, atlikušie biti ir stundu vienības.
03H – nedēļas diena;
04H – datums;
05H – gada mēnesis
06H – gads.

Nu, pēdējais reģistrs ir 07H. Šis reģistrs ir vadības reģistrs. Kur OUT ir atbildīgs par SQW/OUT tapas kontroli. Zemāk ir izvades iespējošanas tabula.

ĀRĀ
SQWE
SQW/OUT
1
0
1
0
0
0

SQWE - ja šis bits ir iestatīts uz 1, impulsi ar noteiktu frekvenci tiek izvadīti uz izejām, ko iestata RS1 un RS0 biti.

Šis secinājums mums projektā nebūs noderīgs. Lai gan es uz tāfeles izklāju tam celiņu. Eksperimenta kārtā tas var tikt pielietots kaut kur nākotnē, jo šeit jūs varat veikt 1 sekundes pārtraukumu.

Tagad, kad mums ir visa nepieciešamā informācija, rakstīsim funkcijas darbam ar pulksteni. Mēs arī uzsāksim projektu Proteus . Kas izskatīsies šādi:

Lūdzu, ņemiet vērā, ka Proteus rezonators nav jāsavieno ar pulksteni (apvilkts sarkanā krāsā).

Attēlā parādīts pulksteņa terminālis, kas parāda laiku, kas savukārt ir saistīts ar sistēmas laiku. I2C vai TWI protokola atkļūdotāja terminālis, kas parāda signāla nosūtīšanas un saņemšanas laiku, kur D0 ir nosūtītā komanda, D1 ir saņemtā komanda. Zemāk es parādīšu termināļa ekrānuzņēmumus ar programmas rezultātu.

Programma. Ņemot vērā pulksteņa pamatiestatījumus, mēs uzrakstīsim inicializācijas funkciju.

/*Inicializācijas funkcija ietver datu apmaiņas ātruma iestatīšanu, izmantojot formulu (iepriekšējā rakstā), priekšskalera iestatīšanu un TWI moduļa ieslēgšanu*/
Void init_DS1307 (neesošs)
{
TWBR = 2; /*Ar frekvenci 1 MHz */
TWSR = (0<< TWPS1)|(0 << TWPS0); /*Predivisor by 64*/
TWCR |= (1<< TWEN); /*Iespējot TWI moduli*/
}

Void write_DS1307 (uint8_t reg, uint8_t laiks)/*mēs nododam divus parametrus: reģistra adresi, kuram piekļūsim, un pārsūtīto informāciju*/
{
/* Izveidojiet START stāvokli, iestatot vadības reģistra bitus */
TWCR = (1<
/*Ļauj darboties TWEN modulim; Ģenerēt sākuma stāvokli TWSTA; Atiestatīt TWINT karogu */
/*Gaidām starta nosacījumu, lai pabeigtu formēšanos, t.i. līdz karoga iestatīšanai statusa kods = 08*/
while (!(TWCR & (1<
/*Tālāk nosūtām adrešu paketi (ierīces adresi). Paketes saturs tiek ielādēts TWDR reģistrā*/
TWDR = 0xd0; /*0b1101000 + 0 – adrese + rakstīšanas bits*/
/*Atiestatīt karogu, lai pārsūtītu informāciju*/
TWCR = (1<
/*Gaida karoga uzstādīšanu*/
while (!(TWCR & (1<
/*iziet reģistru, kuram piekļūsim*/
TWDR = reg;
TWCR = (1<
while (!(TWCR & (1<
/*Nodot informāciju, kas jāieraksta reģistra baitā*/
TWDR = laiks;
TWCR = (1<
while (!(TWCR & (1<
/*veido STOP stāvokli*/
TWCR = (1<
}

Šajā funkcijā mēs nodevām trīs baitus, ierīces adresi, reģistra adresi un informācijas baitu, lai rakstītu šajā reģistrā, un ģenerējām STOP stāvokli.

Paliek pēdējā lasīšanas funkcija. Zemāk ir lasīšanas formāts.

Šī funkcija veic ierīces adreses baita + rakstīšanas bita, reģistra adreses baita pārsūtīšanu, lai uz to iestatītu rādītāju, POVSTAR nosacījuma izpildi, ierīces adreses baita + lasīšanas bita pārsūtīšanu, reģistra nolasīšanu, kura adrese mēs pārskaitījām agrāk.

Ja piekļūstam pulkstenim lasīšanas formātā, tad, kad atkal piekļūstam pulkstenim, rādītājs pārvietojas par vienu baitu uz leju, ieskaitot 56 baitus RAM, no 00H līdz 3FH. Kad ir sasniegta pēdējā adrese, rādītājs pārvietojas uz adresi 00.

/*Funkcija datu nolasīšanai no DS1307*/
uint8_t read_DS1307 (uint8_t reg)/*Nodod reģistra adresi*/
{
uint8_t laiks;
/*veido START statusu*/
TWCR = (1<
while (!(TWCR & (1<
TWDR = 0xd0; /*Pārsūtīšanas adrese + rakstīšanas bits*/
TWCR = (1<
while (!(TWCR & (1<
TWDR = reg; /*Reģistrācijas adrese*/
TWCR = (1<
while (!(TWCR & (1<
/*veido POVSTAR štatu*/
TWCR = (1<
while (!(TWCR & (1<
TWDR = 0xd1; /*Pārsūtīšanas adrese + lasīšanas bits*/
TWCR = (1<
while (!(TWCR & (1<
/*lasīt datus*/
TWCR = (1<
while (!(TWCR & (1<
laiks = TWDR;
laiks = (((laiks & 0xF0) >> 4)*10)+(laiks & 0x0F);
/*veido STOP stāvokli*/
TWCR = (1<
atgriešanās laiks;
}

Tātad iepriekš mēs uzrakstījām trīs funkcijas, kas mums vajadzīgas darbam ar pulksteni. Izmantojot šīs funkcijas, mēs palaidīsim programmu Proteus. Parādīsim, piemēram, datumu.

#iekļauts
#iekļauts
uint8_t laiks;
void init_DS1307 (neesošs);
uint8_t read_DS1307 (uint8_t reg);
Void write_DS1307 (uint8_t reg, uint8_t laiks);
int galvenais (neesošs)
{
DDRC = 0 × 00; /*Iestatīt portu kā ievadi*/
PORTC = 0xFF; /*Pastipriniet pretestību*/
init_DS1307;
kamēr (1)
{
_delay_ms(50);
lasīt_DS1307 (0×04); /*Lasīt datumu reģistru*/
}
}

Zemāk ir programmas izpildes rezultāts datuma nolasīšanai.

I2C atkļūdotāja logā ( TWI ) redzams, ka vispirms uz RTC tiek nosūtīta reģistra adrese (zaļš aplis), šajā gadījumā 04, kas atbild par mēneša datumu, un pēc tam pulkstenis pārraida atbildi 21 (sarkans aplis).

Kad iedarbināsim pulksteni gludeklī, mums būs jāievada pašreizējais laiks. Tālāk ir parādīts minūšu maiņas programmas piemērs.

kamēr (1)
{
_delay_ms(500);
lasīt_DS1307(0×01); /*Izlasi minūti*/
_delay_ms(500);
rakstīt_DS1307(0×01, 15); /*Pieraksti nepieciešamo minūti*/
_delay_ms(500);
lasīt_DS1307(0×01); /*Izlasi minūti*/
}

Attēlā parādīts, ka tiek atvērts pirmais reģistrs 01, tiek nolasīta minūte 23. Tālāk mēs izmantojam rakstīšanas funkciju un ievadām vērtību 15. Ar nākamo lasīšanas funkciju pulksteņa displejā ir vērtība 15.

Nu, pēdējais programmas piemērs ir visu reģistru vērtību izvade

kamēr (1)
{
delay_ms(500);
lasīt_DS1307(0×00);
_delay_ms(500);
lasīt_DS1307(0×01);
_delay_ms(500);
lasīt_DS1307 (0×02);
_delay_ms(500);
lasīt_DS1307 (0×03);
_delay_ms(500);
lasīt_DS1307 (0×04);
_delay_ms(500);
lasīt_DS1307 (0×05);
_delay_ms(500);
lasīt_DS1307 (0×06);
_delay_ms(500);
}

Zemāk redzamajā attēlā redzams, ka tika parādīti 7 reģistru dati.

Projekta pirmkods ir pievienots:

(Lejupielādes: 601 persona)

Tas ir viss. Nākamajā rakstā mēs savienosim aparatūras pulksteni, parādīsim laiku uz indikatora un iepazīsimies ar bināro decimālo formātu darbam ar pulksteni. Čau visiem.

Reālā laika aprēķins sekundēs, minūtēs, stundās, mēneša datumos, mēnešos, nedēļas dienās un gados, ņemot vērā kārtējā gada augstumu līdz 2100. gadam.

56 baiti nepastāvīgas RAM datu glabāšanai

2 vadu seriālais interfeiss

Programmējams kvadrātveida impulsu ģenerators. Var izvadīt 1 Hz, 4,096 kHz, 8,192 kHz un 32,768 kHz.

Automātiska galvenā barošanas avota izslēgšanas un rezerves pieslēgšanas noteikšana

24 stundu un 12 stundu režīms

Patēriņš ne vairāk kā 500 nA, ja to darbina rezerves akumulators 25C° temperatūrā

Mikroshēma ir pieejama astoņu kontaktu DIP un SOIC pakotnēs. Pinout visiem ir vienāds. Zemāk es sniegšu rindas no datu lapas, lai pabeigtu attēlu.

Mikroshēmas dokumentācija (datu lapa)

Piespraudes piešķiršana:

. X1, X2- kalpo, lai pievienotu 32,768 kHz kvarca rezonatoru

. Vbat- Ievade jebkuram standarta trīs voltu litija akumulatoram vai citam barošanas avotam. Normālai DS1307 darbībai akumulatora spriegumam jābūt diapazonā no 2,0 ... 3,5 V. Litija akumulators ar ietilpību 48 mAh vai vairāk atbalstīs DS1307, ja nav strāvas.
ilgāk par 10 gadiem 25°C temperatūrā.

. GND- vispārējs mīnuss

. Vcc- Šī ir +5V ieeja.Ja barošanas spriegums ir virs 1,25 * VBAT, ierīce ir pilnībā iespējota un datus var lasīt un rakstīt. Ja ierīcei ir pievienots 3 V akumulators un Vcc ir mazāks par 1,25 * VBAT, lasīšana un rakstīšana ir aizliegta, bet laika noteikšanas funkcija turpina darboties. Kad Vcc nokrītas zem VBAT, RAM un RTC pārslēdzas uz akumulatora enerģiju VBAT.

. SQW/OUT- Izejas signāls ar taisnstūrveida impulsiem.

. SCL- (Serial Clock Input — seriālā pulksteņa ievade) — izmanto, lai sinhronizētu datus, izmantojot seriālo interfeisu.

. S.D.A.- (Serial Data Input/Output) - ievades/izvades tapa divu vadu seriālajam interfeisam.

Darbs ar SQW/OUT tapu.

Vispirms apskatīsim DS1307 reģistra struktūru.

DS1307 mikroshēmas reģistra struktūra

Mūs interesē “Kontroles reģistrs”, kas atrodas adresē 0x7, jo tas nosaka SQW/OUT tapas darbību.

Ja SQWE bits = 1, tad sākas taisnstūrveida impulsu veidošanās, ja SQWE = 0, tad izejas izvade būs OUT bita vērtība.

RS0 un RS1 biti ir atbildīgi par impulsa frekvenci, proti:

RS0 RS1 Biežums
0 0 1 Hz
0 1 4,096 kHz
1 0 8,192 kHz
1 1 32,768 kHz

Šeit ir piemērs:

Ja jāsāk ģenerēt taisnstūrveida impulsus ar frekvenci 1 Hz, tad heksadecimālajā skaitļu sistēmā jānosūta baits 00010000 vai 0x10 uz mikroshēmas 0x7 reģistru, kura adrese ir 0x68.

Izmantojot bibliotēku Vads.h, to var izdarīt šādi:

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

Savienojums ar Arduino:

Tapas, kas atbild par I2C saskarni Arduino plāksnēm, kuru pamatā ir dažādi kontrolleri, atšķiras.

Nepieciešamās bibliotēkas:

darbam ar DS1307: http://www.pjrc.com/teensy/td_libs_DS1307RTC.html
darbam ar laiku: http://www.pjrc.com/teensy/td_libs_Time.html

Laika iestatīšana

. Manuāli kodā

Laiks tiek manuāli iestatīts programmas kodā un augšupielādēts Arduino platē. Šī metode nav visprecīzākā, jo Kompilācijas un ielādes laiki var atšķirties.

Koda paraugs

#iekļauts #iekļauts nederīgs uzstādīt () { Seriāls.begin(9600); kamēr (! Seriāls ) ; // Tikai Leonardo dēlim // iegūt laiku no RTC Seriāls //sinhronizācija neizdevās cits Seriāls.println("RTC ir iestatījis sistēmas laiku"); //instalēt manuāli 16.02.2016 12:53 TimeElementste; te.Second = 0; //sekundes te.Minūte = 53; //minūtes te.Stunda = 12; //stundas te.Diena = 16; //diena te.Mēnesis = 2; // mēnesis te.Gads = 2016 - 1970; //gads bibliotēkā tiek skaitīts no 1970. gada laiks_t laiksVal = makeTime(te); RTC .set(timeVal); setTime(timeVal); ) spēkā neesošs cilpa() ( digitalClockDisplay(); //izvades laika aizkave (1000); ) void digitalClockDisplay() ( Seriāls Seriāls.print(" "); Seriāls.print(day()); Seriāls.print(" "); Seriāls.print(month()); Seriāls.print(" "); Seriāls.print(year()); Seriāls //izvades laiks, izmantojot ":" Seriāls.print(":"); ja (cipari< 10) Seriāls.print("0"); Seriāls.print(cipari); )

. Uzstādīšana no"Portu monitors"

Precīzāka laika iestatīšanas iespēja. Kontrolierim darbojoties, laiks tiek iestatīts, izmantojot "porta monitoru".

Atveram monitoru, ievadām datus vajadzīgajā formātā, apskatām atskaites pulksteni, ķeram brīdi un spiežam “sūtīt”.

Koda paraugs

//formāts pašreizējā laika norādīšanai "DD.MM.GG hh:mm:ss" //kur DD ir diena, MM ir mēnesis, YY ir gads, hh ir stundas, mm ir minūtes, ss ir sekundes //YY — no 00 līdz 99 2000.-2099. gadam#iekļauts #iekļauts bool isTimeSet = false ; //karogs, kas norāda, vai datums jau ir iestatīts nederīgs uzstādīt () { Seriāls.begin(9600); kamēr (! Seriāls ) ; // Tikai Leonardo dēlim setSyncProvider(RTC.get); // iegūt laiku no RTC if (timeStatus() != timeSet) Seriāls.println("Nevar sinhronizēt ar RTC"); //sinhronizācija neizdevās cits Seriāls.println("RTC ir iestatījis sistēmas laiku"); ) spēkā neesošs cilpa() ( ja ( Seriāls.available()) ( //ar laiku tika saņemta komanda setTimeFromFormatString( Seriāls.readStringUntil("\n" )); isTimeSet = true ; //datums ir iestatīts) if (isTimeSet) //ja datums bija norādīts( digitalClockDisplay(); //laika displejs) aizkave (1000); ) Void digitalClockDisplay() ( Seriāls.print(stunda()); drukātDigits(minūte()); drukātDigits(otrais()); Seriāls.print(" "); Seriāls.print(day()); Seriāls.print(" "); Seriāls.print(month()); Seriāls.print(" "); Seriāls.print(year()); Seriāls.println(); ) nederīgs drukas cipari (int cipari) ( //izvades laiks, izmantojot ":" Seriāls.print(":"); ja (cipari< 10) Seriāls.print("0"); Seriāls.print(cipari); ) void setTimeFromFormatString(virknes laiks) ( //DD.MM.GG hh:mm:ss int diena = time.substring(0, 2).toInt(); int mēnesis = laiks.apakšvirkne(3, 5).toInt(); int gads = time.substring(6, 8).toInt(); int stundas = time.substring(9, 11).toInt(); int minūtes = time.substring(12, 14).toInt(); int sekundes = time.substring(15, 17).toInt(); TimeElementste; te.Second = sekundes; te.Minūte = minūtes; te.Stunda = stundas; te.Diena = diena ; te.Mēnesis = mēnesis ; te.Gads = gads + 30; //bibliotēkā gads tiek skaitīts no 1970. Gribam no 2000. gada laiks_t laiksVal = makeTime(te); RTC .set(timeVal); setTime(timeVal); )