Ds1307 ni avr mikrokontrolleriga ulash. DS1307 sxemasini TWI interfeysi orqali mikrokontrollerga ulash. Kodda qo'lda

DS1307 RTC (Real Time Clock) deb ham ataladi. Bu chip real vaqtda soat va kalendar hisoblanadi. Mikrosxema bilan aloqa I 2 C interfeysi orqali amalga oshiriladi, uning afzalligi shundaki, u asosiy quvvat 3 voltli zaxira quvvat manbaidan (masalan, CR3022 batareyasidan) o'chirilganida ishlaydi. Ammo DS1307 ning bitta kamchiligi bor: kiritilgan ma'lumotlarning to'g'riligini tekshirmaydi. Mikrosxema bilan ishlash uchun sizga minimal to'plam kerak bo'ladi: 32768 Gts chastotada kvarts, 3 voltli batareya va ikkita 4,7 kOhm rezistor. DS1307 ulanish diagrammasi:

BASCOM-AVR da DS1307 bilan ishlash

Mikrosxema bilan ishlashni boshlash uchun siz mikrosxema ulangan portlarni sozlashingiz kerak, bu buyruqdan foydalaning; Konfiguratsiya:
Sda konfiguratsiyasi =(DS1307 chipining SDA oyog'i ulangan mikrokontroller porti)
Config Scl =(DS1307 chipining SCL oyog'i ulangan mikrokontroller porti)
Masalan:
Sda konfiguratsiyasi = Portb.1
Config Scl = Portb.0

Portlarni sozlashdan so'ng siz chip bilan ishlashni boshlashingiz mumkin: ma'lumotlarni o'qish va yozish. DS1307 chipidagi vaqt va sana quyidagicha o'qilishi mumkin:

I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte (biz soniyalarni yozadigan o'zgaruvchi), Ack I2crbyte (daqiqalarni yozadigan o'zgaruvchi), Ack I2crbyte (biz soatlarni yozadigan o'zgaruvchi), Ack (qaysi o'zgaruvchan) hafta kunining raqamini yozing), Ack I2crbyte (biz sanani yozadigan o'zgaruvchi), Ack I2crbyte (oy raqamini yozadigan o'zgaruvchi), Ack I2crbyte (yilni yozadigan o'zgaruvchi), Nack I2cstop

Ma'lumotni o'qib bo'lgach, uni o'nlik formatga o'tkazishingiz kerak, masalan:
(soniya o'zgaruvchisi) = Makedec((soniya o'zgaruvchisi) )
(daqiqa o'zgaruvchan) = Makedec((daqiqa o'zgaruvchan) )
(soat o'zgaruvchisi) = Makedec((soat o'zgaruvchisi) )
(hafta kuni o'zgaruvchan) = Makedec((hafta kuni o'zgaruvchan) )
(sana o'zgaruvchisi) = Makedec((sana o'zgaruvchisi) )
(oy o'zgaruvchan) = Makedec((oy o'zgaruvchan) )
(yil o'zgaruvchisi) = Makedec((yil o'zgaruvchisi) )

Mana vaqt va sanani o'qish va ularni o'nlik formatga o'tkazish misoli:

I2cstart I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte Seco, Ack I2crbyte Mine, Ack I2crbyte Hour, Ack I2crbyte Day, Ack I2crbyte Dat, Ack I2c, Monte I2c, Ack I2crbyte stop Seco = Makedec (seco M) ine = Makedec (meni) Soat = Makedec (soat) Kun = Makedec (kun) Dat = Makedec (dat) Oy = Makedec (oy) Yil = Makedec (yil)

Biz ma'lumotlarni o'qishni o'rgandik, endi DS1307 ga ma'lumotlarni yozishga harakat qilaylik. Mana bunday:
(Biz yozadigan o'zgaruvchi) = Makebcd((Biz yozadigan o'zgaruvchi) )
I2cstart
I2cwbyte va HD0
I2cwbayt(Biz ma'lumotlarni yozadigan hujayra)
I2cwbayt(Biz yozadigan o'zgaruvchi)
I2cstop

Iltimos, buyruqni unutmang Makebcd o'zgaruvchini ikkilik kasr formatiga o'zgartiradi. Hujayra raqamlari va belgilari:

Mana soniya o'zgaruvchisini yozishga misol:
Seco = Makebcd(seco)
I2cstart
I2cwbyte va HD0
I2cwbayt 0
I2cwbyte Seco
I2cstop
Aytgancha, shuni ta'kidlash kerakki, DS1307 birinchi marta ishga tushirilganda (masalan, zaxira batareyani ulashda), mikrosxema soniyalarda 80 qiymatini qaytaradi, bu soat to'xtatilganligini anglatadi. Ularni ishga tushirish uchun soniyalarda 1 qiymatini yozing, agar DS1307 har qanday ma'lumotni o'qiyotganda 255 yoki 168 qiymatini qaytarsa, bu chip to'g'ri ulanmagan yoki zaxira batareyasi yo'q degan ma'noni anglatadi.

DS1307 chipi bilan amaliy ish

Endi DS1307 chipi bilan amalda ishlashga harakat qilaylik: tugmalar yordamida vaqtni sozlash bilan oddiy soatni yig'amiz. Buning uchun DS1307 chipining o'zini, Attiny2313 mikrokontrollerini, HD44780 kontrolleridagi LCD indikatorni va bir nechta diskret komponentlarni olaylik. Keling, oddiy diagramma tuzamiz:

Keling, olingan bilimlardan foydalangan holda oddiy dastur yozamiz:

$regfile = "attiny2313.dat" $kristal = 4000000 konfiguratsiya 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 Pind.4 = Input Config Sda = Portb.1 Config Scl = Portb.0 Dim Seco Bayt sifatida Dim Mine Bayt sifatida Dim Soat Bayt sifatida Initlcd Cls Kursor O‘chirilgan I2cstart. I2cwbyte &HD0 I2cwbyte &H00 I2cstart I2cwbyte &HD1 I2crbyte Seco , Ack I2crbyte Mine , Ack I2crbyte soat , Nack I2cstop Seco = Makedec(seco) Mine = Makedec(meni) soat =1c soat; ":" ; meniki; ":" ; seco; " " Agar Pind.5 = 0 bo'lsa, Incr Mine Mine = Makebcd(mine) I2cstart I2cwbyte &HD0 I2cwbyte 1 I2cwbyte Mine I2cstop Waitms 100 End Agar Pind.4 = 0 bo'lsa, Incr Hour Hour = Makebcd(soat) I2bycwcw Soat I2cstop Waitms 100 End If Loop End

17-dars

1-qism

Haqiqiy vaqt DS1307

Dasturlash darslarimizni davom ettiramiz MK AVR.

Va bugun biz juda yaxshi mikrosxema bilan tanishamiz DS1307. Bu mikrosxema real vaqt soati (real vaqt soati yoki RTC).

Bundan tashqari, mikrokontroller va ushbu chip o'rtasidagi aloqa interfeys yordamida sodir bo'lishi sababli I2C, bu avtobusni dasturlash mavzusini yana bir bor mustahkamlaymiz.

Ushbu mikrosxema kompaniya tomonidan taqdim etilgan Dallas, bu erda uning pinout va asosiy texnik xususiyatlari

Bu erda biz SDA va SCL oyoqlari borligini ko'ramiz, ularning maqsadi biz juda yaxshi bilamiz. Shuningdek, kvarts rezonatorini 32768 Gts chastotada ulash uchun X1 va X2 pinlari, quvvat pinlari - VCC va GND, ma'lum registrlarning sozlamalariga qarab 1 soniya yoki boshqa chastotali impulslar uchun chiqish, shuningdek batareya uchun ijobiy kontakt mavjud. Bu asosiy quvvat o'chirilganda soatning taqillatib turishi uchun ulanadi. Ushbu batareyaning salbiy kontaktini umumiy quvvat simiga ulaymiz.

Shuningdek, biz ushbu chip planar va DIP paketlarda mavjudligini ko'ramiz.

Ushbu mikrosxema 3 volt yoki 5 voltdan quvvatlanishi mumkin.

I2C interfeysi orqali ushbu mikrosxemaga kirish, qoida tariqasida, xuddi shu tarzda sodir bo'ladi. xuddi oxirgi darsda foydalangan xotira chipi kabi. Albatta, ba'zi nuances bo'ladi, lekin bu haqda keyinroq.

Menda ushbu chip EEPROM chipi o'rnatilgan modulga o'rnatilganligi va bizda bitta almashuv avtobusi borligi sababli, DS1307 chipi unga murojaat qilinayotganini "tan oladi", albatta, u boshqa manzildan farq qiladi. EEPROM chipi.

Bu erda ma'lumotlarni qabul qiluvchi va uzatuvchi mikrosxemaning diagrammasi keltirilgan

Ushbu chipga kirishimiz mumkin bo'lgan manzil ko'k rangda ta'kidlangan.

Asosan. Biz EEPROM chipining diagrammalari bilan unchalik farq qilmayapmiz.

Ishlashning yana bir farqi shundaki, xotira manzili allaqachon bir baytga teng bo'ladi, chunki xotira hujayralari yoki registrlar Ushbu mikrosxema juda kam.

Bu registrlar shunday

Ushbu registrlarning maqsadi:

00 soat- soniya. Soniyalar ikkilik kasr formatida saqlanadi. Ya'ni, pastki 4 bit soniya birliklarini, yuqori uchta bit esa o'nlablarni saqlaydi. SH biti ham bor - bu chip start biti.

01 soat- daqiqa. Xuddi shunday saqlanadi.

02 soat- ko'proq universal registr. Bu erda soat saqlanadi. To'rtta eng kam ahamiyatli bitda birliklar, keyingi ikkita yuqorida o'nlab, keyingi 6-bitda tushdan keyinmi yoki tushdan oldinmi, bayrog'i bor, 7-bitda saqlash rejimi mavjud - 12 soat. yoki 24 soat.

03 soat- hafta kuni. Eng kam ahamiyatli 3 bitda saqlanadi, qolgan bitlar ishlatilmaydi.

04 soat— oyning kuni bu yerda, shuningdek, ikkilik kasr formatida saqlanadi. To'rtta eng kam ahamiyatli bit birlarni o'z ichiga oladi, keyingi ikkita yuqorida o'nlab bitlar mavjud, qolgan bitlar ishlatilmaydi.

05 soat- yildagi oyning soni - soat bilan bir xil tarzda ikkilik kasr formatida saqlanadi.

06 soat- yil raqami, va to'liq to'rt xonali emas, balki faqat ikki xonali. Eng kam ahamiyatli to'rt bit birlik, eng yuqori to'rt bit esa o'nlab.

Biz ushbu etti registrdan foydalanamiz. Oxirgi registr mikrosxemaning puls chiqishida impuls chastotasini sozlash uchun mo'ljallangan, bu registrning pastki ikki bitida amalga oshiriladi; sukut bo'yicha 1 Gts chastota bo'ladi, bu biz uchun yo'g'on ichakni miltillash uchun etarli, shuning uchun biz bu bitlardan foydalanmaymiz. SOWE va OUT bitlari kvadrat to'lqin hosil qiluvchini sozlash va yoqish uchun ham ishlatiladi.

Ushbu chip bilan ishlash loyihasi odatiy tarzda nom bilan yaratilgan Mening soatim 1307, EEPROM bilan bog'liq fayllar u erdan olib tashlandi va fayllar qo'shildi RTC.c Va RTC.h.

#ifndefMAIN_H_

#aniqlashMAIN_H_

#aniqlashF_CPU8000000UL

#o'z ichiga oladi

#o'z ichiga oladi

#o'z ichiga oladi

#o'z ichiga oladi

#o'z ichiga oladi

#o'z ichiga oladi"usart.h"

#o'z ichiga oladi"twi.h"

#o'z ichiga oladi"RTC.h"

#endif/* MAIN_H_ */

Asosiy faylda MyClock1307.c keling, haftaning vaqtini, sanasini va kunini saqlash uchun global o'zgaruvchilar yarataylik va undan keyin undagi barcha keraksiz narsalarni olib tashlaganingizdan so'ng to'liq tarkib shunday bo'ladi.

#o'z ichiga oladi"main.h"

imzosizcharsek, min, soat, kun, sana, oy, yil;

intasosiy( bekor)

I2C_Init();

USART_Init(8);

Vaholanki(1)

Oldingi koddan faqat I2C va USARTni ishga tushirish qoladi.

Endi biz qandaydir tarzda chipni boshlashimiz kerak. Agar mikrosxema yangi bo'lsa yoki hech qachon ishlatilmagan bo'lsa yoki kimdir biron bir maqsadda CH bitining qiymatini o'zgartirgan bo'lsa, u hali "ishlamaydi".

Umuman olganda, biz mikrosxemaning registrlarida barcha qiymatlarni o'rnatganimizdan so'ng, u boshlanadi va bizning soatimiz boshlanadi.

Ulanish yoki sxema avvalgi darsdan ham foydalanilgan, ya'ni terminal dasturidagi USART shinasi orqali vaqtni ko'rib chiqamiz.

Shuning uchun, aslida, oldingi darsdagi bilimlarimizdan foydalanib, biz vaqtni belgilash funktsiyasini yozishni yozamiz.

Avvalo, biz, albatta, START shartidan o'tamiz

//Vaqtni belgilang

I2C_Start Condition();

Keyin biz manzilni yozish biti 0 bilan uzatamiz

I2C_Start Condition();

I2C_SendByte(0b11010000);

Keling, 0-manzilga o'tamiz, ya'ni xotiraning birinchi registr joylashgan qismiga

I2C_SendByte(0b11010000);

I2C_SendByte(0); // 0x00 ga o'ting

Mikrosxema registrlariga biron bir qiymatni yozishdan oldin, biz birinchi navbatda raqamlarni registrlar uchun qulay bo'lgan BCD formatiga aylantirishimiz kerakligini yodda tutamiz. Buning uchun biz RTC.c fayliga o'tamiz va shunday funktsiyani yozamiz. Bu juda oson bo'ladi va hech qanday tushuntirishni talab qilmaydi.

imzosizcharRTC_ConvertFromBinDec( imzosizcharc)

{

imzosizcharch= (( c/10)<<4)|( c%10);

qaytishch;

}

Xo'sh, keling, sonni ikkilik-o'nlik formatdan o'nli kasrga aylantirib, teskari turdagi funksiyani ham yozamiz. Uning yordami bilan biz, aksincha, o'qish vaqti ko'rsatkichlarini bizning idrokimiz uchun qulay shaklga aylantiramiz (HRI - inson tomonidan o'qiladigan interfeys)

imzosizcharRTC_ConvertFromDec( imzosizcharc)

{

imzosizcharch= (( c>>4)*10+(0b00001111&c));

qaytishch;

}

Bu erda ham hamma narsa juda aniq, biz baytning yuqori tetradini o'ngga siljitamiz, uni o'nga ko'paytiramiz va past tetradni qo'shamiz (biz yuqori tetradni nol bilan niqoblaymiz)

Ushbu funksiyalarning prototiplarini faylga yozamiz RTC.c

#o'z ichiga oladi"main.h"

imzosizcharRTC_ConvertFromDec( imzosizcharc); //BCD sonini kasrga aylantiring

imzosizcharRTC_ConvertFromBinDec( imzosizcharc);

Dasturchi, xotira chipli RTC DS1307 moduli va USB-TTL adapterini bu yerda xarid qilish mumkin:

Dasturchi (ishonchli sotuvchi) USBASP USBISP 2.0

VIDEO TUTORIALni tomosha qiling (rasm ustiga bosing)

Ko'rishlar soni: 7 354

Internetdagi ushbu soat haqidagi sharhlar eng qarama-qarshidir. Ba'zilar soatni ajoyib desa, boshqalari uni Dallasning kambag'al ijodi deyishadi. Shunday qilib, barcha yolg'on mish-mishlarni yo'q qilish uchun men mikruxani ombordan chiqarib, tajriba qila boshladim.

Xususiyatlari:

  • Juda kam quvvat sarfi. Ishlab chiqaruvchi bitta standart batareyadan soatning 10 yil ishlashini va'da qiladi. CR2032
  • Foydalanuvchi ma'lumotlarini saqlash uchun 56 bayt xotira. Menimcha, bu juda zarur variant emas, lekin kimdir uchun foydali bo'lishi mumkin.
  • Tashqi qurilmalarni soatlash uchun dasturlashtiriladigan chiqish. 1 Gts, 4,096 kHz, 8,192 kHz va 32,768 kHz chastotalarni chiqarishi mumkin.
  • 24 soatlik va 12 soatlik rejim

Pinout

Soat pinlari quyidagicha joylashgan:

X1, X2— 32,768 kHz chastotada kvarts rezonatorini ulash uchun pinlar
VBAT— 3 voltli zaxira batareyani ulash uchun chiqish
GND- Yer
S.D.A.- i2c avtobus ma'lumotlar liniyasi
SCL— i2c avtobus soat liniyasi
SQW/OUT– tashqi qurilmalarni taktlash uchun chiqish signali
VCC- 5 voltli quvvat manbai

Tekshirish moslamasiga ulanish
Bog'lanish minimaldir. Sizga 32,768 kHz kvarts, i2c avtobusini boshqarish uchun bir juft rezistor va uch voltli batareya kerak bo'ladi.

To'g'ri taxta tartibi
Soatning aniqligi va umuman soatning ishlashi bosilgan elektron plataning tartibiga bog'liq. Dallas o'zining ma'lumotlar varag'ida mikrosxemadan kvarts rezonatorigacha bo'lgan o'tkazgichlarning uzunligini minimal darajaga qisqartirishni va bu o'tkazgichlarni erga ulangan to'rtburchaklar bilan o'rab olishni tavsiya qiladi. Bundan tashqari, ishonchliligi uchun men kvarts tanasiga erga boradigan simlarni lehimladim va quvvat manbai bilan parallel ravishda 0,1 uF kondansatör joylashtirdim.

Aytgancha, u kvartssiz ishlashi mumkin. Buning uchun X1 oyog'iga 32,768 kHz chastotali tashqi soat signali beriladi va X2 havoda to'xtatilgan holda qoladi.

Soat xotirasini tashkil qilish
Ushbu miniatyura qurilmasi 64 bayt xotira bilan jihozlangan. Birinchi sakkiz bayt ishlaydi. Ular vaqtni, sanani, haftaning kunini saqlaydi. Qolganlari foydalanuvchi ehtiyojlariga ajratiladi. Ularda, masalan, ba'zi sozlamalarni yoki boshqa narsalarni saqlashingiz mumkin. Tabiiyki, zaxira quvvati yo'qolganda, bu xotiradagi barcha ma'lumotlar yo'q qilinadi. Soat bilan bog'liq barcha ishlar (vaqtni/sanani o'qish va belgilash) kerakli xotira katakchalarini o'qish va yozishga to'g'ri keladi.

Xotiradagi barcha raqamlar ikkilik kasr formatida saqlanadi. Bu bitta baytda ikkita raqamni saqlash mumkinligini anglatadi. Masalan, 0x23 raqami 2 va 3 raqamini o'z ichiga oladi. Har bir raqam uchun 4 bit ajratiladi. Bu nima uchun qilingan? Qulaylik va xotirani tejash uchun. Vaqt va sanaga qo'shimcha ravishda, bir nechta sozlamalar bitlari xotirada saqlanadi:

  • Soat to'xtash- soatni boshqaradi. Bit o'rnatilganda, soat to'xtaydi. Soatni ishga tushirish uchun siz ushbu bitga 0 yozishingiz kerak zaxira batareyani ulaganingizdan so'ng, bu bit o'rnatiladi va soat vaqtni hisoblamaydi. Buni eslab qolishingiz kerak.
  • 24/12 - bu soat rejimini tanlash uchun bit. Bu bit birga teng bo'lsa, 12 soatlik rejim ishlatiladi. Aks holda 24 soat. Agar 12 soatlik rejim ishlatilsa, beshinchi bit hozir AM yoki PMni bildiradi. Agar bit 1 bo'lsa, bu PMni bildiradi. 24 soatlik rejimda bu bit 4 bit bilan birgalikda o'nlab soatlarni saqlash uchun ishlatiladi.
  • Chiqish— SQW/OUT oyoq holatini nazorat qiladi. Bit o'rnatilgan - oyoqda 1. Qayta tiklash - oyoqda 0. Shu tarzda boshqarish uchun bit SQWE qayta o'rnatilishi kerak.
  • SQWE- bit o'rnatilganda, SQW/OUT oyog'ida to'rtburchaklar impulslar paydo bo'ladi.
  • RS1, RS0— bu bitlar impuls chastotasini o‘rnatadi. Chastotaning bit kombinatsiyasiga bog'liqligi quyidagi jadvalda keltirilgan:

Dasturiy ta'minot

DS1307 soati bilan ishlash uchun quyidagi asosiy funktsiyalarni o'z ichiga olgan oddiy kutubxona yozilgan:

DS_start— soatni boshlaydi. Vaqtni belgilash orqali ham soatni boshlashingiz mumkin.
DS_stop- soatni to'xtatadi
DS_set_time - Vaqtni belgilash. Jarayonni chaqirishdan oldin tmp1da soniyalarni, tmp2da daqiqalarni va tmp3da soatlarni qo'yish kerak. 24 soat formatida soat.
DS_get_time: — soatdan o'qish vaqti. soniyalar tmp1 da, daqiqalar tmp2 da, soatlar tmp3 da yoziladi
DS_get_date:— soatdan sanani o'qish. Kun tmp1 da, oy tmp2 da, yil tmp3 da yoziladi
DS_set_date: — sanani belgilash. Jarayonga qo'ng'iroq qilishdan oldin siz tmp1-ga kunni, tmp2-ga oyni va tmp3-ga yilni (oxirgi 2 raqam) kiritishingiz kerak.

Vaqt va sanani sozlash/o'qish tartibi BCD va kasr formatida kiritilgan ma'lumotlarni qabul qilishi/qaytarishi mumkin. Kerakli formatni tanlash uchun har bir protsedurada uchta qatorni izohlash yoki izohni olib tashlash kerak (kodda bu haqda eslatmalar mavjud).

Sinov dasturi sizga UART orqali soatni boshqarish imkonini beradi (tezlik 9600, kontroller 8 MGts da ishlaydi). Ishga tushganda, vaqt, sana va 1 dan 3 gacha bo'lgan buyruqlarni kiritish taklifi darhol ko'rsatiladi, 1-variantni tanlaganingizda, vaqt/sana yana o'qiladi. 2-variant vaqtni, 3-variant esa sanani belgilash imkonini beradi. Agar siz soat bilan o'ynashni xohlasangiz, simulyatsiya fayli manba arxiviga kiritilgan.

Aniqlik
Bu erda ko'p narsa ishlatiladigan kvartsga va taxta tartibiga bog'liq. Ma'lumotlar varaqasi kvarts sig'imi 12,5 pF bo'lishi kerakligini xabar qiladi. Ularning aytishicha, anakartlardan kristallardan foydalanish eng yaxshisidir. Qon tomirini tuzatish uchun siz rezonatorga kesish kondensatorini lehimlashingiz va chastotani kichik chegaralarda o'zgartirish uchun foydalanishingiz mumkin. Shaxsan, bu soat men uchun ikki kundan beri ishlaydi va 3 soniya orqada. Biror narsa menga muammo kvarts sig'imida ekanligini aytadi, men boshqasini sinab ko'raman va hisobot beraman.

Xulosa
Yomon soat emas. Havaskor foydalanish uchun ideal. Garchi ba'zi odamlar nosozliklar haqida yozsalar ham, men ularni hali uchratmadim.

Yangilangan 07/23/2018. Hammaga salom. Soatlar bilan ishlash uchun oxirgi maqolada biz bugun murojaat qiladigan TWI interfeysini muhokama qildik. Xo'sh, boshlaylik. Ushbu soat TWI-ga mos keladi, ya'ni. avtobusda ma'lumotlar almashinuvi printsipi biz ko'rib chiqqanimizdek bo'ladi.

Quyidagi rasmda pinlarning joylashuvi, tavsifi va bizning soatimizning tashqi ko'rinishi ko'rsatilgan yoki biz uni keyinchalik RTC (Real-time clock) deb ataymiz - real vaqtda soat yoki vaqt impulslari generatori. Ushbu "qurilma" DS1307 Kabisa yillari bilan birga soniyalar, daqiqalar, soatlar, oy kuni, oy, hafta kuni va yilni hisoblaydi. Taqvim 2100 yilgacha amal qiladi. Menimcha, bu bizning umrimiz uchun etarli bo'ladi :).

Ta'rifdan ko'rinib turibdiki, tashqi quvvat o'chirilganda favqulodda batareya quvvati uchun kirish mavjud. Ushbu rejimda RTC faqat o'zining asosiy maqsadini qo'llab-quvvatlaydi - vaqtni, tashqi so'rovlarsiz. Batareyaning kuchlanishi 2 - 3,5 V bo'lishi kerak. Texnik tavsifda aytilishicha, 48 mA / soat dan ortiq zaryad bilan, 25 daraja Selsiy bo'yicha bizning sxemamiz taxminan 10 yil davom etadi. Zarur bo'lgandan ham ko'proq. Quyidagi rasmda CR2032 "planshet" va biz foydalanadigan o'rnatish moslamasi ko'rsatilgan.

Endi tashqi quvvat manbaiga o'tamiz. Soatning ish kuchlanishi kichik diapazonda 4,5 -5,5 V bo'lgan 5 V ni tashkil qiladi. Batareya kuchlanishi 3V (minimal 2, maksimal 3,5V) RTC ishlashi uchta kuchlanish rejimiga bo'linadi:

1. Vcc=5V – o‘qish, yozish, hisoblash;
2. Vcc= 1,25*Vbat dan past, lekin Vbat +0,2V dan yuqori - faqat tashqi quvvatdan batareyani hisoblash.
3. Vbat ostidagi Vcc: RTC va RAM batareya quvvatiga o'tadi. Faol holatda iste'mol 1,5 mA, batareyadan 500-800 nA.
Axborotni uzatish/qabul qilish uchun kuchlanish:
Mantiqiy 0: -0,5V - +0,8V
Mantiq 1: 2,2 V – Vcc+0,3V

Oldingi xabarlarda bo'lgani kabi, biz uni Proteus-da ishga tushirishga harakat qilamiz. Keling, kodni disk raskadrovka qilaylik. Va biz hamma narsani apparatga o'tkazamiz. Quyida ulanish diagrammasi keltirilgan.

Bu erda SQW/OUT - bu 1Hz, 4.096Hz, 8.192Hz va 32.768Hz chastotalarni chiqarish uchun dasturlashtirilishi mumkin bo'lgan soat chiqishi. Bular. 1 sekund chastota bilan boshqaruvchini tashqaridan uzib qo'yish uchun ishlatilishi mumkin. Juda foydali xususiyat. Ammo bizga kerak bo'lmaydi. Aytgancha, u ham ochiq kollektordir, shuning uchun tortishish qarshiligi kerak. Nominal 4,7 kOm.

X1 va X2 pinlari - biz ularga 32,768 kHz chastotali kvarts rezonatorini ulaymiz. Yoki bir xil chastotali tashqi soat generatoridan foydalanishingiz mumkin. Ammo bu holda, pin X1 signalga ulangan va X2 ulanmagan holda qoladi (havoda osilgan.).

Xo'sh, biz oxirgi maqolada tanishgan SDA va SCL xulosalari.

Keling, rezonator haqida bir oz to'xtalib o'tamiz (quyidagi rasm). Qaysi soatning yuragi deb atash mumkin va harakatning aniqligi unga bog'liq. Rezonatorning sifati ishlab chiqaruvchining vijdoniga bog'liq, ammo o'z navbatida, agar biz rezonatorni joylashtirish bo'yicha quyidagi tavsiyalarga amal qilsak, tashqi omillar tomonidan yuzaga keladigan xatolikni kamaytirishimiz mumkin:

2. Boshqa manbalardan shovqin olish ehtimolini kamaytirish uchun, iloji bo'lsa, yo'lning kengligi ham kichikroq bo'lishi kerak.

3. Kristalni shovqindan ajratishga yordam beradigan halqa shaklidagi sxemani kristall atrofida joylashtirish kerak.

4. Supero'tkazuvchilarni halqaga joylashtiring va ularni erga ulang.

5. Rezonatorni erga lehimlang. Agar er to'g'ri yotqizilgan bo'lsa va ishonch bo'lsa.

Quyidagi rasmda tez muzning yerga konturi va joylashuvi ko'rsatilgan.

Biz qanday qilib ulanishni aniqladik. Keling, davom etaylik va u bilan qanday ishlashni aniqlaymiz. RTC dasturlashtiriladi va uning konfiguratsiyasi uchun 8 bayt maxsus registrlarga va 56 bayt doimiy statik xotiraga ega. Ma'lumot almashish uchun 2 simli ma'lumotlar shinasi talab qilinadi, ya'ni. ketma-ket ma'lumotlar avtobusi - biz oxirgi maqolada muhokama qildik. Shunday qilib, boshlash uchun, keling, ma'lumotlar varag'ini ko'rib chiqaylik. Bizga nima kerak:

Ro'yxatdan o'tish jadvali. Quyidagi rasm. Birinchi sakkiz registr bizning soatimizni chiqarish va dasturlash uchun mo'ljallangan. 00H manzilida 7-bitga (CH) kirishda va uni 0 ga o'rnatishda biz soatni boshlaymiz. Shuni ta'kidlashni istardimki, registr konfiguratsiyasi har qanday bo'lishi mumkin, shuning uchun uni birinchi marta boshlaganingizda uni o'zingizning talablaringizga moslashtirishingiz kerak. Qolgan yetti bit bir va o'n soniyalardir.

01H - daqiqalar.
02H - Sozlanishi mumkin bo'lgan soat:
— Bit 6 – 1 chiqish 12 soatlik formatda, 0 – 24.
— Bit 5 – 1 da (12 soatlik formatda) PM, 0-AM
— Bit 5 – (24 soatlik formatda) bu ikkinchi o‘n soatlik (20-23 soat) chiqishi
- Bit4 - birinchi o'n soat, qolgan bitlar soat birliklari.
03H - haftaning kuni;
04H - sana;
05H - yilning oyi
06H - yil.

Xo'sh, oxirgi registr 07:00. Bu registr boshqaruv registridir, bunda OUT SQW/OUT pinini boshqarish uchun javobgardir. Quyida chiqishni yoqish jadvali keltirilgan.

OUT
SQWE
SQW/OUT
1
0
1
0
0
0

SQWE - bu bit 1 ga o'rnatilganda, RS1 va RS0 bitlari tomonidan o'rnatiladigan chiqishlarga ma'lum chastotali impulslar chiqariladi.

Ushbu xulosa loyihada biz uchun foydali bo'lmaydi. Garchi men buning uchun trekni taxtada qo'ygan bo'lsam ham. Tajriba sifatida, u kelajakda biron bir joyda qo'llanilishi mumkin, chunki bu erda siz 1 soniyalik tanaffus qilishingiz mumkin.

Endi bizda barcha kerakli ma'lumotlar bor, keling, soat bilan ishlash funktsiyalarini yozamiz. Biz ham loyihani ishga tushiramiz Proteus . Bu shunday ko'rinadi:

Esda tutingki, Proteusdagi rezonator soatga ulanishi shart emas (qizil rangda aylana).

Rasmda vaqtni ko'rsatadigan soat terminali ko'rsatilgan, u o'z navbatida tizim vaqtiga bog'langan. Signalni yuborish va qabul qilish vaqtini ko'rsatadigan I2C yoki TWI protokoli tuzatuvchi terminali, bu erda D0 uzatilgan buyruq, D1 - qabul qilish. Quyida men dastur natijasi bilan terminalning skrinshotlarini ko'rsataman.

Dastur. Asosiy soat sozlamalarini ko'rib chiqib, biz ishga tushirish funktsiyasini yozamiz.

/*Initsializatsiya funktsiyasi formuladan foydalangan holda ma'lumotlar almashinuv tezligini o'rnatishni (oldingi maqolada), oldindan o'lchovni sozlashni va TWI modulini yoqishni o'z ichiga oladi*/
void init_DS1307 (void)
{
TWBR = 2; /*1 MGts chastotada */
TWSR = (0<< TWPS1)|(0 << TWPS0); /*Predivisor by 64*/
TWCR |= (1<< TWEN); /*TWI modulini yoqish*/
}

void write_DS1307 (uint8_t reg, uint8_t time)/*biz ikkita parametrni o‘tkazamiz: biz kiradigan registr manzili va uzatiladigan ma’lumot*/
{
/* Boshqarish registrining bitlarini belgilash orqali START holatini hosil qiling */
TWCR = (1<
/*TWEN moduliga ishlashga ruxsat bering; TWSTA boshlang'ich holatini yaratish; TWINT bayrog'ini tiklash */
/*Biz boshlang'ich shartni shakllantirishni tugatishni kutmoqdamiz, ya'ni. bayroq o'rnatilguncha, holat kodi = 08*/
esa (!(TWCR & (1.)<
/*Keyin biz manzillar paketini (qurilma manzili) yuboramiz. Paket tarkibi TWDR registriga yuklanadi*/
TWDR = 0xd0; /*0b1101000 + 0 – manzil + yozish biti*/
/*Ma’lumotni uzatish uchun bayroqni qayta o‘rnating*/
TWCR = (1<
/*Bayroq oʻrnatilishi kutilmoqda*/
esa (!(TWCR & (1.)<
/*biz kira oladigan registrdan o‘ting*/
TWDR = reg;
TWCR = (1<
esa (!(TWCR & (1.)<
/*Registr baytiga yoziladigan ma’lumotlarni uzatish*/
TWDR = vaqt;
TWCR = (1<
esa (!(TWCR & (1.)<
/*STOP holatini shakllantirish*/
TWCR = (1<
}

Ushbu funktsiyada biz ushbu registrga yozish uchun uchta bayt, qurilma manzili, registr manzili va bir bayt ma'lumotni o'tkazdik va STOP holatini yaratdik.

Oxirgi o'qish funktsiyasi qoladi. Quyida o'qish formati keltirilgan.

Bu funksiya qurilma manzili bayti + yozish bitini, unga ko'rsatgichni o'rnatish uchun registr manzili baytini, POVSTAR shartini bajarishni, qurilma manzili bayti + o'qish bitini uzatishni, manzili bo'lgan registrni o'qishni amalga oshiradi. biz oldinroq o'tkazdik.

Agar biz soatga o'qish formatida kirsak, u holda biz yana soatga kirganimizda, ko'rsatgich 00H dan 3FH gacha bo'lgan 56 bayt operativ xotirani o'z ichiga olgan bir bayt pastga siljiydi. Oxirgi manzilga erishilganda, ko'rsatgich 00 manziliga o'tadi.

/*DS1307 maʼlumotlarini oʻqish funksiyasi*/
uint8_t read_DS1307 (uint8_t reg)/*Ro‘yxatdan o‘tish manzilini o‘tkazing*/
{
uint8_t vaqti;
/*START holatini shakllantirish*/
TWCR = (1<
esa (!(TWCR & (1.)<
TWDR = 0xd0; /*O'tkazish manzili + yozish biti*/
TWCR = (1<
esa (!(TWCR & (1.)<
TWDR = reg; /*Ro‘yxatdan o‘tish manzili*/
TWCR = (1<
esa (!(TWCR & (1.)<
/*POVSTAR holatini shakllantirish*/
TWCR = (1<
esa (!(TWCR & (1.)<
TWDR = 0xd1; /*O'tkazish manzili + o'qish biti*/
TWCR = (1<
esa (!(TWCR & (1.)<
/*ma’lumotlarni o‘qish*/
TWCR = (1<
esa (!(TWCR & (1.)<
vaqt = TWDR;
vaqt = (((vaqt & 0xF0) >> 4)*10)+(vaqt & 0x0F);
/*STOP holatini shakllantirish*/
TWCR = (1<
qaytish vaqti;
}

Shunday qilib, yuqorida biz soat bilan ishlashimiz kerak bo'lgan uchta funktsiyani yozdik. Ushbu funktsiyalardan foydalanib, biz dasturni Proteusda ishga tushiramiz. Keling, masalan, sanani ko'rsatamiz.

#o'z ichiga oladi
#o'z ichiga oladi
uint8_t vaqti;
void init_DS1307 (void);
uint8_t read_DS1307 (uint8_t reg);
void write_DS1307 (uint8_t reg, uint8_t time);
int asosiy (yaroqsiz)
{
DDRC = 0×00; /*Portni kirish sifatida belgilang*/
PORTC = 0xFF; /* Qarshilikni kuchaytiring*/
init_DS1307;
esa (1)
{
_kechikish_ms(50);
read_DS1307 (0×04); /*Sana reestrini o‘qish*/
}
}

Quyida sanani o'qish uchun dasturni bajarish natijasi keltirilgan.

I2C disk raskadrovka oynasida ( TWI ) ko'rinib turibdiki, birinchi navbatda registr manzili RTCga (yashil doira) yuboriladi, bu holda oyning sanasi uchun mas'ul bo'lgan 04, keyin esa soat 21 (qizil doira) javobini uzatadi.

Dazmolda soatni ishga tushirganimizda, biz hozirgi vaqtni kiritishimiz kerak bo'ladi. Quyida daqiqalarni o'zgartirish dasturining namunasi keltirilgan.

esa (1)
{
_kechikish_ms(500);
read_DS1307(0×01); /*Daqiqani o‘qing*/
_kechikish_ms(500);
write_DS1307(0×01, 15); /*Kerakli daqiqani yozing*/
_kechikish_ms(500);
read_DS1307(0×01); /*Daqiqani o‘qing*/
}

Rasmda birinchi registrga 01 kirish, 23-daqiqa o'qilishi ko'rsatilgan. Keyin biz yozish funktsiyasidan foydalanamiz va 15 qiymatini kiritamiz. Keyingi o'qish funktsiyasi bilan biz soat displeyida 15 qiymatiga egamiz.

Xo'sh, dasturning so'nggi misoli barcha registrlarning qiymatlarini chiqarishdir

esa (1)
{
kechikish_ms(500);
read_DS1307(0×00);
_kechikish_ms(500);
read_DS1307(0×01);
_kechikish_ms(500);
read_DS1307 (0×02);
_kechikish_ms(500);
read_DS1307 (0×03);
_kechikish_ms(500);
read_DS1307 (0×04);
_kechikish_ms(500);
read_DS1307 (0×05);
_kechikish_ms(500);
read_DS1307 (0×06);
_kechikish_ms(500);
}

Quyidagi rasmda 7 ta registr ma'lumotlari ko'rsatilganligi ko'rsatilgan.

Loyihaning manba kodi ilova qilingan:

(Yuklab olinganlar: 601 kishi)

Ana xolos. Keyingi maqolada biz apparat soatini ulaymiz, vaqtni indikatorda ko'rsatamiz va soat bilan ishlash uchun ikkilik kasr formati bilan tanishamiz. Hammaga hayr.

Haqiqiy vaqtni soniyalar, daqiqalar, soatlar, oy sanalari, oylar, hafta kunlari va yillar bilan hisoblash, joriy yilning 2100 gacha bo'lgan balandligini hisobga olgan holda.

Ma'lumotlarni saqlash uchun 56 bayt o'zgaruvchan operativ xotira

2 simli ketma-ket interfeys

Dasturlashtiriladigan kvadrat impuls generatori. 1 Gts, 4,096 kHz, 8,192 kHz va 32,768 kHz chastotalarni chiqarishi mumkin.

Asosiy quvvat manbaining o'chirilishini va zaxira quvvat manbaini ulashni avtomatik aniqlash

24 soatlik va 12 soatlik rejim

25C ° haroratda zahiraviy batareya bilan quvvatlanganda iste'mol 500 nA dan oshmaydi

Mikrosxema sakkiz pinli DIP va SOIC paketlarida mavjud. Pinout hamma uchun bir xil. Quyida rasmni to'ldirish uchun ma'lumotlar varag'idan chiziqlar beraman.

Chip uchun hujjatlar (ma'lumotlar varag'i)

Pin tayinlash:

. X1, X2- 32,768 kHz kvarts rezonatorini ulash uchun xizmat qiling

. Vbat- Har qanday standart uch voltli lityum batareya yoki boshqa quvvat manbai uchun kirish. DS1307 normal ishlashi uchun batareya zo'riqishida 2,0 ... 3,5 V oralig'ida bo'lishi kerak. 48 mA / soat yoki undan ortiq quvvatga ega lityum batareya quvvat yo'qligida DS1307 ni qo'llab-quvvatlaydi.
25 ° S haroratda 10 yildan ortiq.

. GND- umumiy minus

. Vcc- Bu +5V kirish, ta'minot kuchlanishi 1,25 * VBAT dan yuqori bo'lsa, qurilma to'liq yoqilgan va ma'lumotlarni o'qish va yozish mumkin. Qurilmaga 3V batareya ulanganda va Vcc 1,25 * VBAT dan past bo'lsa, o'qish va yozish taqiqlanadi, ammo vaqtni belgilash funktsiyasi ishlashda davom etadi. Vcc VBAT dan pastga tushganda, RAM va RTC batareya quvvati VBAT ga o'tadi.

. SQW/OUT- To'rtburchak impulslar bilan chiqish signali.

. SCL- (Serial Clock Input - seriyali soat kiritish) - ketma-ket interfeys orqali ma'lumotlarni sinxronlashtirish uchun ishlatiladi.

. S.D.A.- (Serial ma'lumotlarni kiritish/chiqish) - ikki simli ketma-ket interfeys uchun kirish/chiqish pin.

SQW/OUT Pin bilan ishlash.

Birinchidan, DS1307 registrining tuzilishini ko'rib chiqaylik.

DS1307 chipining registr tuzilishi

Bizni 0x7 manzilida joylashgan "Boshqaruv registri" qiziqtiradi, chunki u SQW/OUT pinining ishlashini aniqlaydi.

Agar SQWE biti = 1 bo'lsa, u holda to'rtburchaklar impulslarning shakllanishi boshlanadi, agar SQWE = 0 bo'lsa, chiqishning chiqishi OUT bitining qiymati bo'ladi.

RS0 va RS1 bitlari impuls chastotasi uchun javobgardir, xususan:

RS0 RS1 Chastotasi
0 0 1 Gts
0 1 4,096 kHz
1 0 8,192 kHz
1 1 32,768 kHz

Mana bir misol:

Agar biz 1 Gts chastotali to'rtburchak impulslarni ishlab chiqarishni boshlashimiz kerak bo'lsa, u holda biz 0x68 manziliga ega bo'lgan mikrosxemaning 0x7 registriga o'n oltilik sanoq sistemasida 00010000 yoki 0x10 baytini yuborishimiz kerak.

Kutubxonadan foydalanish Wire.h, buni quyidagicha amalga oshirish mumkin:

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

Arduino-ga ulanish:

Turli kontrollerlarga asoslangan Arduino platalarida I2C interfeysi uchun mas'ul bo'lgan pinlar farq qiladi.

Kerakli kutubxonalar:

DS1307 bilan ishlash uchun: http://www.pjrc.com/teensy/td_libs_DS1307RTC.html
vaqt bilan ishlash uchun: http://www.pjrc.com/teensy/td_libs_Time.html

Vaqtni belgilash

. Kodda qo'lda

Vaqt dastur kodida qo'lda o'rnatiladi va Arduino platasiga yuklanadi. Bu usul eng aniq emas, chunki Kompilyatsiya va yuklash vaqtlari farq qilishi mumkin.

Kod namunasi

#o'z ichiga oladi #o'z ichiga oladi bekor sozlash; o'rnatish () { Serial.begin(9600); esa (! Serial ) ; // Faqat Leonardo taxtasi uchun // RTC dan vaqt oling Serial //sinxronizatsiya amalga oshmadi boshqa Serial.println("RTC tizim vaqtini belgiladi"); //qo'lda o'rnatish 16/02/2016 12:53 TimeElementste; te.Second = 0; //sekundlar te.Minute = 53; //daqiqa te.Soat = 12; //soat te.Kun = 16; //kun te.Oy = 2; // oy te.Yil = 2016 - 1970; //kutubxonadagi yil 1970 yildan boshlab hisoblanadi time_t timeVal = makeTime(te); RTC .to'siq (timeVal); setTime (timeVal); ) bekor halqa() ( digitalClockDisplay(); // chiqish vaqtini kechiktirish (1000); ) bekor digitalClockDisplay() ( Serial Serial.print(" "); Serial.print(kun()); Serial.print(" "); Serial.print(oy()); Serial.print(" "); Serial.print(yil()); Serial // ":" orqali chiqish vaqti Serial.print(":"); agar (raqamlar< 10) Serial.print("0"); Serial.print (raqamlar); )

. dan o'rnatish"Port monitori"

Aniqroq vaqtni belgilash opsiyasi. Vaqt nazoratchi ishlayotgani uchun "port monitori" orqali o'rnatiladi.

Biz monitorni ochamiz, kerakli formatda ma'lumotlarni kiritamiz, mos yozuvlar soatiga qaraymiz, lahzani qo'lga kiritamiz va "yuborish" tugmasini bosing.

Kod namunasi

//joriy vaqtni ko'rsatish formati "DD.MM.YY hs:dd:ss" //bu erda DD - kun, MM - oy, YY - yil, hh - soat, mm - daqiqa, ss - soniya //YY - 2000-2099 yillar uchun 00 dan 99 gacha#o'z ichiga oladi #o'z ichiga oladi bool isTimeSet = noto'g'ri; // sana allaqachon o'rnatilgan yoki yo'qligini ko'rsatadigan bayroq bekor sozlash; o'rnatish () { Serial.begin(9600); esa (! Serial ) ; // Faqat Leonardo taxtasi uchun setSyncProvider(RTC.get); // RTC dan vaqt oling agar (timeStatus()!= timeSet) Serial.println("RTC bilan sinxronlash imkonsiz"); //sinxronizatsiya amalga oshmadi boshqa Serial.println("RTC tizim vaqtini belgiladi"); ) bekor halqa() (agar ( Serial.available()) ( // vaqt o'tishi bilan buyruq qabul qilindi setTimeFromFormatString( Serial.readStringUntil("\n" )); isTimeSet = rost; //sana belgilandi) agar (isTimeSet) // agar sana belgilangan bo'lsa( digitalClockDisplay(); //chiqish vaqti ) kechikish (1000); ) bekor raqamliClockDisplay() ( Serial.print(hour()); printDigits(daqiqa()); printDigits(ikkinchi()); Serial.print(" "); Serial.print(kun()); Serial.print(" "); Serial.print(oy()); Serial.print(" "); Serial.print(yil()); Serial.println(); ) void printDigits(int digits) ( // ":" orqali chiqish vaqti Serial.print(":"); agar (raqamlar< 10) Serial.print("0"); Serial.print(raqamlar); ) bekor setTimeFromFormatString (String vaqti) ( //KK.AA.YY hs:dd:ss int day = time.substring(0, 2).toInt(); int oyi = time.substring(3, 5).toInt(); int yil = time.substring(6, 8).toInt(); int soat = time.substring(9, 11).toInt(); int daqiqa = time.substring(12, 14).toInt(); int soniya = vaqt.substring(15, 17).toInt(); TimeElementste; te.Second = soniya; te.Minute = daqiqa; te.Hour = soat; te.Day = kun; te.Month = oy ; te.Yil = yil + 30; //kutubxonadagi yil 1970 yildan hisoblanadi. Biz 2000 yildan istaymiz time_t timeVal = makeTime(te); RTC .to'siq (timeVal); setTime (timeVal); )