DS3231 - वास्तविक समय घड़ी का कनेक्शन। घड़ी - विभिन्न Arduino बोर्डों पर उच्च परिशुद्धता (अत्यंत सटीक I2C) चिप DS3231 SDA और SCL पिन पर डिज़ाइनर

💖क्या आपको यह पसंद है?लिंक को अपने दोस्तों के साथ साझा करें

यह सब क्यों आवश्यक है?

60 सेकंड * 60 मिनट * 24 घंटे * 365 दिन = 31,536,000 सेकंड प्रति वर्ष।

इन लाखों में से प्रत्येक के लिए, 2 सेकंड एक दिशा या दूसरे में जा सकते हैं। 31.5 मिलियन को दस लाख से विभाजित करें और 2 से गुणा करें: हमें प्रति वर्ष 63 सेकंड (अधिकतम) मिलते हैं। स्वीकार्य विकल्प? बहुत। लेकिन हर छह महीने में एक बार मैं समय को सिंक्रनाइज़ करता था ताकि यह 1 मिनट में फिट हो जाए।

आप आम तौर पर मॉड्यूल घड़ी पर किस तरह से समय निर्धारित कर सकते हैं?

परंपरागत रूप से, DS3107 मॉड्यूल से शुरू करके, लाइब्रेरी का उपयोग करने के उदाहरणों में से एक Arduino स्केच का उपयोग करके समय निर्धारित किया गया था। एल्गोरिदम इस प्रकार है: स्केच खोलें, "संकलित करें और अपलोड करें" पर क्लिक करें, और जब नियंत्रक पहली बार लॉन्च होता है, तो समय निर्धारित होता है। प्रश्न बना रहता है: किस समय? Arduino कैसे जान सकता है कि वास्तव में कौन सा समय निर्धारित करना है? और यह बहुत सरल है - स्केच संकलन का समय। हालाँकि, मुझे इस दृष्टिकोण के कई नुकसान दिखाई देते हैं:
  • संकलन का समय कंप्यूटर की "शक्ति" पर निर्भर करता है;
  • डाउनलोड का समय उस गति पर निर्भर करता है जिस गति से संकलित स्केच को Arduino बोर्ड में स्थानांतरित किया जाता है;
  • अपलोड किया गया स्केच "डिस्पोजेबल" है (यह Arduino पर अपलोड करने के तुरंत बाद अप्रचलित हो जाता है)।
आप इन प्रतिबंधों से बचने के लिए "काम" कैसे कर सकते हैं? ठीक है, उदाहरण के लिए, संकलन समय को जानकर (प्रयोगात्मक रूप से सेट करके), आप कंप्यूटर पर घड़ी को इस समय से आगे "ड्राइव" कर सकते हैं। फिर संकलन चलाएँ, बोर्ड फ़्लैश करें और समय निर्धारित हो जाएगा। विधि का लाभ इसकी सापेक्ष सरलता है। नुकसान - अपेक्षाकृत असुविधाजनक, अपेक्षाकृत गलत, एक बार की विधि।

आप और क्या सोच सकते हैं? उदाहरण के लिए, आप मैन्युअल रूप से स्केच में आवश्यक समय निर्धारित कर सकते हैं, एक बटन प्रदान कर सकते हैं जिसे दबाया जा सकता है सही वक्तनिर्दिष्ट समय "हाथ से" निर्धारित करेगा, उदाहरण के लिए, वर्तमान क्षण से 2 मिनट: जबकि स्केच "भरा हुआ" है, जबकि हम बटन दबाने के बहुत आवश्यक क्षण को मैन्युअल रूप से ट्रैक करने की तैयारी करते हैं, बस कुछ ही मिनट बीत जाएंगे . और फिर, कंप्यूटर पर घड़ी को देखते हुए, बटन दबाने के लिए "उसी" क्षण की प्रतीक्षा करें। पेशेवर - अधिक कठिन पिछली विधि, लेकिन अभी भी अपेक्षाकृत सरल है, लेकिन पहली विधि की तुलना में अधिक सटीक है। नुकसान - यह विधि और भी असुविधाजनक है, इसमें अधिक समय लगता है, और यह अभी भी "एक बार" स्केच है।

किसे दोष देना है और क्या करना है?

अपने आप से ये दो आलंकारिक प्रश्न पूछने के बाद, मैं यह देखने के लिए इंटरनेट पर गया कि कंप्यूटर के साथ घड़ी मॉड्यूल के समय सिंक्रनाइज़ेशन को पहले से ही किसने लिखा था। और, जैसा कि आप जानते हैं, जो खोजता है वह हमेशा पाता है। मुझे इसके साथ एक विकल्प मिला। सिद्धांत रूप में, सब कुछ सरल है: एक नियमित "बैच फ़ाइल" "पहले" विधि में प्राप्त वर्तमान पूर्ण समय को पार्स करती है (क्योंकि समय के अलावा, आपको एक तारीख की भी आवश्यकता होती है), समय को 2 सेकंड बढ़ा देता है, और " जब तक यह नया लूप नहीं आ जाता तब तक एक खाली लूप चलाता है, COM पोर्ट में डेटा को "फेंकने" का समय "प्लस_दो_सेकंड"। इसके अलावा, "नए प्लस_टू_सेकंड" समय को एक अलग तरीके से ट्रैक किया जाता है (यदि कोई रुचि रखता है तो %time% के माध्यम से)। लेकिन इस तरह के निर्णय के "जाम" के बारे में बाद में। COM पोर्ट में "फेंक दिया गया" डेटा Arduino द्वारा पार्स किया जाता है और फिर मॉड्यूल में समय निर्धारित करता है। सब कुछ सरल, तार्किक और सुविधाजनक लगता है। लेकिन एक बहुत ही ख़राब शब्द है "BUT"। ऐसा लगता है कि यह सब एक जर्मन द्वारा लिखा गया है, और विंडोज़ में उसके क्षेत्रीय मानक "हमारे" से भिन्न हैं, और विशेष रूप से, भिन्नात्मक भाग को एक बिंदु द्वारा अलग किया जाता है, अल्पविराम से नहीं। जब घरेलू क्षेत्रीय मानकों के साथ लॉन्च किया जाता है, तो बैच फ़ाइल काम नहीं करती है, क्योंकि इसमें खाली लूप से बाहर निकलने का समय XX:XX:XX.xxx के साथ तुलना स्थिति द्वारा वर्णित है। ठीक है, आपको पूर्णविराम के स्थान पर अल्पविराम लगाने की आवश्यकता है - और बस इतना ही, "मैंने सब कुछ ठीक कर दिया।" लेकिन इतना ही नहीं (आप जांच सकते हैं कि और कौन याद रखता है कि "बैच पुस्तकों" में प्रोग्राम करना किस प्रकार की बुराई है)। बॉडी फ़ाइल को अधिक गंभीरता से ठीक करने की आवश्यकता है। और मैंने इसे "रिवाइंड मैट" और डॉस के लिए "मैनुअल" का उपयोग करके ठीक किया। "बैटनिक" ने इसे ठीक कर दिया, लेकिन स्केच अभी भी काम नहीं कर रहा था - समय निर्धारित नहीं था। यानी, डेटा पोर्ट पर भेजा गया था, Arduino ने इसे देखा, लेकिन "कुछ गलत हो गया।"

आइए देखें कि बैच फ़ाइल Arduino को क्या भेजती है और किस प्रारूप में (संदर्भ के लिए) भेजती है।

केस 83: //एस = दूसरा केस 68: //डी = मिनट (फारसी में दागीघे) केस 72: //एच = घंटा केस 84: //टी = महीने का दिन (जर्मन में टैग) केस 77: /// एम = महीना केस 74: /// जे = वर्ष (जर्मन में जहर)
डेटा S**~D**~H**~T*~M**~J****~ प्रारूप में भेजा जाता है, जहां ~ कैरिज रिटर्न के 2 बाइट्स हैं। कुल, 31 बाइट्स. यह ज़्यादा नहीं लगता, डेटा जल्दी भेजा जाएगा।

हालाँकि, एक असुविधा भी है - जैसा कि आप देख सकते हैं, सप्ताह का दिन नहीं भेजा गया है। केवल महीने का दिन. सप्ताह के दिनों पर निर्भर अलार्म वाली घड़ियों को लागू करने में समस्या होगी। सप्ताह का दिन स्केच में "हाथ से" सेट करना होगा, जो फिर से स्केच की कुछ "डिस्पोजेबिलिटी", इसकी हीनता पर संकेत देता है।

कारकों को जोड़ते हुए - "फ़ैक्टरी से स्केच की हीनता", सामान्य रूप से काम करने से इनकार, "हमारे" अक्षांशों के लिए "बॉडी फ़ाइल" को सही करने की आवश्यकता - मैंने अपने दम पर सब कुछ विकसित करने का फैसला किया। और यदि हां, तो मैं कमियों को दूर कर सकता हूं और डेटा प्रारूप को अनुकूलित कर सकता हूं।

सॉफ्टवेयर और हार्डवेयर।

सब कुछ काम करने के लिए, आपको 2 घटकों की आवश्यकता है: विंडोज़ के लिए एक प्रोग्राम और एक Arduino हार्डवेयर-सॉफ़्टवेयर संयोजन।

सबसे पहले, एक्सचेंज प्रोटोकॉल पर सामान्य डेटा। एक बार जब मैं भेजे जाने वाले डेटा प्रारूप को चुनने के लिए स्वतंत्र हो गया, तो मैंने फैसला किया कि 31 बाइट्स की जानकारी भेजना तर्कसंगत नहीं था, और प्रेषित डेटा को घटाकर 4 बाइट्स कर दिया। तो, क्या यह पर्याप्त था? आप 4 बाइट्स में क्या फिट कर सकते हैं? हाँ, यह काफी है. आपकी ज़रूरत की हर चीज़ इसमें फिट बैठती है। मुझे यकीन है कि कई लोगों ने अनुमान लगा लिया होगा कि 4 बाइट्स क्या हैं। जिन लोगों ने अनुमान नहीं लगाया है, उनके लिए मैं विकिपीडिया से एक लेख का एक अंश उद्धृत करूंगा:

UNIX समय (POSIX समय) - समय के क्षणों का वर्णन करने के लिए एक प्रणाली, UNIX और अन्य POSIX-संगत में अपनाई गई ऑपरेटिंग सिस्टम. 1 जनवरी 1970 (गुरुवार) की आधी रात (00:00:00 यूटीसी) के बाद से बीते सेकंडों की संख्या के रूप में परिभाषित किया गया है।
UNIX समय को एक पूर्णांक के रूप में दर्शाया जाता है जो मानव पठनीयता के लिए वर्ष, महीना, दिन, घंटा या मिनट निर्धारित करने के लिए गणना की आवश्यकता के बिना प्रत्येक गुजरते सेकंड के साथ बढ़ता है। आधुनिक UNIX समय UTC के अनुरूप है - गिनती SI सेकंड में होती है।

तो, UNIX समय को संग्रहीत करने वाला पूर्णांक 4 बाइट्स लेता है, जो 2,147,483,648 सेकंड तक चलने के लिए पर्याप्त है। और तब संभवसंभावित समस्याएं। संभावित क्यों? क्योंकि यह वह सीमा है जिस पर संख्या शायदनकारात्मक के रूप में व्याख्या की जानी चाहिए (जैसा कि एक समय में कई जिज्ञासु साथियों के आईफ़ोन के साथ होता है)। हो सकता है, लेकिन यह जरूरी नहीं है - यह इस पर निर्भर करता है कि प्रोग्रामर के हाथ प्रकृति द्वारा प्रदान की गई जगह से बढ़ते हैं या नहीं। संकेतित सेकंड की संख्या 03:14:08 19-जनवरी-2038 से मेल खाती है। इस समय तक, आप धीरे-धीरे ओएस के 64-बिट संस्करण पर स्विच कर सकते हैं, जहां समय 8-बाइट वेरिएबल में संग्रहीत किया जाएगा, जो अगले 292 अरब वर्षों तक आसानी से चलेगा। ऐसी संभावना है कि यह हमारे जीवनकाल के लिए पर्याप्त होगा। और फिर आपको UNIX के 128-बिट संस्करण में अपग्रेड करना होगा।

इस विकल्प पर आकर मैंने कौन सी समस्याएँ हल कीं? सबसे पहले, इसने स्थानांतरित बाइट्स की संख्या को बहुत कम कर दिया, जिससे समय सेटिंग की सटीकता मिलीसेकंड तक बढ़ जाती है। बहुत बढ़िया, है ना? और दो: मैंने (शायद) लिनक्स संगतता को आसान बना दिया है। मेरे लिए शर्म की बात है कि मैं लिनक्स का आदी नहीं हो सका और ज्यादातर विंडोज़ का ही उपयोग करता हूँ। मैं इसी विंडोज़ के लिए एक फ़ॉरवर्डिंग प्रोग्राम लिख सकता हूँ, लेकिन लिनक्स के लिए नहीं। लेकिन मेरा मानना ​​है कि लिनक्स में आप विंडोज़ की तुलना में यूनिक्स समय मूल्य अधिक आसानी से प्राप्त कर सकते हैं, और इस नंबर को COM पोर्ट पर भेज सकते हैं।

कोई नहीं अतिरिक्तसप्ताह का दिन इत्यादि जैसे डेटा संचारित करने की कोई आवश्यकता नहीं है। केवल यूनिक्स समय. बाकी सब कुछ Arduino में किया जाता है।

अब सीधे तौर पर थोड़ा विशेष विवरण पहलाघटक - विंडोज़ के लिए एक प्रोग्राम। कार्यक्रम अच्छे पुराने डेल्फ़ी में लिखा गया है। लॉन्च होने पर, एक पॉप-अप विंडो आपसे डेटा भेजने के लिए COM पोर्ट का चयन करने के लिए कहती है। आइए चुनें. शेष सेटिंग्स को डिफ़ॉल्ट के रूप में छोड़ दिया जाना चाहिए।

यह प्रोग्राम किस तरह से काम करता है? यह समय प्रारूप से पुनर्गणना करता है विंडोज़ डेटा UNIX प्रारूप के लिए, यानी 1 जनवरी 1970 की मध्यरात्रि के बाद से सेकंड की संख्या। फिर यह 3 सेकंड जोड़ता है और एक खाली लूप में "गिर जाता है" (स्पष्ट रूप से उन अतिरिक्त 3 सेकंड से कम समय तक चलने वाला), जिससे बाहर निकलना सेकंड की आवश्यक संख्या में होता है, जितना संभव हो सके 000 मिलीसेकंड के करीब। दूसरे शब्दों में, समय के उस सेकंड की शुरुआत की घटना की निगरानी की जाती है, जिसका मूल्य Arduino को भेजना होगा। सहमत हूं, डेटा भेजना, उदाहरण के लिए, अब XXXXXXXXX5 सेकंड है, जबकि वास्तव में यह पहले से ही है, उदाहरण के लिए, XXXXXXXXX5 और 756 हजारवां (उदाहरण के लिए) सेकंड, सही नहीं होगा। यही कारण है कि आपको डेटा ट्रांसफर शुरू करने के लिए दूसरे की शुरुआत को ही ट्रैक करना होगा। डेटा स्थानांतरित करने के बाद, प्रोग्राम मित्रवत रूप से "संपन्न:)" स्थिति की रिपोर्ट करता है। यह कार्यक्रम का मिशन पूरा करता है।


दूसराघटक - हार्डवेयर और सॉफ्टवेयर - Arduino। वहाँ 2 है किस्मोंइस परियोजना के लिए हार्डवेयर: एक स्क्रीन और एक बटन के साथ एक "पूर्ण" संस्करण, और एक "स्ट्रिप्ड-डाउन" संस्करण जल्दी स्थापनामॉड्यूल समय, "बकवास और लाठी" से इकट्ठा किया गया। उनके मतभेदों के बारे में - नीचे। "पूर्ण" संस्करण में एक Arduino Nano, I2C से शील्ड तक एक "एडेप्टर" के साथ एक 1602 शील्ड, एक वैकल्पिक Arduino रीसेट बटन और क्लॉक मॉड्यूल को जोड़ने के लिए एक पिन हेडर (महिला) शामिल है। इसके अलावा, वैकल्पिक रूप से, डिवाइस बॉडी से "प्यारा" स्टिकर के साथ। "स्ट्रिप्ड-डाउन" संस्करण में एक Arduino (Uno, Nano, Pro Mini + DTR के साथ "सही" USB एडाप्टर) और क्लॉक मॉड्यूल को जोड़ने के लिए 4 तार शामिल हैं।



जैसा कि आरेखों से देखा जा सकता है, "पूर्ण" संस्करण में, "स्ट्रिप्ड डाउन" संस्करण के अलावा, एक रीसेट बटन और एक "एडेप्टर" के साथ 1602 स्क्रीन शामिल है। दोनों संस्करण मुख्य कार्यक्षमता - सेटिंग में बिल्कुल समान हैं समय। स्क्रीन की आवश्यकता केवल प्रक्रिया के चरणों को प्रदर्शित करने के लिए है और समय निर्धारित करने की प्रक्रिया पूरी होने पर, सप्ताह का नया निर्धारित समय, तारीख और दिन प्रदर्शित किया जाएगा क्लॉक मॉड्यूल से ही पढ़ा जा सकता है। "स्ट्रिप्ड-डाउन" संस्करण में, स्क्रीन की भूमिका Arduino बोर्ड में निर्मित एलईडी द्वारा निभाई जाती है: नया समय निर्धारित करने की प्रक्रिया के बाद, यह प्रकाश करना शुरू कर देगा सभी संकेत.

रीसेट बटन किसके लिए है? अंदर क्या है इसके लिए पूर्ण संस्करणसमय निर्धारित करने के बाद, Arduino प्रवेश करेगा अंतहीन चक्रउसी नये निर्धारित समय को प्रदर्शित करने से अर्थात् वास्तव में वह एक घड़ी बन जायेगी। इसके अलावा, वे जल्दबाजी में बनाई गई घड़ियाँ हैं, और इसलिए वे कई कारणों से सामान्य घड़ी की जगह नहीं ले सकती हैं (सेकंड का चयन देरी के माध्यम से लागू किया जाता है, बिजली बंद होने पर समय का प्रदर्शन गायब हो जाएगा)। आख़िरकार, लक्ष्य यह सुनिश्चित करना है कि समय सही ढंग से सिंक्रनाइज़ हो, इससे अधिक कुछ नहीं। इसलिए, अगले क्लॉक मॉड्यूल को सिंक्रनाइज़ करने के लिए, आप रीसेट के बिना नहीं कर सकते (अधिक सटीक रूप से, यदि आप "विकृत" करते हैं तो आप ऐसा कर सकते हैं यूएसबी तार). दूसरे शब्दों में, बटन का उद्देश्य विशुद्ध रूप से उपयोगितावादी है। आप चाहें तो इसके बिना भी काम चला सकते हैं।

Arduino को कैसे फ्लैश करें, क्योंकि दो हार्डवेयर संस्करण हैं, लेकिन केवल एक स्केच है? फ़र्मवेयर के "सही" संस्करण को संकलित करने के लिए, आपको स्केच हेडर में वांछित पैरामीटर मान सेट करना होगा पूर्ण संस्करण: सत्य "पूर्ण" संस्करण के लिए, या असत्य - "छीन लिया गया" के लिए। इस प्रकार कंपाइलर यह निर्धारित करेगा कि फ़र्मवेयर को संकलित करने के लिए हार्डवेयर के किस संस्करण का उपयोग किया जाए।

तो, हमारे पास कनेक्शन आरेख है, हमें स्केच कोड की आवश्यकता है। कृपया ध्यान दें कि स्केच के "पूर्ण" संस्करण के साथ ठीक से काम करने के लिए एक लाइब्रेरी की आवश्यकता होती है लिक्विडक्रिस्टल I2Cफ़्रैंक डी ब्रैबेंडर द्वारा(लाइब्रेरी मैनेजर का उपयोग करके रिपॉजिटरी से इंस्टॉल किया गया)। हमें क्लॉक मॉड्यूल का समर्थन करने के लिए एक लाइब्रेरी की भी आवश्यकता है, न कि केवल किसी एक की :)। यहाँ डाउनलोड करें: । हमने पुस्तकालयों को व्यवस्थित कर लिया है।

यहाँ स्केच के लिए कोड है:

//============================================== ====== परिवर्तन के लिए सेटिंग उपलब्ध है === ==================================== #पूर्णसंस्करण सत्य को परिभाषित करें //सत्य = स्क्रीन के साथ "पूर्ण" संस्करण; गलत = अंतर्निहित एलईडी के साथ "छीन लिया गया" संस्करण //=================================== ============ प्रयुक्त पुस्तकालय और चर की घोषणा = ============================== ==== #शामिल हैं #शामिल करना #यदि (पूर्णसंस्करण) #शामिल हैं #endif अहस्ताक्षरित लंबा t1 = 0; // प्राप्त समय के लिए चर अहस्ताक्षरित लंबा t2 = 0; // प्राप्त समय बाइट बी के लिए चर; //COM पोर्ट से डेटा प्राप्त करने के लिए बफर #if (पूर्णसंस्करण) बाइट दिन = 0; #endif DS3231 घड़ी; RTCDateTime dat1; #if (पूर्णसंस्करण) LiquidCrystal_I2C एलसीडी(0x3F,16,2); //चीनी लोगों को i2c से स्क्रीन तक "एडेप्टर" का नया पता पसंद है #endif //============================== == ============================================== ===== ==================================== शून्य सेटअप())( #if ( !fullVersion) // केवल "काटे गए" संस्करण के लिए प्रासंगिक - कोड अनुभाग की शुरुआत पिनमोड (13, आउटपुट); #endif // केवल "छंटनी" संस्करण के लिए प्रासंगिक - का अंत कोड अनुभाग क्लॉक.बेगिन(); सीरियल.बेगिन(9600); #if (पूर्ण संस्करण) // केवल "पूर्ण" संस्करण के लिए प्रासंगिक - कोड अनुभाग lcd.init(); .setCursor(0,0); lcd.print('COMport 9600 8N1'); //संकेत दें कि प्रोग्राम में कौन सा COM पोर्ट पैरामीटर चुनें lcd.setCursor(0,1); ; //स्थिति संदेश - सिंक्रनाइज़ेशन विलंब के लिए तैयार(1000); #endif //केवल "पूर्ण" संस्करण के लिए प्रासंगिक - कोड अनुभाग का अंत) शून्य लूप())( यदि (Serial.available())( / /यदि COM पोर्ट सीरियल.रीडबाइट्स(बी,4) में "फ्लास्क में बारूद" है; //सभी 4 बाइट्स गिनें (हमें और कुछ की उम्मीद नहीं है) t1=b; t2=(t1<<24); //поместить значение байта в 4-байтную переменную и передвинуть его на 3 байта влево t1=b; t2+=(t1<<16); //поместить значение байта в 4-байтную переменную и передвинуть его на 2 байта влево t1=b; t2+=(t1<<8); //поместить значение байта в 4-байтную переменную и передвинуть его на 1 байт влево t2+=b; //поместить значение байта в 4-байтную переменную clock.setDateTime(t2); //установить полученное время на DS3231 #if (fullVersion) //актуально только для "полной" версии - начало участка кода lcd.clear(); lcd.setCursor(0,0); lcd.print("Done:) : :"); while (true){ //начало бесконечного цикла по отображению свежеустановленных времени и даты dat1 = clock.getDateTime(); if (dat1.day != day){ day = dat1.day; lcd.setCursor(0,1); if (dat1.day < 10) lcd.print("0"); lcd.print(day); lcd.print("-"); switch (dat1.month){ //выбираем буквенное соответствие месяца по цифре case 1:{ lcd.print("Jan"); break; } case 2:{ lcd.print("Feb"); break; } case 3:{ lcd.print("Mar"); break; } case 4:{ lcd.print("Apr"); break; } case 5:{ lcd.print("May"); break; } case 6:{ lcd.print("Jun"); break; } case 7:{ lcd.print("Jul"); break; } case 8:{ lcd.print("Aug"); break; } case 9:{ lcd.print("Sep"); break; } case 10:{ lcd.print("Oct"); break; } case 11:{ lcd.print("Nov"); break; } case 12:{ lcd.print("Dec"); break; } default:{ lcd.print("???"); break; } }//switch month lcd.print("-"); lcd.print(dat1.year); lcd.print(" "); switch(dat1.dayOfWeek){ //выбираем буквенное соответствие дня недели по цифре case 1:{ lcd.print("Mon"); break; } case 2:{ lcd.print("Tue"); break; } case 3:{ lcd.print("Wed"); break; } case 4:{ lcd.print("Thu"); break; } case 5:{ lcd.print("Fri"); break; } case 6:{ lcd.print("Sat"); break; } case 7:{ lcd.print("Sun"); break; } default:{ lcd.print("???"); break; } }//switch dayOfWeek }//if date changed lcd.setCursor(8,0); if (dat1.hour < 10) lcd.print("0"); lcd.print(dat1.hour); lcd.setCursor(11,0); if (dat1.minute < 10) lcd.print("0"); lcd.print(dat1.minute); lcd.setCursor(14,0); if (dat1.second < 10) lcd.print("0"); lcd.print(dat1.second); delay(995); }//while #else //актуально только для "урезанной" версии - начало участка кода digitalWrite(13, HIGH); delay(3000); digitalWrite(13, LOW); #endif //актуально только для "полной" версии - конец участка кода }//if Serial }//loop


तैयार डिवाइस के "पूर्ण" संस्करण की कुछ तस्वीरें।


और अंत में, "युद्ध में" काम कर रहे डिवाइस का एक वीडियो:

मैं स्केच और प्रोग्राम कहां से डाउनलोड कर सकता हूं?

स्केच डाउनलोड करें (ड्रॉपबॉक्स)।
विंडोज़ (ड्रॉपबॉक्स) के लिए प्रोग्राम डाउनलोड करें।

"फायदे और नुकसान"।

इस मामले में "पेशे" और "नुकसान" का निर्धारण करना मुश्किल है। नतीजतन, हर कोई अपने लिए निर्णय लेता है कि क्या अच्छा है और क्या बुरा।

कुल।

मुझे वास्तव में पसंद आया कि अब मॉड्यूल में समय कैसे निर्धारित किया जाता है! जब मुझे समय निर्धारित करने की आवश्यकता होती है, तो मुझे हर बार यह याद रखने की ज़रूरत नहीं होती है कि मुझे किस स्केच की आवश्यकता है और यह सोचने की ज़रूरत नहीं है कि मॉड्यूल में समय कितनी सटीकता से निर्धारित किया जाएगा। इसके अलावा, जल्द ही एक घरेलू घड़ी की समीक्षा होगी जहां मैंने ऐसी सिंक्रनाइज़ेशन विधि बनाई है - मुझे यह विधि बहुत पसंद आई। मुझे आशा है कि कुछ पाठकों को भी यह विधि उपयोगी लगेगी।

परियोजना निःशुल्क, गैर-व्यावसायिक है। प्रत्येक व्यक्ति को समीक्षा से प्राप्त डेटा का व्यावसायिक उपयोग के अलावा किसी अन्य उद्देश्य के लिए उपयोग करने का अधिकार है।

शुभकामनाएं।

मैं +48 खरीदने की योजना बना रहा हूं पसंदीदा में जोड़े मुझे समीक्षा पसंद आयी +60 +114

DS3231 मॉड्यूल (RTC, ZS-042) एक बेहद सटीक वास्तविक समय घड़ी (RTC) वाला एक कम लागत वाला बोर्ड है, जिसमें क्रिस्टल ऑसिलेटर और क्रिस्टल का तापमान मुआवजा होता है। मॉड्यूल में एक लिथियम बैटरी शामिल है जो बिजली आपूर्ति बंद होने पर भी निर्बाध संचालन बनाए रखती है। एक एकीकृत जनरेटर डिवाइस की सटीकता में सुधार करता है और घटकों की संख्या को कम करता है।

तकनीकी निर्देश

आपूर्ति वोल्टेज: 3.3V और 5V
मेमोरी चिप: AT24C32 (32 KB)
सटीकता: ±0.432 सेकंड प्रति दिन
क्वार्ट्ज आवृत्ति: 32.768 किलोहर्ट्ज़
समर्थित प्रोटोकॉल: I2C
आयाम: 38 मिमी x 22 मिमी x 15 मिमी

सामान्य जानकारी

अधिकांश माइक्रो-सर्किट, जैसे डीएस1307, 32 किलोहर्ट्ज़ की आवृत्ति के साथ एक बाहरी क्वार्ट्ज ऑसिलेटर का उपयोग करते हैं, लेकिन उनमें एक महत्वपूर्ण खामी है: जब तापमान बदलता है, तो क्वार्ट्ज आवृत्ति बदल जाती है, जिससे समय में त्रुटि होती है। यह समस्या DS3231 चिप में समाप्त हो गई है, जिसमें एक क्रिस्टल ऑसिलेटर और एक तापमान सेंसर होता है जो तापमान परिवर्तन की भरपाई करता है ताकि समय सटीक रहे (यदि आवश्यक हो तो तापमान डेटा पढ़ा जा सकता है)। DS3231 चिप सेकंड, मिनट, घंटे, सप्ताह का दिन, तारीख, महीना और वर्ष की जानकारी का भी समर्थन करता है, और एक महीने में दिनों की संख्या पर भी नज़र रखता है और लीप वर्ष के लिए समायोजन करता है। यह दो प्रारूपों में घड़ियों का समर्थन करता है: 24 और 12, और दो अलार्म प्रोग्राम करना भी संभव है। मॉड्यूल दो-तार I2C बस पर काम करता है।


अब मॉड्यूल के बारे में थोड़ा सा; यह DS3231N चिप पर बनाया गया है। 32K, SQW, SCL और SDA लाइनों को खींचने के लिए रेसिस्टर असेंबली RP1 (4.7 kOhm) की आवश्यकता होती है (वैसे, यदि I2C बस के साथ कई मॉड्यूल का उपयोग किया जाता है, तो अन्य मॉड्यूल पर पुल-अप रेसिस्टर्स को अनसोल्ड करना आवश्यक है) . प्रतिरोधों की दूसरी असेंबली A0, A1 और A2 लाइनों को कसने के लिए आवश्यक है; उन्हें AT24C32N मेमोरी चिप का पता बदलने के लिए आवश्यक है। रेसिस्टर R5 और डायोड D1 बैटरी को रिचार्ज करने का काम करते हैं, सिद्धांत रूप में, उन्हें हटाया जा सकता है, क्योंकि एक नियमित SR2032 बैटरी वर्षों तक चलती है। एक AT24C32N मेमोरी चिप भी स्थापित है, यह एक बोनस की तरह है, RTC DS3231N घड़ी के काम करने के लिए यह आवश्यक नहीं है। रेसिस्टर R1 और पावर LED संकेत देते हैं कि मॉड्यूल चालू है। जैसा कि उल्लेख किया गया है, मॉड्यूल I2C बस पर काम करता है; सुविधा के लिए, इन बसों को दो कनेक्टर J1 और J2 पर रूट किया गया था, शेष संपर्कों का असाइनमेंट नीचे देखा जा सकता है। उद्देश्य जे1
32K: आउटपुट, आवृत्ति 32 kHz
SQW: आउटपुट
एसडीए: डेटा लाइन (सीरियल डेटा)
वीसीसी: "+" मॉड्यूल बिजली की आपूर्ति
जीएनडी: "-" मॉड्यूल बिजली की आपूर्ति उद्देश्य जे2
एससीएल: सीरियल क्लॉक
एसडीए: सीरियल डेटा लाइन
वीसीसी: "+" मॉड्यूल बिजली की आपूर्ति
जीएनडी: "-" मॉड्यूल बिजली की आपूर्ति


मैं आपको AT24C32N चिप के बारे में थोड़ा बताऊंगा, यह निर्माता Atmel की 32k मेमोरी (EEPROM) वाली एक चिप है, जो SOIC8 पैकेज में असेंबल की गई है, जो दो-तार I2C बस पर काम करती है। माइक्रो-सर्किट का पता 0x57 है; यदि आवश्यक हो, तो इसे जंपर्स A0, A1 और A2 का उपयोग करके आसानी से बदला जा सकता है (यह आपको कनेक्टेड AT24C32/64 माइक्रो-सर्किट की संख्या बढ़ाने की अनुमति देता है)। चूँकि AT24C32N चिप में तीन एड्रेस इनपुट (A0, A1 और A2) हैं, जो दो अवस्थाओं में हो सकते हैं, या तो लॉग "1" या लॉग "0", चिप के लिए आठ पते उपलब्ध हैं। 0x50 से 0x57 तक.

DS3231 को Arduino से कनेक्ट करना

आवश्यक भाग:
Arduino UNO R3 x 1 पीसी।
DS3231, RTC, SPI, AT24C32 x 1 पीसी पर वास्तविक समय घड़ी।
ड्यूपॉन्ट तार, 2.54 मिमी, 20 सेमी, एफ-एम (महिला - पुरुष) x 1 पीसी।
यूएसबी 2.0 ए-बी केबल x 1 पीसी।

कनेक्शन:
इस उदाहरण में, मैं केवल DS3231 मॉड्यूल और Arduino UNO R3 का उपयोग करूंगा, सभी डेटा "पोर्ट मॉनिटरिंग" में स्थानांतरित कर दिया जाएगा। सर्किट जटिल नहीं है, केवल चार तारों की आवश्यकता है, पहले हम I2C बस, A4 (Arduino UNO) में SCL और A5 (Arduino UNO) में SDA को जोड़ते हैं, जो कुछ बचा है वह बिजली आपूर्ति GND को GND और VCC को कनेक्ट करना है। 5V (3.3V से लिखा जा सकता है), सर्किट असेंबल किया गया, अब हमें सॉफ़्टवेयर भाग तैयार करने की आवश्यकता है।

Arduino IDE में DS3231 के साथ काम करने वाली कोई लाइब्रेरी नहीं है, आपको "DS3231" डाउनलोड करना होगा और इसे Arduino विकास परिवेश में जोड़ना होगा।

DS3231 समय निर्धारित करना
जब आप इसे पहली बार चालू करते हैं, तो आपको समय प्रोग्राम करने की आवश्यकता होती है, DS3231 लाइब्रेरी से उदाहरण खोलें "फ़ाइल" -> "उदाहरण" -> "DS3231" -> "Arduino" -> "DS3231_Serial_Easy", या कॉपी करें नीचे से कोड

/* परीक्षण Arduino IDE 1.8.0 परीक्षण दिनांक 08/31/2018 पर किया गया था। */ #शामिल करना // वायर DS3231 लाइब्रेरी आरटीसी (एसडीए, एससीएल) से कनेक्ट करें; // DS3231 शून्य सेटअप प्रारंभ करें() (Serial.begin(115200); // एक सीरियल कनेक्शन सेट करें rtc.begin(); // rtc आरंभ करें // समय निर्धारित करें rtc.setDOW(शुक्रवार); // दिन निर्धारित करें सप्ताह का rtc. setTime(16, 29, 0); // समय निर्धारित करें 16:29:00 (24 घंटे का प्रारूप) rtc.setDate(31, 8, 2018); 2018) शून्य लूप() ( सीरियल. प्रिंट(rtc.getDOWStr()); // दिन-सप्ताह भेजें सीरियल.प्रिंट(" "); सीरियल.प्रिंट(rtc.getDateStr()); // दिनांक सीरियल भेजें .print(" -- "); सीरियल. println(rtc.getTimeStr()); // समय विलंब (1000);

परीक्षण Arduino IDE 1.8.0 पर किया गया

टेस्ट तिथि: 08/31/2018

#शामिल करना // वायर लाइब्रेरी शामिल करें

डीएस3231 आरटीसी (एसडीए, एससीएल); // DS3231 आरंभ करें

व्यर्थ व्यवस्था()

धारावाहिक। आरंभ(115200); // एक सीरियल कनेक्शन स्थापित करें

आरटीसी. शुरू करना(); // आरटीसी प्रारंभ करें

// समय निर्धारित

आरटीसी. सेटडॉ (शुक्रवार); //सप्ताह का दिन निर्धारित करें

आरटीसी. सेटटाइम(16, 29, 0); // समय को 16:29:00 पर सेट करें (24 घंटे का प्रारूप)

शून्य लूप()

धारावाहिक। प्रिंट करें (rtc . getDOWStr() ); // दिन-सप्ताह भेजें

धारावाहिक। प्रिंट करें (" " ) ;

धारावाहिक। प्रिंट करें (rtc . getDateStr() ); // दिनांक भेजें

धारावाहिक। प्रिंट करें (" -- " ) ;

धारावाहिक। println(rtc. getTimeStr()); // समय भेजें

विलंब(1000); // एक सेकंड की देरी

स्केच को Arduino कंट्रोलर पर अपलोड करें और "पोर्ट मॉनिटरिंग" खोलें

DS3231 चिप एक उच्च परिशुद्धता वाली RTC वास्तविक समय घड़ी है जिसमें एक अंतर्निर्मित तापमान-क्षतिपूर्ति क्वार्ट्ज ऑसिलेटर है, जिसके परिणामस्वरूप प्रति वर्ष केवल ±2 मिनट का समय बहाव होता है। इसके अतिरिक्त, एक अलार्म फ़ंक्शन कार्यान्वित किया जाता है, और एक इंटरप्ट आउटपुट भी होता है। घड़ी को स्ट्रैपिंग तत्वों और बैटरी डिब्बे के साथ तैयार Arduino मॉड्यूल के रूप में खरीदा जा सकता है।

मैंने यहां मॉड्यूल का ऑर्डर दिया। आरेख नीचे चित्र में दिखाया गया है:


माइक्रोक्रिकिट व्यापक रूप से उपयोग किया जाता है। मानक (100 kHz) और उच्च (400 kHz) डेटा दरों का समर्थन करता है। I2C बस पर माइक्रोसर्किट पता (7 बिट्स) 1101000 है। इसके अतिरिक्त, मॉड्यूल में I2C मेमोरी (24C32) है, जो चित्र में नहीं दिखाया गया है।

पावर मोड

माइक्रोक्रिकिट की आपूर्ति वोल्टेज 2.3...5.5V की सीमा में हो सकती है, दो विद्युत लाइनें हैं, एक बाहरी स्रोत (Vcc लाइन) के लिए और बैटरी (Vbat) के लिए भी। बाहरी स्रोत वोल्टेज की लगातार निगरानी की जाती है, और जब यह थ्रेशोल्ड Vpf=2.5V से नीचे चला जाता है, तो यह बैटरी लाइन पर स्विच हो जाता है। निम्न तालिका बिजली लाइनों के बीच स्विच करने की शर्तें दिखाती है:

परिवेश के तापमान की निगरानी करके घड़ी की सटीकता बनाए रखी जाती है। माइक्रोक्रिकिट घड़ी जनरेटर की आवृत्ति को समायोजित करने के लिए एक आंतरिक प्रक्रिया शुरू करता है; समायोजन की मात्रा आवृत्ति बनाम तापमान के एक विशेष ग्राफ का उपयोग करके निर्धारित की जाती है। बिजली लागू होने के बाद प्रक्रिया शुरू होती है और फिर हर 64 सेकंड में चलती है।

चार्ज को संरक्षित करने के लिए, जब बैटरी कनेक्ट होती है (वोल्टेज Vbat लाइन पर लागू होता है), क्लॉक जनरेटर तब तक शुरू नहीं होता है जब तक कि Vcc लाइन पर वोल्टेज थ्रेशोल्ड वैल्यू Vpf से अधिक न हो जाए, या माइक्रोक्रिकिट का सही पता इसके माध्यम से प्रसारित न हो जाए I2C इंटरफ़ेस. घड़ी जनरेटर का स्टार्टअप समय एक सेकंड से भी कम है। बिजली लागू होने (Vcc) के लगभग 2 सेकंड बाद, या I2C इंटरफ़ेस के माध्यम से पता प्राप्त होने के बाद, आवृत्ति सुधार प्रक्रिया शुरू होती है। एक बार जब घड़ी जनरेटर चालू हो जाता है, तो यह तब तक काम करता रहता है जब तक Vcc या Vbat मौजूद रहता है। जब पहली बार चालू किया जाता है, तो दिनांक और समय रजिस्टर रीसेट हो जाते हैं और निम्नलिखित मान होते हैं: 01/01/00 - 01 - 00/00/00 (दिन/माह/वर्ष/-सप्ताह का दिन - घंटा/मिनट) /सेकंड).

I2C इंटरफ़ेस के माध्यम से डेटा ट्रांसमिशन की अनुपस्थिति में, 3.63V बैटरी द्वारा संचालित होने पर वर्तमान खपत 3 μA है। बाहरी 5.5V बिजली आपूर्ति और उच्च I2C डेटा ट्रांसफर गति का उपयोग करते समय अधिकतम वर्तमान खपत 300 μA तक पहुंच सकती है।

बाहरी रीसेट फ़ंक्शन

आरएसटी लाइन का उपयोग बाहरी रीसेट के लिए किया जा सकता है और इसमें कम वोल्टेज अलार्म फ़ंक्शन भी है। लाइन को आंतरिक अवरोधक के माध्यम से ऊंचा खींचा जाता है; किसी बाहरी खिंचाव की आवश्यकता नहीं होती है। बाहरी रीसेट फ़ंक्शन का उपयोग करने के लिए, आरएसटी लाइन और सामान्य तार के बीच एक बटन जोड़ा जा सकता है; माइक्रोक्रिकिट में संपर्क बाउंस सुरक्षा होती है। अलार्म फ़ंक्शन तब सक्रिय होता है जब आपूर्ति वोल्टेज वीसीसी थ्रेशोल्ड मान वीपीएफ से नीचे चला जाता है, जबकि आरएसटी लाइन कम तर्क स्तर पर सेट होती है।

DS3231 रजिस्टरों का विवरण

नीचे दी गई तालिका वास्तविक समय घड़ी रजिस्टरों की एक सूची दिखाती है:

पताडी7डी6डी5डी4डी3डी2डी1डी0समारोहसीमाएं
0x000 दस पलसेकंडसेकंड00-59
0x010 10 मिनटोंमिनटमिनट00-59
0x020 12/24 दोपहर से पूर्व दोपहर के बाद10 घंटेघंटाघड़ी1-12 + पूर्वाह्न/अपराह्न या 00-23
10 घंटे
0x030 0 0 0 0 दिनसप्ताह का दिन1-7
0x040 0 10 वींसंख्यातारीख01-31
0x05शतक0 0 10 महीनामहीनामहीने/शताब्दी01-12 + शतक
0x0610 वर्षवर्षसाल00-99
0x07ए1एम1दस पलसेकंडसेकंड, पहला अलार्म00-59
0x08ए1एम210 मिनटोंमिनटमिनट, पहला अलार्म00-59
0x09A1M312/24 दोपहर से पूर्व दोपहर के बाद10 घंटेघंटाघड़ी, पहला अलार्म1-12 + पूर्वाह्न/अपराह्न या 00-23
10 घंटे
0x0AA1M4डीवाई/डीटी10 वींदिनसप्ताह का दिन, पहला अलार्म1-7
संख्यादिनांक, पहला अलार्म01-31
0x0बीA2M210 मिनटोंमिनटमिनट, दूसरा अलार्म00-59
0x0CA2M312/24 दोपहर से पूर्व दोपहर के बाद10 घंटेघंटाघड़ी, दूसरा अलार्म1-12 + पूर्वाह्न/अपराह्न या 00-23
10 घंटे
0x0DA2M4डीवाई/डीटी10 वींदिनसप्ताह का दिन, दूसरा अलार्म1-7
संख्यादिनांक, दूसरा अलार्म01-31
0x0ईईओएससीबीबीएसक्यूडब्ल्यूरूपाआरएस2आरएस1आईएनटीसीएनA2IEA1IEसेटिंग्स रजिस्टर (नियंत्रण)
0x0Fओ.एस.एफ.0 0 0 EN32kHzबीएसवाईA2Fए1एफस्थिति रजिस्टर
0x10संकेतडेटाडेटाडेटाडेटाडेटाडेटाडेटाएजिंग ऑफसेट रजिस्टर
0x11संकेतडेटाडेटाडेटाडेटाडेटाडेटाडेटातापमान रजिस्टर, उच्च बाइट
0x12डेटाडेटा0 0 0 0 0 0 तापमान रजिस्टर, कम बाइट

समय की जानकारी बाइनरी दशमलव प्रारूप में संग्रहीत की जाती है, अर्थात दशमलव संख्या के प्रत्येक अंक (0 से 9 तक) को 4 बिट्स के समूह के रूप में दर्शाया जाता है। एक बाइट के मामले में, कम निबल एक को गिनता है, उच्च निबल दसियों को गिनता है, आदि। घंटों की गिनती के लिए 0x00-0x06 पते वाले रजिस्टरों में समय गिना जाता है, आप 12 या 24 घंटे का मोड चुन सकते हैं। घड़ी रजिस्टर के छठे बिट (पता 0x02) को सेट करने से 12-घंटे का मोड सेट होता है, जिसमें 5वां बिट दिन के समय को इंगित करता है, मान 1 दोपहर (पीएम) से मेल खाता है, मान 0 दोपहर (एएम) से मेल खाता है। 6वें बिट का शून्य मान 24 घंटे के मोड से मेल खाता है, यहां 5वां बिट घंटों की गिनती में शामिल है (मान 20-23)।

सप्ताह रजिस्टर का दिन आधी रात को बढ़ाया जाता है, 1 से 7 तक गिनती की जाती है, महीने रजिस्टर (पता 0x05) में सेंचुरी बिट (7वां बिट) होता है, जो साल गिनती रजिस्टर (पता 0x06) ओवरफ्लो होने पर 99 से 00 तक स्विच हो जाता है। .

DS3231 चिप दो अलार्म घड़ियों को कार्यान्वित करती है, पहली अलार्म घड़ी 0x07-0x0A पते वाले रजिस्टरों का उपयोग करके कॉन्फ़िगर की गई है, दूसरी अलार्म घड़ी 0x0B-0x0D पते वाले रजिस्टरों का उपयोग करके कॉन्फ़िगर की गई है। A1Mx और A2Mx बिट्स का उपयोग अलार्म के लिए विभिन्न मोड को कॉन्फ़िगर करने के लिए किया जा सकता है; बिट सेट करने से संबंधित रजिस्टर को तुलना ऑपरेशन से बाहर रखा जाता है। नीचे दी गई तालिकाएँ विभिन्न अलार्म मोड के लिए बिट संयोजन दिखाती हैं:

तालिकाओं में निर्दिष्ट नहीं किए गए बिट संयोजन अलार्म के गलत कामकाज का कारण बनते हैं। यदि DY/DT बिट साफ़ हो जाता है, तो अलार्म घड़ी के लिए दिनांक मिलान (महीने का दिन) की निगरानी की जाती है; जब DY/DT बिट सेट किया जाता है, तो सप्ताह के दिन के मिलान की जाँच की जाती है।

अधिकांश फ़ंक्शन नियंत्रण रजिस्टर में कॉन्फ़िगर किए गए हैं। ईओएससी बिट घड़ी जनरेटर की शुरुआत को नियंत्रित करता है, बिट को रीसेट करने से घड़ी जनरेटर शुरू होता है। बिट सेट करने से जनरेटर केवल बैटरी मोड (Vbat) के लिए बंद हो जाता है। बाहरी स्रोत (Vcc) से संचालित होने पर, EOSC बिट की स्थिति की परवाह किए बिना ऑसिलेटर हमेशा चलता रहता है। सक्षम होने पर, डिफ़ॉल्ट बिट मान 0 होता है।

BBSQW बिट सेट करने से बाहरी पावर की अनुपस्थिति में, INT/SQW आउटपुट (तीसरा पिन) को बैटरी पावर मोड में काम करने की अनुमति मिलती है। जब बिट को शून्य पर सेट किया जाता है, तो बाहरी स्रोत वोल्टेज Vcc थ्रेशोल्ड मान Vpf से नीचे आने पर INT/SQW आउटपुट स्थिति 3 (निष्क्रिय) में चला जाता है। पावर लागू होने के बाद, डिफ़ॉल्ट बिट मान 0 है।

CONV बिट मजबूर तापमान माप के लिए जिम्मेदार है; बिट सेट करने से रूपांतरण प्रक्रिया शुरू होती है, जिसके दौरान घड़ी जनरेटर आवृत्ति को भी समायोजित किया जाता है, माप परिणाम 0x11, 0x12 पते के साथ रजिस्टरों में स्थित होता है। प्रारंभ तभी संभव है जब पिछला रूपांतरण पूरा हो गया हो, प्रारंभ करने से पहले आपको व्यस्त ध्वज BSY की जांच करनी होगी। जबरन तापमान रूपांतरण आंतरिक 64 सेकंड आवृत्ति समायोजन चक्र को प्रभावित नहीं करता है। CONV बिट सेट करने से 2 एमएस के लिए BSY ध्वज प्रभावित नहीं होता है। रूपांतरण पूरा होने के बाद CONV और BSY बिट्स स्वचालित रूप से साफ़ हो जाते हैं।

बिट्स RS2, RS1 INT/SQW आउटपुट पर आयताकार दालों (स्क्वायर वेव) की आवृत्ति निर्धारित करते हैं। डिफ़ॉल्ट रूप से, सक्षम होने पर, बिट्स 1 पर सेट होते हैं। नीचे दी गई तालिका बिट्स के संभावित संयोजन दिखाती है:

INTCN बिट INT/SQW आउटपुट को नियंत्रित करता है। यदि बिट को रीसेट किया जाता है, तो आउटपुट पर आयताकार पल्स (वर्ग तरंगें) दिखाई देती हैं, जिसकी आवृत्ति RS2, RS1 बिट्स द्वारा निर्धारित की जाती है। जब INTCN बिट सेट होता है, तो आउटपुट का उपयोग अलार्म इंटरप्ट उत्पन्न करने के लिए किया जाता है। डिफ़ॉल्ट रूप से, बिट मान 1 है। आउटपुट प्रकार INT/SQW है - खुली नाली, इसलिए इसे एक अवरोधक के माध्यम से उच्च तर्क स्तर तक खींचना आवश्यक है, सक्रिय स्तर कम है।

बिट्स A1IE, A2IE सेट करने से क्रमशः पहले और दूसरे अलार्म सिग्नल पर रुकावट आती है। बिट्स को रीसेट करें, व्यवधानों को अक्षम करें। डिफॉल्यू मूल्य शून्य है।

स्थिति रजिस्टर में इवेंट फ़्लैग होते हैं और 32 kHz आउटपुट को नियंत्रित करता है। OSF ध्वज घड़ी जनरेटर की स्थिति को दर्शाता है, 1 के मान का मतलब है कि घड़ी जनरेटर बंद हो गया है, यह घटना निम्नलिखित मामलों में हो सकती है:

  • बिजली लगने के बाद पहली बार
  • घड़ी जनरेटर को संचालित करने के लिए बैटरी या बाहरी वोल्टेज अपर्याप्त है
  • ईओएससी बिट को बैटरी मोड में सेट करके जनरेटर बंद कर दिया जाता है
  • क्रिस्टल ऑसिलेटर को प्रभावित करने वाले बाहरी कारक (शोर, रिसाव, आदि)

एक बार सेट होने पर, बिट मान नहीं बदलता है; बिट को मैन्युअल रूप से रीसेट किया जाना चाहिए।

EN32kHz बिट सेट करने से 32kHz आउटपुट (प्रथम पिन) पर आयताकार पल्स (वर्ग तरंगें) उत्पन्न करने की अनुमति मिलती है, पल्स आवृत्ति निश्चित होती है और 32.768 kHz के बराबर होती है। बिट को रीसेट करने से यह फ़ंक्शन अक्षम हो जाता है और आउटपुट तीसरी स्थिति (उच्च इनपुट प्रतिबाधा) में चला जाता है। डिफ़ॉल्ट रूप से, बिट मान 1 है; पावर लागू होने के बाद, आउटपुट पर पल्स दिखाई देते हैं। आउटपुट प्रकार 32kHz ओपन ड्रेन है, इसलिए इसे उच्च तर्क स्तर तक पुल-अप की आवश्यकता होती है।

बीएसवाई व्यस्त ध्वज तापमान रूपांतरण और घड़ी समायोजन प्रक्रिया के दौरान सेट किया गया है। रूपांतरण पूरा होने पर ध्वज रीसेट हो जाता है।

अलार्म घड़ी के झंडे A1F, A2F तब सेट किए जाते हैं जब समय गिनती रजिस्टर और अलार्म घड़ी रजिस्टर के मान मेल खाते हैं। यदि अलार्म A1IE को बाधित करता है, A2IE सक्षम है, और एक इंटरप्ट आउटपुट असाइन किया गया है (INTCN बिट सेट है), तो INT/SQW आउटपुट पर एक इंटरप्ट सिग्नल दिखाई देता है (उच्च से निम्न तर्क स्तर पर संक्रमण)। मान 0 लिखकर झंडों को मैन्युअल रूप से रीसेट किया जाना चाहिए।

एजिंग ऑफसेट रजिस्टर को घड़ी जनरेटर आवृत्ति को समायोजित करने के लिए डिज़ाइन किया गया है। यदि तापमान परिवर्तन का पता चलता है, और जब CONV बिट द्वारा तापमान रूपांतरण ट्रिगर किया जाता है, तो आंतरिक समायोजन प्रक्रिया के दौरान रजिस्टर मान को ऑसिलेटर आवृत्ति में जोड़ा जाता है। ऑफसेट मान हस्ताक्षरित है, अर्थात सकारात्मक मान (1-127) आवृत्ति को कम करते हैं, नकारात्मक मान (128-255) इसे बढ़ाते हैं। समान ऑफसेट के लिए, तापमान के आधार पर आवृत्ति परिवर्तन भिन्न होगा। +25°C पर, आवृत्ति परिवर्तन 0.1 पीपीएम/एलएसबी होगा।

वर्तमान तापमान मान क्रमशः 0x11 और 0x12 पते वाले रजिस्टरों में संग्रहीत किया जाता है, क्रमशः उच्च और निम्न बाइट, रजिस्टरों में तापमान मान समय-समय पर अद्यतन किया जाता है। बायां संरेखण सेट है, रिज़ॉल्यूशन 10 बिट्स या 0.25 डिग्री सेल्सियस/एलएसबी है, यानी, उच्च बाइट में तापमान का पूर्णांक भाग होता है, और कम रजिस्टरों में 6 वें, 7 वें बिट आंशिक भाग बनाते हैं। उच्च बाइट में, 7वां बिट तापमान के संकेत को इंगित करता है, उदाहरण के लिए, मान 00011011 01 +27.25 डिग्री सेल्सियस के तापमान से मेल खाता है, मान 11111110 10 -2.5 डिग्री सेल्सियस के तापमान से मेल खाता है।

समय रजिस्टरों को पढ़ते समय, एक अतिरिक्त बफर का उपयोग करने की सिफारिश की जाती है, अर्थात, एक साथ कई रजिस्टरों को पढ़ें, और अलग से नहीं, क्योंकि अलग-अलग पढ़ने के संचालन के बीच, समय रजिस्टर अपना मूल्य बदल सकते हैं। खाता रजिस्टरों में नया डेटा लिखते समय भी इस नियम का पालन करने की अनुशंसा की जाती है। सेकंड रजिस्टर में एक नया मान लिखने से घड़ी 1 सेकंड के लिए रुक जाती है, इस दौरान शेष रजिस्टरों को फिर से लिखना होगा।

DS3231 को माइक्रोकंट्रोलर से कनेक्ट करना

मैंने घड़ी को PIC16F628A माइक्रोकंट्रोलर से कनेक्ट किया और उपयोग किया। कनेक्शन आरेख नीचे दिखाया गया है:


बिजली लागू होने के बाद, संकेतकों पर डैश (- - - - - -) प्रदर्शित होते हैं, फिर घड़ी को आरंभ किया जाता है, समय मान 1 सेकंड की देरी से संकेतकों पर दिखाई देता है, जो घड़ी जनरेटर को शुरू करने के लिए आवश्यक है। संकेतक घंटे, मिनट और सेकंड को दशमलव बिंदु से अलग करके प्रदर्शित करते हैं, और समय प्रारूप 24-घंटे है। SB1 "संकेत" बटन का उपयोग करके, आप डिस्प्ले प्रारूप को बदल सकते हैं, जहां संकेतक तापमान प्रदर्शित करेंगे, साथ ही दशमलव बिंदु द्वारा अलग किए गए घंटों और मिनटों का मान भी प्रदर्शित करेंगे, जो 2 हर्ट्ज की आवृत्ति पर झपकाता है। तापमान को आंशिक भाग के बिना प्रदर्शित किया जाता है; प्रोग्राम केवल 0x11 पते पर तापमान भंडारण के उच्च बाइट को पढ़ता है।

समय मान को घड़ी से SQW/INT लाइन पर एक इंटरप्ट के माध्यम से पढ़ा जाता है, जिसे घड़ी के प्रारंभ के दौरान पहले अलार्म सिग्नल द्वारा नियंत्रित किया जाता है, अलार्म घड़ी को हर दूसरे सिग्नल पर सेट किया जाता है। HL1 LED एक संकेतक के रूप में कार्य करता है और हर सेकंड इंटरप्ट सिग्नल पर चमकता है। I2C इंटरफ़ेस के माध्यम से डेटा ट्रांसमिशन में कोई त्रुटि होने पर HL2 LED जलती है।

इसके अतिरिक्त, मैंने प्रोग्राम में SB2 "सेटिंग्स", SB3 "इंस्टॉलेशन" बटन का उपयोग करके घड़ी सेट करने की क्षमता जोड़ी। सेटअप मोड SB2 बटन दबाकर दर्ज किया जाता है; संकेतक मिनट और सेकंड (00 - - - -) के बजाय 00 घंटे और डैश प्रदर्शित करते हैं। SB3 बटन का उपयोग करके, आप घंटे का मान सेट करते हैं (प्रत्येक प्रेस के साथ वृद्धि), फिर SB2 बटन दबाने से डैश के बजाय मिनटों का संपादन शुरू हो जाता है, 00 मिनट प्रदर्शित होंगे; बटन SB3 आवश्यक मान इत्यादि भी सेट करता है। सेकंड संपादित करने और SB2 बटन दबाने के बाद, घड़ी में समय फिर से लिखा जाता है, और अद्यतन समय संकेतकों पर प्रदर्शित होता है।

आंशिक प्रोग्राम कोड नीचे दिया गया है (पूर्ण संस्करण लेख के अंत में डाउनलोड किया जा सकता है):

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; #शामिल करना सूची p=16F628A __CONFIG H"3F10" ;माइक्रोकंट्रोलर कॉन्फ़िगरेशन त्रुटि स्तर -302; लिस्टिंग Sec eq 0020h में त्रुटि 302 वाले संदेश प्रदर्शित न करें; सहायक खाता Sec1 eq 0021h पंजीकृत करता है; Sec2 eq 0022h ; स्किटबिट इक्व 0024h; बिट्स की संख्या गिनने के लिए सहायक रजिस्टर पेरेम इक्व 0025h; एसपीआई के माध्यम से बाइट रिसेप्शन/ट्रांसमिशन के लिए सहायक रजिस्टर, आई2सी टेम्परेचर इक्व 0026h; तापमान रजिस्टर पेरेम_1 इक्व 0027h; बाइनरी-दशमलव कनवर्टर के लिए सहायक रजिस्टर। परिणाम समान 0028h; बाइनरी-दशमलव कनवर्टर सहायक रजिस्टर dat_ind eq 0029h; spi प्रोटोकॉल के माध्यम से ट्रांसमिशन के लिए डेटा रजिस्टर adr_ind eq 002Ah; spi प्रोटोकॉल के माध्यम से ट्रांसमिशन के लिए पता रजिस्टर दूसरा eq 002Bh; समय मिनट सेट करने के लिए सेकंड स्टोरेज रजिस्टर eq 002Ch; समय घंटा eq 002Dh सेट करने के लिए मिनट स्टोरेज रजिस्टर; समय सेटिंग्स के लिए घंटा भंडारण रजिस्टर adr_i2c eq 002Eh; i2c इंटरफ़ेस डेटा ट्रांसफर सबरूटीन tmp_i2c eq 002Fh स्लेव_adr eq 0030h डेटा_i2c eq 0031h फ़्लैग eq 007Fh; फ़्लैग रजिस्टर #DEFINE int PORTB,0; इंटरप्ट लाइन INT/SQW DS3231 #DEFINE एसडीए पोर्टबी ,1 ;कनेक्शन DS3231 के लिए लाइन SDA #DEFINE scl PORTB,2 ;DS3231 को जोड़ने के लिए SCL लाइन #DEFINE sda_io TRISB,1 ;SDA लाइन की दिशा #DEFINE scl_io TRISB,2 ;SCL लाइन की दिशा #DEFINE डेटाई PORTB,5 ;MAX7219 ड्राइवर की डेटा इनपुट लाइन #DEFINE cs PORTB,6 ;ड्राइवर चयन लाइन MAX7219 #DEFINE clk PORTB,7 ;ड्राइवर क्लॉक लाइन MAX7219 #DEFINE LED PORTB,4 ;i2c एरर LED #DEFINE LED_sec PORTB,3 ;क्लॉक प्रोग्रेस इंडिकेटर LED 1Hz #DEFINE regim PORTA,2 ;संकेत बटन - डिस्प्ले मोड बदलना #DEFINE nast PORTA,3 ;सेटिंग बटन - समय सेटिंग मोड में प्रवेश #DEFINE ust PORTA,4 ;सेटिंग बटन - क्लॉक वैल्यू सेट करना;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;एड्रेस 0000h से प्रोग्राम निष्पादन शुरू करें प्रारंभ करें ;स्टार्ट लेबल पर जाएं ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;मुख्य कार्यक्रम movwf b"00000000" प्रारंभ करें; पोर्ट A movwf PORTA के आउटपुट लैच के मान सेट करना; movwf b"01000000" ;पोर्ट B movwf PORTB के आउटपुट लैच के मान सेट करें; movwf b"00000111"; तुलनित्र बंद करें movwf CMCON; बीएसएफ स्थिति, आरपी0; पहले बैंक movlw b"00000111" का चयन करें; पोर्ट B movwf TRISB की इनपुट/आउटपुट लाइनें सेट करें; RB0-RB2 - इनपुट के लिए, बाकी आउटपुट movlw b"11111111" के लिए; इनपुट सेट करें/ पोर्ट A movwf TRISA की आउटपुट लाइनें; इनपुट bcf STATUS, RP0 की सभी लाइनें; बैंक 0 clrf फ़्लैग का चयन करें; फ़्लैग रजिस्टर कॉल init_lcd रीसेट करें; कॉल ड्राइवर इनिशियलाइज़ेशन सबरूटीन (MAX7219) कॉल viv_not; आउटपुट डैश सिंबल " ------ " ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; movlw b"11010000"; डिवाइस का पता (DS3231) movwf स्लेव_adr; i2c के माध्यम से प्राप्त/ट्रांसमिट रजिस्टर में 4 बाइट्स लिखें; यहां पहला अलार्म कॉन्फ़िगर किया गया है, हर दूसरे movlw डेटा को बीप करता है_i2c; i2c movwf FSR के माध्यम से पहला प्राप्त/ट्रांसमिट रजिस्टर सेट करें ; movlw b"10000000" ;पहले अलार्म movwf INDF के सेकंड रजिस्टर के लिए डेटा; इंकएफ एफएसआर,एफ ; movwf b"10000000"; पहले अलार्म movwf INDF के मिनट रजिस्टर के लिए डेटा; इंकएफ एफएसआर,एफ ; movlw b"10000000" ;पहली अलार्म घड़ी movwf INDF के क्लॉक रजिस्टर के लिए डेटा; इंकएफ एफएसआर,एफ ; movlw b"10000000"; पहले अलार्म movwf INDF के सप्ताह रजिस्टर की तारीख/दिन के लिए डेटा; movlw. 4; i2c movwf tmp_i2c के माध्यम से 4 बाइट्स स्थानांतरित करें; movwf 0x07; पहली अलार्म घड़ी movwf adr_i2c के सेकंड रजिस्टर का पता सेट करना; write_i2c को कॉल करें; i2c इंटरफ़ेस के माध्यम से राइटिंग सबरूटीन को कॉल करें err_prov को कॉल करें; I2C लिखने/पढ़ने की त्रुटियों की जाँच करें movlw .1; i2c movwf tmp_i2c के माध्यम से पहली बाइट को स्थानांतरित करें; movlw 0x0E; नियंत्रण रजिस्टर movwf adr_i2c का पता सेट करना; movlw data_i2c; i2c movwf FSR के माध्यम से पहला ट्रांसमिट/प्राप्त रजिस्टर सेट करना; movlw b"00000101" ;घड़ी जनरेटर शुरू करें, movwf INDF के लिए INT/SQW पिन के संचालन को प्रतिबंधित करें; बैटरी पावर मोड, INT/SQW आउटपुट पर पल्स आवृत्ति 1Hz है; INT/SQW आउटपुट का उपयोग अलार्म उत्पन्न करने के लिए किया जाता है घड़ी में व्यवधान, ;अलार्म घड़ी में व्यवधान को सक्षम करना, प्रथम अलार्म कॉल राइट_आई2सी; आई2सी इंटरफेस कॉल के माध्यम से रिकॉर्डिंग सबरूटीन को कॉल करना, err_prov; I2C लिखने/पढ़ने की त्रुटियों की जांच करना, मेट_2 movlw .1; i2c movwf tmp_i2c के माध्यम से प्रथम बाइट को स्थानांतरित करना; movwf 0x0F; स्थिति रजिस्टर का पता सेट करना movwf adr_i2c; movlw data_i2c; i2c movwf FSR के माध्यम से पहला ट्रांसमिट/प्राप्त रजिस्टर सेट करना; movlw b"00000000" ;OSF बिट को रीसेट करें, EN32kHz आउटपुट पर दालों के उत्पादन पर रोक लगाएं, movwf INDF ;अलार्म इंटरप्ट फ़्लैग A2F, A1F कॉल राइट_i2c को रीसेट करें; i2c इंटरफ़ेस कॉल err_prov के माध्यम से रिकॉर्डिंग सबरूटीन को कॉल करें; I2C लिखने की जांच करें /त्रुटियों को पढ़ें मेट_1 बीटीएफएससी इंट; अलार्म इंटरप्ट लाइन गोटो मेट_3 को पोल करना; बीएसएफ एलईडी_सेक; घड़ी प्रगति सूचक एलईडी गोटो मेट_4 चालू करें; मेट_3 बीसीएफ एलईडी_सेक; घड़ी प्रगति सूचक एलईडी बीटीएफएससी नास्ट को बंद कर देता है; घड़ी सेटिंग बटन गोटो मेट_5 को पोल करता है; nast_time को कॉल करें; समय निर्धारित करने के लिए सबरूटीन को कॉल करें, geto Met_2; मेट_5 बीटीएफएससी रेगिम; इंडिकेशन मोड बटन गोटो मेट_1 का पोल; मेट_6 कॉल paus_knp ; बीटीएफएसएस शासन; गोटो मेट_6 ; btfss ध्वज,2; संकेत मोड ध्वज गोटो मेट_7 का मान बदलें; बीसीएफ ध्वज,2; रीसेट इंडिकेशन फ्लैग, क्लॉक डिस्प्ले मोड गोटो मेट_1; मेट_7 बीएसएफ ध्वज,2; संकेत ध्वज, तापमान और घड़ी प्रदर्शन मोड सेट करना मेट_1 पर जाएं; Met_4 movwf .1; i2c movwf tmp_i2c के माध्यम से पहली बाइट संचारित करना; movwf 0x11; उच्च तापमान रजिस्टर का पता सेट करना movwf adr_i2c; read_i2c को कॉल करें; I2C के माध्यम से रीडिंग सबरूटीन को कॉल करें err_prov को कॉल करें; I2C लिखने/पढ़ने की त्रुटियों की जांच करें movwf INDF,W; तापमान मान को अस्थायी रजिस्टर movwf temp rd_time movlw .3 में कॉपी करें; i2c movwf tmp_i2c के माध्यम से 3 बाइट्स स्थानांतरित करें; movlw 0x00; सेकंड रजिस्टर पता सेट करना movwf adr_i2c; read_i2c को कॉल करें; I2C के माध्यम से रीडिंग सबरूटीन को कॉल करें err_prov को कॉल करें; I2C लिखने/पढ़ने की त्रुटियों की जांच करें btfsc फ़्लैग,2; इंडिकेशन मोड फ़्लैग गोटो मेट_8 का पोल; विवॉड को कॉल करें; डिजिटल डिस्प्ले गोटो मेट_2 पर घड़ी का मान प्रदर्शित करने के लिए सबरूटीन को कॉल करें; Met_8 कॉल vivod_temp ;डिजिटल डिस्प्ले पर तापमान और घड़ी प्रदर्शित करने के लिए सबरूटीन को कॉल करना geto Met_2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

#शामिल करना

CONFIG H"3F10" ;माइक्रोकंट्रोलर कॉन्फ़िगरेशन

त्रुटिस्तर -302; सूची में 302 त्रुटि संदेश प्रदर्शित न करें

Sec eq 0020h ;सहायक खाता रजिस्टर

Sec1 eq 0021h ;

Sec2 eq 0022h ;

स्किटबिट इक्व 0024एच; बिट्स की सहायक रजिस्टर संख्या की गिनती

पेरेम ईक्यू 0025एच; एसपीआई, आई2सी के माध्यम से सहायक बाइट रिसेप्शन/ट्रांसमिशन रजिस्टर

तापमान समीकरण 0026h ;तापमान रजिस्टर

perem_1 eq 0027h ;बीसीडी सहायक रजिस्टर

परिणाम समान 0028h; बाइनरी-दशमलव कनवर्टर सहायक रजिस्टर

dat_ind eq 0029h; एसपीआई प्रोटोकॉल के माध्यम से ट्रांसमिशन के लिए डेटा रजिस्टर

adr_ind eq 002Ah; spi प्रोटोकॉल के माध्यम से ट्रांसमिशन के लिए पता रजिस्टर

समय निर्धारित करने के लिए दूसरा ईक्यू 002बीएच; सेकंड स्टोरेज रजिस्टर

समय निर्धारित करने के लिए मिनट समान 002Ch; मिनट भंडारण रजिस्टर

समय निर्धारित करने के लिए घंटा समान 002Dh; घंटा भंडारण रजिस्टर

adr_i2c eq 002Eh; i2c इंटरफ़ेस डेटा ट्रांसफर सबरूटीन के रजिस्टर

tmp_i2c समान 002Fh

स्लेव_एडीआर इक्व 0030एच

डेटा_आई2सी इक्व 0031एच

ध्वज समान 007Fh ;ध्वज रजिस्टर

#DEFINE int PORTB,0 ;इंटरप्ट लाइन INT/SQW DS3231

#एसडीए पोर्टबी,1 को परिभाषित करें;डीएस3231 को जोड़ने के लिए एसडीए लाइन

#DS3231 को जोड़ने के लिए SCL PORTB,2 ;SCL लाइन को परिभाषित करें

#DEFINE डेटाई PORTB,5; MAX7219 ड्राइवर की डेटा इनपुट लाइन

#DEFINE सीएस पोर्टबी,6; ड्राइवर चयन लाइन MAX7219

#DEFINE clk PORTB,7 ;MAX7219 ड्राइवर की क्लॉक लाइन

#DEFINE LED PORTB,4 ;i2c त्रुटि LED

#DEFINE LED_sec PORTB,3 ;LED क्लॉक प्रोग्रेस इंडिकेटर 1Hz

#DEFINE रेगिम पोर्टा,2; इंडिकेशन बटन - डिस्प्ले मोड बदलता है

#DEFINE nast PORTA,3 ;सेटिंग्स बटन - समय सेटिंग मोड में प्रवेश करता है

#पोर्टा को परिभाषित करें,4; सेट बटन - घड़ी का मान सेट करें

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

org 0000h; पता 0000h से प्रोग्राम निष्पादन प्रारंभ करें

प्रारंभ करें; प्रारंभ लेबल पर जाएं

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

;मुख्य कार्यक्रम

Movlw b"00000000" प्रारंभ करें; पोर्ट A के आउटपुट लैच के मान सेट करें

movlw b"01000000" ;पोर्ट बी के आउटपुट लैच के मान सेट करें

movlw b"00000111"; तुलनित्र बंद करें

बीएसएफ स्थिति, आरपी0; पहला बैंक चुनें

movlw b"00000111"; पोर्ट बी की इनपुट/आउटपुट लाइनों को कॉन्फ़िगर करना

movwf TRISB ;RB0-RB2 - इनपुट के लिए, बाकी आउटपुट के लिए

movlw b"11111111"; पोर्ट ए की इनपुट/आउटपुट लाइनें सेट करना

movwf TRISA; इनपुट के लिए सभी पंक्तियाँ

बीसीएफ स्थिति, आरपी0; बैंक 0 चुनें

सीएलआरएफ ध्वज; ध्वज रजिस्टर रीसेट करें

init_lcd को कॉल करें; ड्राइवर इनिशियलाइज़ेशन रूटीन को कॉल करें (MAX7219)

viv_not को कॉल करें; संकेतकों के लिए आउटपुट डैश प्रतीक "------"।

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

movlw b"11010000" ;डिवाइस पता (DS3231)

;i2c के माध्यम से प्राप्त/संचारित रजिस्टरों में 4 बाइट्स लिखें

movlw data_i2c; i2c के माध्यम से पहला प्राप्त/ट्रांसमिट रजिस्टर सेट करना

movlw b"10000000" ;पहले अलार्म के सेकंड रजिस्टर के लिए डेटा

movlw b"10000000" ;पहले अलार्म के मिनट रजिस्टर के लिए डेटा

movlw b"10000000" ;पहले अलार्म क्लॉक रजिस्टर के लिए डेटा

movlw b"10000000" ;पहले अलार्म के सप्ताह रजिस्टर की तारीख/दिन के लिए डेटा

movlw .4; i2c के माध्यम से 4 बाइट्स स्थानांतरित करें

movlw 0x07; पहली अलार्म घड़ी के सेकंड रजिस्टर का पता सेट करना

यह समीक्षा शुरुआती रेडियो शौकीनों (जो सोल्डर करना पसंद करते हैं) के लिए है, उन लोगों के लिए जो इस प्रक्रिया में रुचि रखते हैं। आप अपने कौशल का मूल्यांकन कर सकते हैं. DS3231 चिप एक एकीकृत क्रिस्टल ऑसिलेटर और तापमान मुआवजे के साथ एक वास्तविक समय घड़ी (आरटीसी) है।

निःसंदेह, यह एक आस्टसीलस्कप सोल्डरिंग नहीं है। नीचे का स्तर. लेकिन यह एक दिलचस्प गतिविधि है.
आइए जल्दी से देखें कि सब कुछ किस रूप में आया।


सामग्री दो बैगों में थी। ताले के साथ मानक बैग. एक बड़े बैग के अंदर छोटी-छोटी चीजों का एक छोटा बैग था।


किट में शामिल हैं:
- एक बॉडी के रूप में पारभासी प्लास्टिक से बनी दो प्लेटें होती हैं (खरोंच से रंगी हुई और फिल्म से सुरक्षित)।
- बोर्ड (बहुत उच्च गुणवत्ता)।


दो आव्यूह.


सामने की ओर वे फिल्म द्वारा संरक्षित हैं। पैर झरझरा पॉलीथीन से सुरक्षित थे।


USB केबल लगभग एक मीटर लंबी होती है।


जो कुछ बचा था, वह सब मैंने उड़ेल दिया।


दो भागों में विभाजित.
नट के साथ पेंच.


और तथ्य यह है कि आपको सोल्डर करना होगा।


बहुत ही दुर्लभ CR1220 प्रारूप की लिथियम बैटरी के लिए एक सॉकेट, एक पारा स्थिति सेंसर, ट्रांजिस्टर की एक जोड़ी, इलेक्ट्रोलाइटिक कैपेसिटर, एक AMS1117 स्टेबलाइजर (3.3V), SMD कैपेसिटर और रेसिस्टर्स (10K), 3 बटन, एक USB कनेक्टर, एक बजर.
सबसे महत्वपूर्ण चीज़ STC 15w1k24s नियंत्रक और उच्च परिशुद्धता DS3231 चिप है। वे बहुत सख्त छाले में भरे हुए थे, उन पर झुर्रियाँ पड़ना बहुत मुश्किल था।


कोई योजना नहीं थी. हालाँकि, कोई सवाल नहीं उठा, सब कुछ स्पष्ट था।
बोर्ड पर सभी विवरण न केवल लेबल किए गए हैं, बल्कि (सशर्त रूप से) खींचे गए हैं।
यह आसान है।
लेकिन पहले मैंने तैयारी की.


मैंने दो सबसे जटिल (मुझे ऐसा लगा) माइक्रो-सर्किट को टांका लगाने से शुरुआत की। दो स्थानों पर स्थित और पकड़ा गया (व्यापक रूप से विपरीत)। और फिर मैंने इसे ठीक से सोल्डर कर दिया। इसे पकड़ना न भूलें ताकि वे "भाग न जाएं"।


फिर स्टेबलाइजर.


ट्रांजिस्टर.


चार एसएमडी प्रतिरोधक और दो एसएमडी कैपेसिटर। पोजिशनिंग करना और एक किनारे से पकड़ना इतना आसान नहीं था (इसके लिए कौशल की आवश्यकता होती है)। और मेरे पास यह पर्याप्त नहीं है :)।


दो इलेक्ट्रोलाइट्स.


यूएसबी कनेक्टर.


लिथियम बैटरी सॉकेट.


चीख़नेवाला। प्लस और माइनस के बारे में मत भूलना। टांका लगाने के बाद, मैंने पैरों को बिल्कुल काट दिया, मैं नहीं चाहता कि बाद में टांका लगाते समय वे हस्तक्षेप करें।


बुध स्थिति सेंसर.


3 बटन.


और अंत में, मैट्रिक्स। ओरिएंटेशन पर ध्यान दें. यह सबसे ऊपर है (ट्वीटर बाईं ओर होगा)।


यह हुआ था।


सच है, स्पेयर पार्ट्स बचे थे (नुकसान के मामले में, शायद): एक ट्रांजिस्टर, दो प्रतिरोधक और एक संधारित्र।


मैं इसे फ्लक्स से धोता हूं।
मैं जांच रहा हूं।
वे करते हैं!
मैं सुरक्षात्मक फिल्में हटा देता हूं।


मैं संग्रह कर रहा हूँ.

स्विच ऑन करने के बाद घड़ी ने मुझे नये साल की बधाई दी.


कोई आश्चर्य नहीं, 1 जनवरी 2000 को घड़ी 00 घंटे 01 मिनट की है।


मैट्रिक्स के विभिन्न रंगों पर ध्यान न दें. "स्क्रीन" की ताज़ा दर कैमरे की शटर गति के बराबर है। इंसान की आँख हर चीज़ को सही लाल रंग में देखती है। इसीलिए जब मैं वीडियो फिल्मा रहा था तो मैंने खिड़कियों को थोड़ा सा छायांकित कर दिया (शटर गति बढ़ाने के लिए)।
अब हमें इसे कॉन्फ़िगर करने की आवश्यकता है।
घड़ी के पीछे तीन बटन हैं। मैंने स्वयं उन्हें पारंपरिक रूप से (ऊपर से नीचे तक) कहा है:
1. मेनू.
2. प्लस.
3. माइनस.
सेटअप एल्गोरिदम देखें. अगर आपके हाथ में घड़ी है, तो जो स्पष्ट नहीं है वह भी स्पष्ट हो जाएगा
प्रवेश करने के लिए, शीर्ष बटन (मेनू) को कुछ देर तक दबाए रखें। आगे हम लघु प्रेस के साथ काम करते हैं।

मुझे कुछ समझाने दीजिए. कुल छह मेनू हैं. वे एक घेरे में घूमते हैं। आप प्लस बटन का उपयोग कर सकते हैं, आप माइनस बटन का उपयोग कर सकते हैं।
समय - समय निर्धारण.
दिनांक - दिनांक निर्धारण.
ALAR - अलार्म सेटिंग।
फ़ॉन्ट - फ़ॉन्ट का चयन (कुल 5 प्रकार: पतला, चौड़ा, चिकना...)।
डीआईएसपी - सूचना आउटपुट एल्गोरिदम का चयन (आप केवल एक घड़ी का उपयोग कर सकते हैं, आप क्रमिक रूप से बदलती जानकारी प्राप्त कर सकते हैं: समय, तापमान, तिथि, छुट्टियां एक रेंगने वाली रेखा में...)।
एमआईडीपी - विभाजन बिंदुओं के प्रकार का चयन करें।


हर बात को शब्दों में बयां करना आसान नहीं है. मैंने इसे वीडियो (अंत में लिंक) में विस्तार से दिखाया है।
और इस वीडियो (30 सेकंड) में आप मैट्रिसेस (डीआईएसपी टाइप2 मेनू) पर जानकारी प्रदर्शित करने के लिए एल्गोरिदम देख सकते हैं।


महत्वपूर्ण लेख। लिथियम बैटरी के बिना, सेट करने के बाद समय और तारीख नष्ट हो जाती है। शेष सेटिंग्स स्मृति में रहती हैं.
इसे रेगुलर चार्जर से कनेक्ट किया। मैंने अपनी खपत मापी।


50mA से कम खपत करने पर USB डिवाइस कुछ भी नहीं दिखाता है (यह एक सुविधा है)।
निष्कर्ष: क्लॉक मोड में वर्तमान खपत 50mA से कम है, टिकर मोड में यह लगभग 70mA है। इतना नहीं।
मैंने आयाम मापा: 105*85 मिमी।
मानक डिस्प्ले में प्रत्येक संख्या 20*30 मिमी है।


मैंने इसे टीवी के सामने रख दिया।


मैं पारा स्थिति सेंसर के बारे में लगभग भूल गया था।
घड़ी हमेशा सही दिखाई देगी, भले ही वह उलटी हो। पारा बॉल या तो संपर्कों को बंद कर देती है या खोल देती है। तदनुसार, नियंत्रक मैट्रिक्स में जानकारी आउटपुट करने के लिए एल्गोरिदम बदलता है।
मूलतः यही है.
यह जायजा लेने का समय है.
शुरुआती रेडियो शौकीनों के लिए अपने कौशल का परीक्षण करने के लिए एक अच्छी DIY किट। इसके अलावा, यह सिर्फ प्रशिक्षण के लिए एक सेट नहीं है, बल्कि अंत में यह एक अच्छी घड़ी साबित हुई।
मैंने जो लिखा वह सही निष्कर्ष के लिए पर्याप्त होना चाहिए।
यदि कुछ अस्पष्ट है तो प्रश्न पूछें। मुझे आशा है कि इससे कम से कम किसी को मदद मिली होगी।
आपको कामयाबी मिले!

उत्पाद स्टोर द्वारा समीक्षा लिखने के लिए प्रदान किया गया था। समीक्षा साइट नियमों के खंड 18 के अनुसार प्रकाशित की गई थी।

मैं +61 खरीदने की योजना बना रहा हूं पसंदीदा में जोड़े मुझे समीक्षा पसंद आयी +66 +122

विशिष्ट सुविधाएं:

  • 0°C से +40°C तक के तापमान पर सटीकता ±2 पीपीएम
  • -40°C से +85°C तक तापमान सीमा पर सटीकता ±3.5 पीपीएम
  • निरंतर संचालन सुनिश्चित करने के लिए एक स्वायत्त बिजली स्रोत को जोड़ने के लिए इनपुट
  • ऑपरेटिंग तापमान रेंज वाणिज्यिक: 0°C से +70°C औद्योगिक: -40°C से +85°C
  • कम खपत
  • वास्तविक समय घड़ी 2100 तक लीप वर्ष सुधार के साथ सेकंड, मिनट, घंटे, सप्ताह के दिन, महीने के दिन, महीने और वर्ष की गिनती करती है
  • दो दैनिक अलार्म
  • प्रोग्रामयोग्य आवृत्ति के साथ वर्गाकार तरंग आउटपुट
  • तेज़ (400 kHz) I 2 C इंटरफ़ेस
  • 3.3V पावर
  • माप सटीकता के साथ डिजिटल तापमान सेंसर ±3°C
  • आवश्यक समायोजन के बारे में डेटा युक्त रजिस्टर
  • नॉनआरएसटी रीसेट इनपुट/आउटपुट

आवेदन पत्र:

  • सर्वर
  • इलेक्ट्रॉनिक बिजली मीटर
  • टेलीमैटिक्स उपकरण
  • जीपीएस सिस्टम

DS3231 के लिए विशिष्ट कनेक्शन आरेख:

सामान्य विवरण:

DS3231 एक उच्च-सटीक वास्तविक समय घड़ी (RTC) है जिसमें अंतर्निहित I 2 C इंटरफ़ेस, तापमान-क्षतिपूर्ति क्रिस्टल ऑसिलेटर (TCXO) और क्वार्ट्ज रेज़ोनेटर है। डिवाइस में बैकअप स्वायत्त पावर स्रोत को जोड़ने के लिए एक इनपुट है, जो मुख्य आपूर्ति वोल्टेज बंद होने पर भी टाइमकीपिंग और तापमान माप की अनुमति देता है। अंतर्निर्मित क्वार्ट्ज रेज़ोनेटर डिवाइस की सेवा जीवन को बढ़ाता है और बाहरी तत्वों की आवश्यक संख्या को कम करता है। DS3231 वाणिज्यिक और औद्योगिक तापमान संस्करणों में उपलब्ध है और इसे 300 मिल 16 पिन SO पैकेज में पैक किया गया है।

आरटीसी सेकंड, मिनट, घंटे, सप्ताह के दिन, महीने और वर्ष के दिनों की गिनती प्रदान करता है। महीने की अंतिम तिथि लीप वर्ष को ध्यान में रखते हुए स्वचालित रूप से निर्धारित की जाती है। वास्तविक समय घड़ी दिन के वर्तमान आधे हिस्से (एएम/पीएम) के संकेत के साथ 24 या 12 घंटे के प्रारूप में संचालित होती है। डिवाइस में दो दैनिक अलार्म और प्रोग्रामयोग्य आवृत्ति के साथ एक वर्ग तरंग आउटपुट है। डिवाइस के साथ डेटा का आदान-प्रदान अंतर्निहित सीरियल I 2 C संगत इंटरफ़ेस के माध्यम से किया जाता है।



मित्रों को बताओ