Ds1307 tavsifi. AVR o'quv kursi

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 impuls chiqishidagi impuls chastotasini sozlash uchun mo'ljallangan, bu registrning pastki ikki bitida amalga oshiriladi. sukut bo'yicha u 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 MyClock1307, 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 mikrosxemalar registrlaridagi 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 o'qadigan 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)

Keling, 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 353

DS1307 - vaqtni hisoblash uchun mo'ljallangan kichik modul. DS1307ZN chipi asosida yig'ilgan va lityum batareya (LIR2032) bilan quvvatlanadi, bu esa uzoq vaqt davomida avtonom ishlash imkonini beradi. Shuningdek, modulda 32 KB o'zgaruvchan EEPROM xotirasi (AT24C32) mavjud. AT24C32 mikrosxema va DS1307ZN I2C interfeysi yordamida umumiy avtobus orqali ulanadi.

Texnik spetsifikatsiyalar

Ta'minot kuchlanishi: 5V
Ishlash harorati: – 40 ℃ … + 85 ℃
Xotira: 56 bayt (o'zgarmas)
Batareya : LIR2032 (avtomatik quvvat manbasini aniqlash)
Interfeys: I2C
Olchamlari: 28 mm x 25 mm x 8 mm

Umumiy ma'lumot

DS1307 modulidan foydalanish ko'pincha juda oqlanadi, masalan, ma'lumotlar kamdan-kam hollarda, bir haftadan ko'proq vaqt oralig'ida o'qilganda, boshqaruvchining o'z resurslaridan foydalanish asossiz yoki imkonsizdir. Masalan, Arduino platalarini uzoq vaqt davomida uzluksiz quvvat bilan ta'minlash, hatto batareyadan foydalanganda ham qimmatga tushadi.
O'z xotirasi va avtonomiyasi tufayli haroratning o'zgarishi va boshqalar kabi hodisalarni (avtonom quvvat manbai bilan) qayd etish mumkin, ma'lumotlar xotirada saqlanadi va modul xotirasidan o'qilishi mumkin. Shunday qilib, DS1307 moduli ko'pincha Arduino kontrollerlari aniq vaqtni bilishlari, ba'zi hodisalarni boshlashlari va hokazolarni bilishlari kerak bo'lganda ishlatiladi.

Boshqa qurilmalar bilan ma'lumotlar almashinuvi SCL va SDA pinlaridan I2C interfeysi orqali amalga oshiriladi. Elektr liniyasi bo'ylab shovqinni kamaytirish uchun C1 va C2 ​​kondansatkichlari kerak. SCL va SDA signallarining to'g'ri darajasini ta'minlash uchun R2 va R3 rezistorlari o'rnatiladi (quvvat manbaiga tortiladi). Modulning funksionalligini tekshirish uchun DS1307Z chipining 7-piniga 1 Gts chastotali to'rtburchaklar shaklidagi SQ signali beriladi. R4, R5, R6, VD1 elementlari lityum batareyani qayta zaryadlash uchun zarur. Shuningdek, platada DS18B20 harorat sensorini o'rnatish uchun o'rindiq (U1) mavjud (agar kerak bo'lsa, uni lehimlashingiz mumkin), siz quvvat manbaiga ulangan DS pinidagi ko'rsatkichlarni R1 rezistori orqali o'qishingiz mumkin. qarshilik 3,3 kOhm. Kontaktlarning sxemasi va maqsadini quyidagi rasmlarda ko'rish mumkin.

Kengashda ikkita kontakt guruhi mavjud, ular 2,54 mm balandlikda, non paneliga qulay ulanish uchun, men pinli ulagichlardan foydalanaman, ularni lehimlash kerak.

Birinchi kontaktlar guruhi:
DS: DS18B20 chiqishi (1 simli)


VCC: "+" moduli quvvat manbai
GND: "-" modulli quvvat manbai

Ikkinchi guruh aloqalari:
SQ: 1 MGts kirish
DS: DS18B20 chiqishi (1 simli)
SCL: Seriyali soat
SDA: ma'lumotlar liniyasi (Serial Dfta)
VCC: "+" moduli quvvat manbai
GND: "-" modulli quvvat manbai
BAT:

Batareyani zaryad qilish
Ta'riflanganidek, sizning modulingiz batareyani zaryadlashi mumkin, bu R4, R5, R6 komponentlari va D1 diodlari yordamida amalga oshiriladi. Ammo bu sxemaning kamchiliklari bor: R4 va R6 rezistorlari orqali batareya zaryadsizlanadi (foydalanuvchi ALEXEY ta'kidlaganidek, unchalik ko'p emas). Modul kam oqim iste'mol qilganligi sababli siz quvvat pallasini olib tashlashingiz mumkin, buning uchun R4, R5, R6 va VD1ni olib tashlang, R6 ni jumper bilan almashtiring (komponentlarni olib tashlaganingizdan so'ng siz oddiy CR2032 batareyasidan foydalanishingiz mumkin).

DS1307-ni Arduino-ga ulash

Kerakli qismlar:
Arduino UNO R3 x 1 dona.
DuPont sim, 2,54 mm, 20 sm x 1 dona.
USB 2.0 A-B kabeli x 1 dona.
Haqiqiy vaqt soati RTC DS1307 x 1 dona.

Ulanish:
DS1307 real vaqt soatini ulash uchun siz pin konnektorlarini birinchi pinlar guruhiga lehimlashingiz kerak. Keyinchalik, biz SCL (DS1307) simlarini 4-pinga (Arduino UNO) va SDA (DS1307) 5-pinga (Arduino UNO) ulaymiz, qolgan narsa VCC ni +5V ga va GND ni GND ga ulashdir. Aytgancha, I2C interfeysi chiqishlari turli Arduino platalarida farqlanadi; ularning har birining maqsadini quyida ko'rish mumkin.

DS1307 vaqtini sozlash
Avvalo, Arduino IDE ishlab chiqish muhitida “DS1307RTC” va “TimeLib” kutubxonalarini yuklab olishingiz va o‘rnatishingiz kerak, keyin vaqtni belgilashingiz, DS1307RTC kutubxonasidan “Fayl” -> “Misollar” misolini ochishingiz kerak. > “DS1307RTC” -> “SetTime” yoki quyidagi kodni nusxalash.

// DS1307RTC kutubxonasini ulang const char *monthName = ( "yanvar", "fevral", "mart", "apr", "may", "iyun", "iyul", "avgust", "sentyabr", "oktyabr" " , "noyabr", "dekabr"); tmElements_t tm; void setup() ( bool parse=false; bool config=false; // kompilyator ishga tushirilgan sana va vaqtni oling, agar (getDate(__DATE__) && getTime(__TIME__)) ( parse = true; // va RTCni sozlang. bu ma'lumot agar (RTC.write(tm)) ( config = rost; ) ) Serial.begin(9600); while (!Serial) ; // Arduino Serial Monitor kechikishini kuting(200); if (parse && config) ( Serial.print("DS1307 sozlangan vaqt="); Serial.print(__TIME__); Serial.print(", Sana="); Serial.println(__DATE__); ) aks holda (parse) ( Serial.println("DS1307) Aloqa xatosi:-("); Serial.println("Iltimos, sxemani tekshiring"); ) else ( Serial.print("Kompilyatordan ma'lumotni tahlil qilib bo'lmadi, Time=\""); Serial.print(__TIME__); Serial.print("\", Date=\""); Serial.print(__DATE__); Serial.println("\""); ) ) void loop() ( ) bool getTime(const char *str) ( int Soat, Min, Sek; agar (sscanf(str, "%d:%d:%d", &Soat, &Min, &Sec) != 3) false qaytaradi; tm.Soat = Soat; tm.Minute = Min; tm. Second = Sec; return true; ) bool getDate(const char *str) ( char Oy; int Kun, Yil; uint8_t monthIndex; agar (sscanf(str, "%s %d %d", Oy, &Kun, &Yil) != 3) false qaytaradi; uchun (monthIndex = 0; monthIndex< 12; monthIndex++) { if (strcmp(Month, monthName) == 0) break; } if (monthIndex >= 12) falseni qaytarish; tm.Day = Kun; tm.Oy = oyIndeks + 1; tm.Yil = TaqvimYrToTm(Yil); haqiqatni qaytarish; )

Biz ushbu eskizni Arduino kontrolleriga yuklaymiz (vaqt operatsion tizimdan olinadi), "Port monitoringi" ni oching.

Dastur
Kutubxonada yana bir misol bor, uni ochishingiz mumkin DS1307RTC “Fayl” -> “Misollar” -> “DS1307RTC” -> “ReadTest”

/* Sinov Arduino IDE 1.6.12 da o'tkazildi. Sinov sanasi 23/11/2016. */ #shu jumladan // #include Wire kutubxonasini qo'shing // #include TimeLib kutubxonasini qo'shing // DS1307RTC kutubxonasini ulang void setup() ( Serial.begin(9600); // Ma'lumot uzatish tezligini (!Serial) vaqtida o'rnating; // Seriyali port ulanishini kuting. Faqat Leonardo kechikishi uchun kerak (200); // 200 mks kuting Serial.println("DS1307RTC o'qish testi"); // Ma'lumotlarni ketma-ket portga chiqarish Serial.println("-------------------" ); // Ma'lumotlarni ketma-ket portga chiqarish ) void loop() ( tmElements_t tm; if (RTC.read(tm)) ( Serial.print("OK, Time = "); print2digits(tm.Hour); Serial.write (":"); print2raqam (tm.daqiqa); Serial.write(":"); print2digits(tm.Second); Serial.print(", Sana (D/M/Y) = "); Serial.print (tm.Day); Serial.write("/"); Serial.print(tm.Month); Serial.write("/"); Serial.print(tmYearToCalendar(tm.Year)); Serial.println() ; ) else ( if (RTC .chipPresent()) ( Serial.println("DS1307 to'xtatildi. Iltimos, SetTime-ni ishga tushiring"); Serial.println("vaqtni ishga tushirish va ishga tushirish uchun misol."); Serial.println (); ) else ( Serial .println("DS1307 o'qish xatosi! Iltimos, sxemani tekshiring."); Serial.println(); ) delay(9000); ) delay(1000); ) void print2digits(int number) (agar (raqam >= 0 && raqami)< 10) { Serial.write("0"); } Serial.print(number); }

Biz ushbu kodni Arduino kontrolleriga yuklaymiz, "Port monitoringi" ni oching.


Ushbu materialda biz real vaqt soati - DS1307 mikrosxemasidan foydalanib, TWI moduli bilan ishlashning qo'pol versiyasini ko'rib chiqamiz. Noqulaylik, chunki I2C orqali almashish yangi boshlanuvchilarga ortiqcha yuk bo'lmasligi uchun uzilishlarsiz va status kodlarini tahlil qilmasdan tashkil etiladi.

DS1307

DS1307 chipi vaqtni - soniyalarni, daqiqalarni, soatlarni, kunlarni, oylarni va yillarni hisoblash uchun mo'ljallangan. Ya'ni, mohiyatiga ko'ra, bu taqvimli soatdir.

U 32768 Gts chastotali o'zining kvarts osilatori bilan ishlaydi va ikkita quvvat manbasidan - asosiy va zaxiradan ishlay oladi. Ushbu mikrosxemaning muhim xususiyati uning kam iste'moli - ish rejimida 500 nA dan kam. Bunday iste'mol bilan DS1307 bir necha yil davomida uch voltli batareyada (~200 mAh quvvatga ega CR2032 turi) ishlashi mumkin. DS1307 shuningdek, pinlaridan birida kvadrat to'lqin hosil qilishi mumkin va u ma'lumotlarni saqlash uchun ishlatilishi mumkin bo'lgan 56 bayt operativ xotirani o'z ichiga oladi.

DS1307 uchun minimal ulanish sxemasi soat kristalini va bitta quvvat manbaini o'z ichiga oladi. Mikrosxema bilan ma'lumotlar almashinuvi I2C orqali amalga oshiriladi va DS1307 avtobusda faqat yordamchi qurilma sifatida ishlashi mumkin.

Qayerdan boshlash kerak?

Har qanday mikrosxemani ulash ma'lumotlar varag'ini o'rganishdan boshlanadi. DS1307 holatida biz quyidagilarni aniqlashimiz kerak: chip qanday uzatish tezligini qo'llab-quvvatlaydi, u qanday manzilga ega, xotira kartasi qanday ko'rinishga ega, unda boshqaruv bitlari yoki registrlari bormi, ma'lumotlarni qanday uzatish va uni qanday o'qish kerak. Quyida men kerakli ma'lumotlarni topgan ma'lumotlar jadvalidan skrinshotlar mavjud.

Bod tezligi DS1307




DS1307 I2C avtobusiga javob beradigan manzil




Xotira kartasi DS1307

Xotira xaritasi mikrosxemaning registrlari qaysi manzillarda joylashganligini va umuman olganda qancha ekanligini ko'rsatadi.

Sekundiyalar registri nol manzilda joylashgan. Registrning pastki 4 biti birliklar uchun ajratilgan, 0 dan 9 gacha bo'lgan raqam bo'lishi mumkin.


Bu ikkilik kodli o'nlik (BCD) formati deb ataladi.Ushbu formatda bir bayt faqat 0 dan 99 gacha raqamlarni ifodalashi mumkin.Qolgan soat va kalendar registrlarida bir xil formatdagi ma'lumotlar mavjud.

Sekundiyalar registrining 7-raqami boshqaruvchi raqamdir. Bu bitdagi 0 soatning ishlashiga imkon beradi, 1 uni o'chiradi. Quvvat qo'llanilganda, bu bit 1 ga o'rnatiladi.

Daqiqalar reestri birinchi manzilda joylashgan. U bilan hamma narsa aniq.

Ikkinchi manzil - soat registrining joylashgan joyi. Ushbu registrning 6-biti vaqt formatini belgilaydi. Agar u 1 ga o'rnatilgan bo'lsa, 12 soatlik format ishlatiladi, agar u qayta o'rnatilsa -24 soat.

Ettinchi manzilda SQW chiqishini boshqaruvchi registr mavjud. U turli chastotalardagi ichki soat signalini chiqarishi mumkin. Bit qiymatlari ma'lumotlar varag'ida tasvirlangan. Bizni endi ular qiziqtirmaydi.

Xo'sh, 8 dan 63 gacha bo'lgan manzillar RAM uchun ajratilgan. Ular ma'lumotlarni saqlash uchun ishlatilishi mumkin.

DS1307 ga ma'lumotlarni qanday yozish kerak

DS1307 ikkita rejimda ishlashi mumkin: qul qabul qiluvchi va qul uzatuvchi sifatida. Birinchi rejimda asosiy qurilma ma'lumotlarni DS1307 ga uzatadi va DS1307 uni qabul qiladi. Ikkinchisida asosiy qurilma DS1307 dan ma'lumotlarni oladi, bu esa o'z navbatida uni uzatadi. (Ammo ikkala holatda ham almashuv rahbar tomonidan boshlanadi!)

Har bir rejim uchun ma'lumotlar varag'ida tavsif va almashinuv diagrammasi mavjud. Ma'lumotlarni yozib olish quyidagi ketma-ketlikda amalga oshiriladi.



2. Magistr DS1307 manzilini nol tasdiqlovchi bit (manzil paketi) bilan avtobusga beradi, bu esa keyinchalik ma'lumotlarni yozish uchun slavega signal beradi.
3. Avtobusda DS1307 chipi mavjud bo'lsa, u master - ACK ga javob beradi.
4. Javobni olgandan so'ng, master DS1307 ga ma'lumotlarni yozish boshlanadigan registr manzilini uzatadi. Bu qiymat DS1307 ichki manzil hisoblagichiga yoziladi.
5. DS1307 masterga yana javob beradi.
6. Javobni olgach, master DS1307 registriga yozish uchun mo'ljallangan ma'lumotlar baytini slavega uzatadi.
7. DS1307 masterga javob beradi.
8. 6, 7-bosqichlar bir necha marta takrorlanadi.
9. Magistr avtobusda STOP holatini yaratadi.

DS1307 yozilgan manzil avtomatik ravishda bittaga oshiriladi. Oxirgi manzilga etib borgach, hisoblagich nolga qaytariladi. Siz istalgan miqdordagi baytni yozishingiz mumkin - kamida bitta, kamida hammasi.



1. Master avtobusda START holatini hosil qiladi.
2. Magistr DS1307 manzilini avtobusda o'rnatilgan qo'l siqish biti bilan chiqaradi, bu qulga keyingi ma'lumotlarni o'qish uchun signal beradi.
3. DS1307 masterga javob beradi.
4. DS1307 ichki manzil hisoblagichi tomonidan ko'rsatilgan ma'lumotlar baytini masterga uzatadi.
5. Taqdimotchi ma'lumotlarni qabul qilganligi haqida javob beradi.
6. 4, 5-bosqichlar bir necha marta takrorlanadi.
7. DS1307 ma'lumotlar baytini masterga uzatadi.
7. Taqdimotchi DS1307 javobini yaratmaydi.
8. Magistr avtobusga STOP holatini beradi.

Ma'lumotlar ichki hisoblagichning manzilidan o'qilganligi sababli, avval uning qiymatini ishga tushirish kerak. Bu registr manzili o'tkazilgandan so'ng bekor qilinadigan yozish operatsiyasi yordamida amalga oshiriladi.

Kod

Endi biz kodga o'tishimiz mumkin. Bizga kamida uchta funktsiya kerak:

Initializatsiya funktsiyasi
- ma'lumotlarni yozib olish funktsiyasi;
- ma'lumotlarni o'qish funktsiyasi.

Initializatsiya


#F_I2C 50000UL ni aniqlang
#TWBR_VALUEni aniqlang (((F_CPU)/(F_I2C)-16)/2)

#agar ((TWBR_VALUE > 255) || (TWBR_VALUE == 0))
#xato "TWBR qiymati to'g'ri emas"
#endif

void RTC_Init(void)
{
TWBR = TWBR_VALUE;
TWSR = 0;
}

Tezlik TWBR_VALUE makros yordamida o'rnatiladi. Bu erda oldingi qismda muhokama qilingan formuladan foydalaniladi. Kompilyatsiya paytida hisoblangan qiymat diapazonda ekanligiga ishonch hosil qilish uchun preprotsessor direktivalari yordamida tekshiriladi.

Ma'lumotlarni uzatish

Ma'lumot uzatish START holatidan boshlanadi. Uni yaratish uchun siz TWI modulini yoqishingiz, TWSTA bitini o'rnatishingiz va TWINT uzilish bayrog'ini tiklashingiz kerak. Bu TWCR boshqaruv registriga yozish orqali bir qatorda amalga oshiriladi.

Mikrokontroller START holatini avtobusga chiqarganda, TWINT biti o'rnatiladi va TWSR holat registridagi holat kodi o'zgaradi. Mikrokontroller keyingi operatsiyaga o'tishdan oldin TWINT biti o'rnatilguncha kutishi kerak. Bizning holatda kutish davriy so'rov orqali amalga oshiriladi (ahmoqona so'rov ... trolling bilan adashtirmaslik kerak).


TWCR = (1<while(!(TWCR & (1<

TWINT bitining har bir sozlanishi TWSR registridagi muayyan holat kodi bilan birga keladi. Aslida, operatsiyalarning muvaffaqiyatini kuzatish uchun biz ushbu kodlarni tekshirishimiz kerak. Ammo bizning kodimiz puxta (o'qitish) bo'lgani uchun biz buni qilmaymiz.

Keyinchalik, avtobusga manzil paketini yuborishingiz kerak. Biz manzilni TWDR ma'lumotlar registriga yuklaymiz va qo'l siqish bitini nolga o'rnatamiz. Manzilni yuklaganimizdan so'ng biz TWINT bitini qayta o'rnatamiz, TWI modulining keyingi ishlashini boshlaymiz va TWINT so'rovi tugashini kutamiz.


/*avtobusga SLA-W paketini berish*/
TWDR = (DS1307_ADR<<1)|0;
TWCR = (1<while(!(TWCR & (1<

Biz avtobusga DS1307 ga yozib olinadigan manzilni yuboramiz. Buning uchun ma'lumotlar registriga kerakli qiymatni yuklang, TWINT bitini qayta o'rnating va u o'rnatilguncha kuting.



TWDR = adr;
TWCR = (1<while(!(TWCR & (1<


/*STOP holatini shakllantirish*/
TWCR = (1<

To'liq yozish funktsiyasi kodi shunga o'xshash bo'ladi.


bekor RTC_SetValue(uint8_t adr, uint8_t maʼlumotlari)
{
/*START holatini shakllantirish*/
TWCR = (1<while(!(TWCR & (1<

/*avtobus uchun SLA-W paketini chiqaramiz*/
TWDR = (DS1307_ADR<<1)|0;
TWCR = (1<while(!(TWCR & (1<

/*ds1307 registrining manzilini kiriting*/
TWDR = adr;
TWCR = (1<while(!(TWCR & (1<

/*maʼlumotlarni uzatish yoki oʻtkazib yuborish*/
agar (ma'lumotlar != RTC_RESET_POINTER)(
/*bu maʼlumotlarni BCD formatiga aylantirish uchun*/
maʼlumotlar = ((maʼlumotlar/10)<<4) + data%10;

TWDR = ma'lumotlar;
TWCR = (1<while(!(TWCR & (1< }

/*STOP holatini shakllantirish*/
TWCR = (1<}

Ushbu funktsiyadan foydalanib, siz alohida registrlarga yozishingiz va keyingi ma'lumotlarni o'qish operatsiyasi uchun DS1307 ichki manzil registrini ishga tushirishingiz mumkin. Test loyihalarida funktsiyadan foydalanishga misol mavjud.

DS1307 ma'lumotlarini o'qish

Biz START holatini yaratamiz.


/*START holatini shakllantirish*/
TWCR = (1<while(!(TWCR & (1<

Biz avtobusga manzil paketini yuboramiz - manzil va o'rnatilgan qo'l siqish biti.


/*avtobus uchun SLA-R paketini chiqaramiz*/
TWDR = (DS1307_ADR<<1)|1;
TWCR = (1<while(!(TWCR & (1<

Biz ma'lumotlarni qabul qilamiz. Biz TWINT bitini qayta tiklaymiz va TWI modulining ishlashini boshlaymiz. Magistr keyingi baytni qabul qilish uchun qul signalini berishi uchun TWEA biti 1 ga o'rnatilishi kerak.
TWINT biti 1 ga qaytarilsa, ma'lumotlar registrida quldan olingan bayt bo'ladi.


/*tasdiqlangan ma’lumotlarni o‘qish*/
TWCR = (1<while(!(TWCR & (1<ma'lumotlar = TWDR;


/*tasdiqsiz ma’lumotlarni o‘qish*/
TWCR = (1<while(!(TWCR & (1<ma'lumotlar = TWDR;

/*STOP holatini shakllantirish*/
TWCR = (1<

DS1307-dan berilgan bitta bayt o'qish funktsiyasi uchun to'liq kod shunga o'xshash ko'rinadi.


uint8_t RTC_GetValue(void)
{
uint8_t ma'lumotlari;

/*START holatini shakllantirish*/
TWCR = (1<while(!(TWCR & (1<

/*SLA-R paketini avtobusga berish*/
TWDR = (DS1307_ADR<<1)|1;
TWCR = (1<while(!(TWCR & (1<

/*ma’lumotlarni o‘qish*/
TWCR = (1<while(!(TWCR & (1<ma'lumotlar = TWDR;

/*STOP holatini shakllantirish*/
TWCR = (1<

Ma'lumotlarni qaytarish;
}

DS1307 uchun sinov loyihasi

Odatdagidek, yuqorida aytilganlarning barchasini birlashtirgan sinov loyihasi. Dastur oddiy. Biz tashqi qurilmalarni ishga tushiramiz va dastlabki qiymatni DS1307 ga yuklaymiz. Keyingi tsiklda biz vaqtni o'qiymiz va uni LCD displeyda ko'rsatamiz. DS1307 bilan aloqa qilish uchun faqat uchta funktsiyadan foydalaniladi.

Keyinchalik D.S. tomonidan tarjima qilingan. Ioffe ( dsioffe@da. ru ) do'sti Stylus bilan faqat o'z tushuncham uchun. Hech qanday da'volar qabul qilinmaydi.

Tavsif

DS1307 - Seriyali interfeysli real vaqt soati - kam quvvat iste'moli, to'liq BCD taqvimi, soat va 56 bayt o'zgaruvchan SRAM. Manzil va ma'lumotlar 2 simli ikki yo'nalishli avtobus orqali ketma-ket uzatiladi. Soat/taqvim quyidagi ma'lumotlarni saqlaydi: soniyalar, daqiqalar, soatlar, kun, sana, oy va yil. Oyning oxiri 31 kundan kam bo'lgan oylar uchun avtomatik ravishda o'rnatiladi, shu jumladan kabisa yillari uchun ham. Soat AM/PM indikatori bilan 24 soatlik yoki 12 soatlik formatda ishlaydi. DS1307 o'rnatilgan quvvat monitoringi sxemasiga ega bo'lib, u quvvat yo'qotilishini aniqlaydi va kontaktlarning zanglashiga olib avtomatik ravishda batareya quvvatiga o'tadi.

Ish

DS1307 seriyali avtobusda tobe qurilma sifatida ishlaydi. Unga kirish uchun siz START holatini o'rnatishingiz va registr manzili bilan birga qurilma identifikatsiya kodini yuborishingiz kerak. Keyingi registrlarga STOP holati o'rnatilguncha ketma-ket kirish mumkin. Vcc 1,25 x Vbat dan pastga tushganda, qurilma aloqani to'xtatadi va manzil hisoblagichini qayta o'rnatadi. Bu vaqt ichida u noto'g'ri ma'lumotni yozib olishning oldini olish uchun kirish signallariga javob bermaydi. Vcc Vbatdan pastga tushganda, qurilma kam quvvat saqlash rejimiga o'tadi. Quvvat yoqilganda, qurilma quvvat kuchlanishi Vbat + 0,2V dan oshganda quvvatni batareyadan Vcc ga o'tkazadi va Vcc 1,25 x Vbat dan oshganda kirish signallariga javob beradi. 1-rasmdagi funktsional diagrammada ketma-ket real vaqtda soatning asosiy elementlari ko'rsatilgan. Quyidagi paragraflar har bir pinning vazifasini tavsiflaydi.



1-rasm. Funktsional diagramma DS1307

Signal tavsiflari

Vcc, GND - doimiy ta'minot kuchlanishi. Vcc = +5 volt. Quvvat normal chegaralar ichida bo'lsa, qurilma to'liq foydalanish mumkin va ma'lumotlarni yozish va o'qish mumkin. Qurilmaga uch voltli batareya ulanganda va Vcc 1,25 x Vbat dan past bo'lsa, o'qish va yozish taqiqlanadi. Biroq, vaqtni ortga hisoblash hali ham ishlaydi. Vcc Vbatdan pastga tushganda, RAM va vaqt quvvati tashqi 3V batareyaga o'tadi.

Vbat - Har qanday standart 3 voltli lityum xujayrasi yoki boshqa quvvat manbai uchun batareya kiritish. Oddiy ishlash uchun batareya zo'riqishida 2,5 va 3,5 V oralig'ida saqlanishi kerak. Haqiqiy vaqt soati va foydalanuvchi RAMga kirish taqiqlangan daraja ichki o'rnatilgan 1,25 x Vbat. 35 mA / soat yoki undan ko'p quvvatga ega lityum batareya DS1307 ni quvvat yo'qligida 10 yildan ortiq quvvatlantirish uchun etarli.

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

S.D.A. (Serial ma'lumotlarni kiritish/chiqish) - SDA - 2 simli ketma-ket interfeys uchun ma'lumotlarni kiritish/chiqarish. Bu tashqi tortishish qarshiligini talab qiladigan ochiq drenaj chiqishi.

SQW/OUT (Kvadrat kvadrat / chiqish drayveri) - SQWE biti 1 ga o'rnatilganda, SQW/OUT chiqishi to'rt chastotadan birida kvadrat to'lqin impulslarini ishlab chiqaradi: 1 Gts, 4 KHz, 8 KHz, 32 KHz. SQW/OUT pinasi ochiq drenajdir va tashqi tortish rezistorini talab qiladi.

X1, X2 - standart kvarts kristalini 32,768 KHz ulash uchun simlar. Osilatorning ichki sxemasi nominal sig'imga (CL) 12,5 pF bo'lgan kristall bilan ishlashga mo'ljallangan.

Soat va RAM manzil maydoni

DS1307 ning RTC va RAM registrlari uchun manzil xaritasi 2-rasmda ko'rsatilgan. RTC registrlari 00h dan 07hgacha bo'lgan manzillarda joylashgan. RAM registrlari 08h dan 3Fh gacha bo'lgan manzillarda joylashgan. Ko'p baytli kirish vaqtida manzil ko'rsatkichi RAM maydonining oxiri 3Fh ga yetganda, u soat maydonining boshlanishi 00h ga qaytadi.

Tarjimonning eslatmasi:

Davlatlarni ro'yxatdan o'tkazish D.S. 1307 quvvat yoqilganda (ikkilik raqamlar):

(sxema ichidagi mikroprotsessor emulyatori yordamida eksperimental tarzda o'rnatilgan)

soniya 10 000 000 quvvat yoqilganda soat to'xtashini bildiradi!

daqiqa0

soat0

kun 1

sana 1

oy 1

yil 0

nazorat 11


Soat va kalendar

Vaqt va sana ma'lumotlari tegishli registrlarni o'qish orqali olinadi. Soat registrlari 3-rasmda ko'rsatilgan. Vaqt va kalendar tegishli registrlarga baytlarni yozish orqali o'rnatiladi yoki ishga tushiriladi. Vaqt va kalendar registrlarining mazmuni ikkilik kodli o'nlik (BCD) formatida saqlanadi. 0 registrining 7-biti soatni to'xtatish (CH) bitidir. Ushbu bit 1 ga o'rnatilganda, generator to'xtatiladi. Nolga qaytarilganda, generator ishlaydi.

DS1307 12 soatlik yoki 24 soatlik rejimda ishlashi mumkin. Soat registrining 6-biti ushbu rejimlardan birini belgilaydi. 1 ga teng bo'lganda, 12 soatlik rejim o'rnatiladi. 12 soatlik rejimda yuqori bit 5 tushdan keyin vaqtni bildiradi. 24 soatlik rejimda 5-bit ikkinchi bit 10 soat (20-23 soat).

Nazorat registri


DS1307 boshqaruv registri SQW/OUT pinining ishlashini boshqarish uchun mo'ljallangan.

OUT (chiqish nazorati): Bu bit kvadrat to'lqin ishlab chiqarish o'chirilganda SQW/OUT pinidagi chiqish darajasini nazorat qiladi. Agar SQWE = 0 bo'lsa, SQW/OUT pinidagi mantiqiy daraja, agar OUT = 1 bo'lsa, 1, OUT = 0 bo'lsa, 0 bo'ladi.

SQWE (Kvadratni yoqish): Agar bu bit 1 ga o'rnatilgan bo'lsa, kvadrat to'lqin hosil qilish yoqiladi. Kvadrat to'lqin chastotasi RS0 va RS1 bitlarining qiymatlariga bog'liq.

R.S. (Chastotani tanlash): Bu bitlar kvadrat to'lqinning chastotasini, uni yaratish yoqilganda nazorat qiladi. 1-jadvalda RS bitlari bilan belgilanishi mumkin bo'lgan chastotalar ko'rsatilgan.

2 simli seriyali avtobus

DS1307 ikki tomonlama 2 simli avtobus va ma'lumotlarni uzatish protokolini qo'llab-quvvatlaydi. Avtobusga ma'lumotlarni jo'natuvchi qurilma transmitter, ma'lumotlarni qabul qiluvchi qurilma esa qabul qiluvchi deb ataladi. Transmissiyani boshqaradigan qurilma master deb ataladi. Usta tomonidan boshqariladigan qurilmalar quldir. Avtobus ketma-ket soatlarni (SCL) ishlab chiqaradigan, avtobusga kirishni nazorat qiluvchi va START va STOP holatlarini yaratuvchi master tomonidan boshqarilishi kerak. DS1307 2 simli avtobusda qul sifatida ishlaydi. Ushbu 2 simli protokoldan foydalangan holda odatiy avtobus konfiguratsiyasi 4-rasmda ko'rsatilgan.


Quyidagi avtobus protokoli aniqlanadi:

Ma'lumot uzatish faqat avtobus ishlamay qolganda boshlanishi mumkin.

Ma'lumot uzatishda, soat chizig'i yuqori bo'lganda, ma'lumotlar liniyasidagi signal doimiy bo'lib qolishi kerak. Soat chizig'i yuqori bo'lganda ma'lumotlar liniyasidagi o'zgarishlar nazorat signallari sifatida talqin qilinadi.

Shunga ko'ra, quyidagi avtobus shtatlari aniqlandi:

Shinasiz . Ikkala yo'nalish: ma'lumotlar va soat yuqori.

Ma'lumot uzatishni boshlang: Soat chizig'i yuqori bo'lganda ma'lumotlar liniyasining yuqoridan pastga o'tishi START holatini belgilaydi.

Ma'lumot uzatishni to'xtating: Soat chizig'i baland bo'lganda ma'lumotlar liniyasining pastdan yuqoriga o'tishi STOP holatini belgilaydi.

To'g'ri ma'lumotlar: START holatidan so'ng, soat chizig'i yuqori bo'lganda ma'lumotlar liniyasidagi daraja o'zgarmasa, chiziq ma'lumot holatida hisoblanadi. U faqat past soat vaqtlarida o'zgarishi kerak. Bitta ma'lumot uchun bitta soat pulsi mavjud. Har bir ma'lumot uzatish START holatidan boshlanadi va STOP holati bilan tugaydi. Ushbu holatlar o'rtasida uzatiladigan ma'lumotlar baytlari soni cheklanmagan va master tomonidan belgilanadi. Ma'lumot baytlarda uzatiladi va har bir qabul qiluvchi to'qqizinchi bit bilan tasdiqnoma yuboradi.

Tasdiqlash : Har bir qabul qiluvchi qurilmaga murojaat qilinganda, har bir baytni olgandan so'ng, tasdiqlash talab qilinadi. Magistr ushbu tasdiq biti bilan bog'liq bo'lgan qo'shimcha soat pulsini ishlab chiqarishi kerak. Tasdiqlash moslamasi SDA chizig'ini qabul qilish soati pulsi paytida erga tortishi kerak, shunda SDA chizig'i tan olish soati yuqori bo'lgan vaqt davomida past bo'lib qoladi. Albatta, sozlash va ushlab turish vaqtlarini hisobga olish kerak. Quldan ma'lumot olayotganda, master quldan uzatilgan oxirgi baytda tasdiqlash bitini yaratmasdan, ma'lumotlarning tugashi haqida signal berishi kerak. Bunday holda, masterga STOP holatini o'rnatishga ruxsat berish uchun qul ma'lumotlar liniyasini baland haydash kerak.

Ma'lumotlarni uzatish

5, 6 va 7-rasmlarda ma'lumotlarning 2 simli shina orqali qanday uzatilishi batafsil ko'rsatilgan. 6 va 7-rasmlarda ko'rsatilganidek, uzatish paytida R/W bitining holatiga qarab, ikki xil bo'lishi mumkin. ma'lumotlarni uzatish:


1. Ma'lumotlar masterdan slavega uzatiladi. Usta tomonidan uzatiladigan birinchi bayt qulning manzilidir. Keyin ma'lumotlar baytlari keladi. Qul qabul qilingan har bir baytdan keyin tasdiq bitini qaytaradi. Ma'lumotlar eng muhim bit (MSB) dan boshlab uzatiladi.

2. Ma'lumotlar quldan masterga uzatiladi. Birinchi bayt (qul manzili) master tomonidan uzatiladi. Keyin qul tasdiq bitini qaytaradi. Keyin qul ma'lumotlar baytlarini uzatadi. Magistr oxirgi baytdan tashqari barcha qabul qilingan baytlardan so'ng tasdiq bitini qaytaradi. Qabul qilingan oxirgi bayt oxirida "tasdiq" qaytariladi. Magistr barcha soat pulslarini va START va STOP holatlarini hosil qiladi. Uzatilish STOP holati yoki takroriy START holatining shakllanishi bilan tugaydi. Takroriy START holati keyingi ketma-ket uzatishning boshlanishi bo'lganligi sababli, avtobus chiqarilmaydi. Ma'lumotlar birinchi navbatda eng muhim bit (MSB) uzatiladi. DS1307 quyidagi ikkita usuldan foydalanishi mumkin:

1. Slave Receiver Mode (DS1307 Write Mode): Seriyali ma'lumotlar va soatlar SDA va SCL orqali qabul qilinadi. Har bir bayt uzatilgandan so'ng, tasdiq biti uzatiladi. START va STOP holatlari ketma-ket uzatishning boshlanishi va tugashi sifatida tan olinadi. Manzilni aniqlash qul manzil va yo'nalish bitini olgandan so'ng apparat tomonidan amalga oshiriladi (6-rasmga qarang). Manzil bayti DS1307 ning yetti bitli 1101000 manzilini o'z ichiga oladi, undan keyin yo'nalish biti (R/W), yozilganda 0 bo'ladi.Manzil bayti qabul qilingandan va dekodlangandan so'ng, DS1307 SDA liniyasida tasdiqlashni chiqaradi. DS1307 qul manzili va yozish bitini tasdiqlagandan so'ng, master registr manzilini DS1307 ga uzatadi. Bu DS1307 da registr ko'rsatkichini o'rnatadi. Shundan so'ng usta ma'lumotlar baytlarini DS1307 ga uzatishni boshlaydi, bu esa har bir qabul qilingan baytni tasdiqlaydi. Yozuv oxirida taqdimotchi STOP holatini yaratadi.

2. Slave transmitter rejimi (DS1307 dan o'qish rejimi): Birinchi bayt qul qabul qiluvchi rejimidagi kabi qabul qilinadi va qayta ishlanadi. Biroq, bu rejimda yo'nalish biti uzatish yo'nalishi o'zgarganligini ko'rsatadi. Seriyali ma'lumotlar DS1307 dan SDA orqali uzatiladi, ketma-ket soatlar esa SCL orqali DS1307 ga uzatiladi. START va STOP holatlari ketma-ket uzatishning boshlanishi va tugashi sifatida tan olinadi (7-rasmga qarang). Manzil bayti - master tomonidan START holati yaratilgandan keyin olingan birinchi bayt. Manzil bayti DS1307 ning yetti bitli 1101000 manzilini o'z ichiga oladi, undan keyin yo'nalish biti (R/W), o'qilganda 1 bo'ladi. Manzil bayti qabul qilingandan va dekodlangandan so'ng, DS1307 SDA liniyasida tasdiqnoma chiqaradi. Keyin DS1307 registr ko'rsatkichi ko'rsatgan registr manzilidan boshlab ma'lumotlarni uzatishni boshlaydi. Agar o'qish rejimini ishga tushirishdan oldin registr ko'rsatkichi yozilmagan bo'lsa, u holda o'qiladigan birinchi manzil registr ko'rsatkichida qolgan oxirgi manzil bo'ladi. DS1307 o'qishni yakunlash uchun "Nack" ni olishi kerak.





QAYDLAR:

1. Barcha kuchlanishlar erga havola qilinadi.

2. Mantiqiy nol kuchlanishlar sig'imli yuklar uchun V CC =4,5V, V OL =GND da 5 mA cho'milish oqimida ko'rsatilgan.

3. V CC =5.0V va SDA, SCL = 5.0V bilan belgilangan I CCS.

4. V CC =0V, V BAT =3V.

5. Ushbu davrdan so'ng birinchi soat pulsi hosil bo'ladi.

6. Qurilma SCL ning tushib ketgan chetining aniqlanmagan hududini ko'prik qilish uchun SDA signalini (SCL signalining V IHMINiga ishora qilinadi) kamida 300 ns ushlab turish vaqtini ta'minlashi kerak.

7. Maksimal t HD:DAT faqat agar qurilma SCL signalining LOW davrini (t LOW) uzaytirmasa, bajarilishi kerak.

8. C B - pF da bitta avtobus liniyasining umumiy sig'imi.

9. I CCA - maksimal chastotada SCL clocking = 100 KHz.

10. Faqat SCL.

11. SDA va SQW/OUT




Salom!
Bugun men sizga DS1307 kabi qiziqarli mikrosxema haqida gapirib bermoqchiman. Bu ajoyib soat va taqvim va eng yaxshisi shundaki, bu kichkina soatda CVAVR-da Injil mavjud. Ha, va u mening qo'limga keldi va men uni qiynoqqa solishga qaror qildim 8) Avvalo, uning ulanishi uchun diagramma kerak. Bu juda oddiy va ma'lumotlar varag'idan olingan. Ammo kichik bir istisno bor. Ma'lumotlar varaqasi quvvat pinini va to'rtburchak puls chiqish pinini o'rtasida rezistorni ulashni talab qiladi. Keyingi loyihalarni sinab ko'rish uchun men alohida doska yasaganim uchun LEDni ham qo'shdim. Bu juda qulay bo'lib chiqdi. Siz, masalan, ikkinchi zarbalarni ko'rishingiz mumkin.
Aslida sxema.

Va bu erda u yig'ilganga o'xshaydi.

Men ATmega32 + LCD 16x2 + DS1307 bilan birgalikda testlarni o'tkazdim. Keyin ikkita variant mavjud. Birinchidan, kodni to'g'ridan-to'g'ri CVAVR generatoridan foydalanib yaratishingiz mumkin. Ikkinchidan, hamma narsani o'zingiz yozing. Men buni o'zingiz yozishni taklif qilaman, lekin avval DS1307 ning xususiyatlarini ko'rib chiqaylik.
1. rtc_init(rs, sqwe, tashqarida) Bu chipni ishga tushirish uchun birinchi funktsiyadir. Endi barcha dalillar joyida. rs oyoqqa chiqish to'rtburchak impulslar chastotasini o'rnatish uchun zarur SQW/OUT. 0 - 1 Gts 1 - 4096 Gts 2 - 8192 Gts 3 - 32768 Gts sqwe to'rtburchak impulslarning chiqishini ta'minlash uchun kerak. 1 - mumkin 0 - yo'q. tashqariga to'rtburchak impulslarni chiqarishga ruxsat bo'lmasa, chiqish oyog'idagi mantiqiy darajani aniqlash uchun kerak. Vo egildi. Muxtasar qilib aytganda, agar siz oyog'ingizni silkitishingiz shart bo'lmasa SQW/OUT, keyin parametr sqwe qo'ymoq 0 va endi agar tashqariga teng 1 , keyin u oyoq ustida bo'ladi 1 , va agar biz yozsak 0 , keyin oyog'ida ham 0 . Misol: rtc_init (0,1,0); Bu 1 Gts chastotali to'rtburchaklar impulslarning chiqishini yoqishni anglatadi. 2. rtc_set_time(soat, min, sek) Nomidan ko'rinib turibdiki, bu funksiya vaqtni belgilaydi. Bu erda hamma narsa oddiy, argumentlar soatlar, daqiqalar va soniyalardir. 3. rtc_set_date(kun, oy, yil) Xuddi shu shlyapa, lekin sana bilan. 4. rtc_get_time(&soat, &daq, &sek) Va bu erda batafsilroq. Bu funksiya joriy vaqtni olish uchun kerak. Funktsiya argumentlari o'zgaruvchilar manzillari bo'lib, u keyinchalik qiymatlarni yozadi. Bu funksiyalar faqat bitta parametrni (masalan, C) qaytarishi mumkinligi sababli amalga oshiriladi. Ya'ni, funktsiyani chaqirishdan oldin, siz uchta belgisiz char o'zgaruvchisini ishga tushirishingiz kerak. 5. rtc_get_date(&kun, &oy, &yil) Xuddi shu narsa, lekin sana bilan. Endi misollar bilan hamma narsa bir xil. rtc_set_time(15, 0, 0); Vaqtni 15:00:00 ga belgilang rtc_set_date(14, 2, 14); Sana 2014-yilning 14-fevraliga belgilandi. Eʼtibor bering, yil ikki raqam bilan yozilgan. Ma'lumotlar jadvali qismi: Haqiqiy vaqt soati (RTC) soniyalar, daqiqalar, soatlar, oy sanasi, oy, hafta kuni va yilni sanab, 2100 gacha bo'lgan Kabisa yili kompensatsiyasiga ega. 2100 yilgacha va biz funktsiyaga imzosiz belgilarni o'tkazganimiz sababli, qiymat 0 dan 255 gacha olinishi mumkin. Men yuzdan ortiq haydashga harakat qilmadim, lekin qo'rquvdan yozilgan 2014 yil 144 sifatida ko'rsatildi. 8) unsigned char soat, min, sek; rtc_get_time(&soat, &min, &sek); Avval o'zgaruvchilarni ishga tushiramiz, so'ngra funktsiyani chaqiramiz. Uni chaqirganingizdan so'ng, siz o'zgaruvchilarga yoziladigan vaqt bilan xavfsiz ishlashingiz mumkin. unsigned char kun, oy, yil; rtc_get_date(&kun, &oy, &yil); Asos sifatida, bu bir xil narsa, faqat sana o'zgaruvchilarda bo'ladi. Va nihoyat, va'da qilinganidek, sharhlar bilan butun dastur. /**************************************************** * *** Haqiqiy vaqtda DS1307 mikrokontrolleri bilan ishlash dasturi: ATmega32 Kvars chastotasi: 3,686400 MGts ******************************** ******* ****************************/ #o'z ichiga oladi // I2C shinasi uchun port va pinlarni belgilang #asm .equ __i2c_port=0x1B ;PORTA .equ __sda_bit=0 .equ __scl_bit=1 #endasm #include // DS1307 bilan ishlash uchun kutubxonani ulang #o'z ichiga oladi // LCD qaysi portga ulanganligini belgilang #asm .equ __lcd_port=0x12 ;PORTD #endasm // LCD bilan ishlash uchun kutubxonani ulang #o'z ichiga oladi // Satrlar bilan ishlash uchun kutubxonani ulang #o'z ichiga oladi asosiy bekor (bo'sh) ( // Satr uchun massivni va ma'lumotlar uchun o'zgaruvchilarni ishga tushirish belgilanmagan belgilar qatori; unsigned char c, m, s, d, me, g; PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; // I2C avtobusini ishga tushiring i2c_init(); // DS1307 ni ishga tushiring rtc_init (0,1,0); // Displeyni ishga tushirish lcd_init(16); // Vaqt va sanani belgilash uchun men ushbu funksiyalardan bir marta foydalandim. // rtc_set_time(16, 0, 0); // rtc_set_date(13, 2, 14); esa (1) ( // Vaqt bor rtc_get_time(&c, &m, &s); lcd_gotoxy(0,0); // Formatlangan sprintf(string, "Vaqt %02i:%02i:%02i ", c, m, s); // Vaqtni ko'rsatish lcd_puts(string); // Sana oldim rtc_get_date(&d, &me, &g); lcd_gotoxy(0,1); // Formatlangan sprintf(string, "Sana %02i.%02i.20%2i ", d, men, g); // Sanani chiqaring lcd_puts(string); ); ) Xo'sh, hammasi shu kabi ko'rinadi. Yangi boshlanuvchilar uchun, menimcha, bu aniq, lekin keyin kimga g'amxo'rlik qiladi. Bu amalda qanday ko'rinishga ega.



Rim 29.10.15 21:30

Maqola uchun rahmat, hamma narsa aniq va suvsiz.

Aleksey 29.10.15 22:47

Urinish)

Zhenya 07.11.15 09:33

Aleksey sizga katta rahmat!

Aleksey 07.11.15 10:23

Iltimos.

Butrus 05.04.16 00:11

Buni flowcode dasturida takrorlash mumkinmi?

Aleksey 16.04.05 08:52

Bu qanday dastur?

Mixail 09.09.16 00:18
Aleksey 09.09.16 12:16
Sergey 20.11.16 12:28

Misollarni batafsil tushuntirish uchun rahmat. Iltimos, RTC-da vaqtni qo'lda sozlash misolini qo'sha olasizmi? Ba'zan vaqtni sozlash hali ham zarur.

Aleksey 20.11.16 15:33

DS1307 va DS3231 real vaqt soatlari bilan to'liq ishlash uchun men kutubxonaga kiritilgan funktsiyalarni yozdim. Men uni Atmel Studio ostida soddalashtirilgan loyihalarni yaratish uchun foydalanishni tavsiya qilaman. Siz ham qarashingiz mumkin video ushbu kutubxonadan foydalanish haqida.

Veniamin 10.12.16 23:33

Rtc_set_date(13, 2, 14);
Kompilyator "juda kam argumentlar" kabi yozuv haqida shikoyat qilishi mumkin, chunki 4 ta argument o'tkazilishi kerak, ulardan birinchisi haftaning kunidir. Shuning uchun, siz 4 ta raqamni uzatishingiz va olishingiz kerak - shuningdek, 4. Bilishimcha, kodlashning ba'zi versiyalarida u uchta bilan ishlaydi, lekin men shaxsan vaqt nima uchun osongina yozilishi va o'qilishini bilgunimcha ko'p narsalarni o'ylab topdim. men uchun, lekin sana emas.

Aleksey 11.12.16 00:00

Shuning uchun men CVAVR-dan uning murabbolari bilan voz kechdim (va ular nafaqat soatlarda), AtmelStudio-ga o'tdim va u uchun CVAVR kabi kutubxona yozdim. Endi hamma narsa men uchun ishlaydi va xato emas.)))

ANONIM 02.03.17 00:39

Men hammaga Ds1307 ni 3231 bilan almashtirishni maslahat beraman, chunki 32 aniqroq, 1307 esa faqat taymerlar uchun mos keladi.

ANTONIM 03.04.17 15:18

Aniqrog'i - aniq qancha? IMHO soatning aniqligi kvarts rezonatorining 99,9999999% aniqligi bilan aniqlanadi.

Aleksey 17.04.03 16:09

Xo'sh, unchalik emas. Odam, ehtimol, faqat harorat kompensatsiyasini nazarda tutgan, chunki kvarts chastotasi ham haroratga bog'liq.

Igor Kazantse 31.07.19 16:54

Vaziyat: Men mikruhu DS1307 sotib oldim. Men sizning sxemangizni lehimladim. Zarur bo'lgan yagona funktsiya - ikkinchi impulslarning chiqishi. Boshqa hech narsa kerak emas. Nima qilish kerak? Qaysi dasturchidan foydalanishim kerak? [elektron pochta himoyalangan]

Aleksey 01.08.19 10:50

Dasturchi kerak emas. SQW/OUT chiqish pinining chastotasini belgilash uchun buyruq yuboradigan har qanday mikrokontroller uchun dastur yozishingiz kerak. Bundan tashqari, mikrosxemada kuchlanish mavjud ekan, chiqish 1 Gts kvadrat to'lqinga ega bo'ladi.