मुझे आरटीसी को कितनी बार क्वेरी करनी चाहिए?


11

मैंने अभी तक एक आरटीसी का उपयोग नहीं किया है, इसलिए मैं एक वास्तविक समय घड़ी को पढ़ने के लिए "सामान्य" तरीके से पूरी तरह से आश्वस्त नहीं हूं। वहाँ कुछ अलग दृष्टिकोण मैं सोचा है, लेकिन इस पर कुछ सलाह के लिए उम्मीद कर रहा था।

यहां मैंने अभी तक पढ़ने और समय का उपयोग करने के बारे में सोचा है:

  1. दिनांक और समय को पावर अप करने के लिए प्राप्त करें और रैम को सहेजें, और फिर टाइमर के उपयोग के माध्यम से रैम के मान को हर सेकंड बढ़ाएँ आदि। कोड तब रैम में उन मूल्यों का उपयोग करेगा, जब भी तारीख / समय को जानने की आवश्यकता होगी।
  2. टाइमर इंटरप्ट के उपयोग के माध्यम से, हर सेकंड RTC को क्वेरी करें और प्राप्त दिनांक और समय को RAM पर कॉपी करें। फिर, कोड तब रैम में मूल्यों का उपयोग करेगा जब भी तिथि / समय जानने की आवश्यकता होगी।
  3. हर बार मुझे समय का पता लगाने की जरूरत है, आरटीसी को क्वेरी करें और सीधे इसका उपयोग करें।

सबसे अच्छा तरीका कौन सा होगा?


15
सबसे अच्छा तरीका वह है जो न्यूनतम संसाधनों का उपयोग करते हुए आपके विनिर्देशों को पूरा करता है। चूंकि हम वास्तव में आपकी आवश्यकताओं को नहीं जानते हैं, "सर्वश्रेष्ठ" का हमारे लिए बहुत कम अर्थ है।
स्कॉट सीडमैन

सभी बहुत अच्छे उत्तर मैं एक उत्तर नहीं चुन सकता हूँ!
user9993

जवाबों:


23

मैं एक चौथे विकल्प का उपयोग करूंगा।

अधिकांश आरटीसी चिप्स में 1 सेकंड पल्स आउटपुट करने का विकल्प होता है। आपको उस पल्स को अपने MCU पर एक सक्षम सक्षम इनपुट से जोड़ना चाहिए।

  • आपको अपने कार्यक्रम की शुरुआत में एक बार चिप से समय मिलता है, और शायद कभी-कभार तब से - शायद एक घंटे में एक बार।
  • इसके बाद रुकावट संकेत आपके MCU में एक रुकावट दिनचर्या को ट्रिगर करता है जिसमें आप एक सेकंड से समय बढ़ाते हैं।

यह व्यवस्था आपको RTC को सक्रिय रूप से पढ़ने के ओवरहेड के बिना RTC के दूसरे को सटीकता प्रदान करती है


5
इस दृष्टिकोण का उपयोग करते समय, यह जानना महत्वपूर्ण है कि कौन सी घड़ी बढ़त एक वृद्धि का प्रतिनिधित्व करती है और यह भी सुनिश्चित करने के लिए कि उस घड़ी के दौरान जो भी प्रगति हो रही है उसे छोड़ दिया जाना चाहिए।
सुपरकैट

या सुनिश्चित करें कि रीडिंग केवल ISR द्वारा ट्रिगर किया गया है - आपको अगले ISR ट्रिगर होने से पहले रीडिंग करने के लिए एक दूसरा गैप मिलता है।
मैजेंको

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

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

9

3 और 2 अधिक व्यवहार्य हैं।

3 दृष्टिकोण जो मैं ज्यादातर मामलों में उपयोग करता हूं। यह लाभ है कि मुझे RAM में RTC को मिरर करने की चिंता करने की आवश्यकता नहीं है। यह संभावित कमी है कि सीरियल बस के माध्यम से आरटीसी से पूछताछ करना देरी का परिचय देता है। यदि आप एक सेकंड में एक बार डेटा लिख ​​रहे हैं, तो यह देरी शायद मायने नहीं रखेगी।

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

ps सभी मामलों में, मैं DS1307 का उपयोग कर रहा था।


6

कुछ आरटीसी (उदाहरण के लिए MC68HC68T1 [जो कि लगभग किसी को भी अब और उपयोग नहीं करना चाहिए]) उनकी आंतरिक गिनती को रोक देगा जब से पढ़ा जा रहा है ताकि एक सुसंगत प्रतिक्रिया दी जा सके। विघटन को कम करने के लिए उन्हें यथासंभव कम से कम पढ़ा जाना चाहिए । एक बार उनसे पढ़ें और फिर एमसीयू की रैम में संग्रहीत समय मूल्य को अपडेट करने के लिए टाइमर इंटरप्ट का उपयोग करें।


इस तरह के डिजाइन दिमाग को चकरा देते हैं। पढ़ता है कि एक वेतन वृद्धि के दौरान होने वाली यादृच्छिक डेटा के आसपास काम करने के लिए एक आसान समस्या होगी। पढ़े जाने के कारण गिना जाना याद रखना एक समस्या है जिसे खोई हुई गिनती को स्वीकार करने के अलावा काम नहीं किया जा सकता।
सुपरकैट

2
जाहिरा तौर पर डबल बफ़रिंग कुछ लोगों को लगता है कि जब वे अपने चिप्स डिजाइन नहीं करते हैं।
इग्नासियो वाज़केज़-अब्राम्स

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

5

मैं मान रहा हूँ कि आरटीसी या तो अपने स्वयं के क्रिस्टल के साथ एक अलग चिप है, या आपके माइक्रोकंट्रोलर के साथ एकीकृत एक मॉड्यूल है जिसमें फिर से मुख्य घड़ी की तुलना में एक अलग समय स्रोत (जैसे 32 kHz क्रिस्टल) है। और आरटीसी के लिए समय स्रोत माइक्रोकंट्रोलर के लिए एक से अधिक सटीक है।

यह निर्धारित करने के लिए कि आपको कितनी बार RTC पढ़ने की आवश्यकता है, आपको यह पता लगाना होगा कि आपकी मुख्य घड़ी में अधिकतम त्रुटि क्या हो सकती है। उदाहरण के लिए, यदि मुख्य क्रिस्टल 20 पीपीएम पर निर्दिष्ट है, तो यह 0.002% के समान है। इसलिए मुख्य घड़ी स्रोत पर आधारित एक घड़ी प्रतिदिन 0.00002 * 3600 * 24 = 1.728 सेकंड तक बहाव कर सकती है।

इसलिए यदि आप एक दिन में केवल दो बार RTC पढ़ते हैं, और बीच में एक बार एक टाइमर अवरोधक का उपयोग करके समय बढ़ाते हैं, तो आप कभी भी एक सेकंड से अधिक नहीं होंगे - RTC की तुलना में कभी भी एक सेकंड से अधिक न हों।

यदि, जैसा कि मैंने पहले माना था, आपका आरटीसी या तो अपने स्वयं के क्रिस्टल के साथ एक अलग चिप है, या आपके माइक्रोकंट्रोलर के साथ एकीकृत एक मॉड्यूल है, इसका मतलब यह नहीं है कि यह सही है। आरटीसी में त्रुटि भी हो सकती है। उदाहरण के लिए, यदि यह 5 पीपीएम (जो कि 10 पीपीएम वाले की तुलना में थोड़ा अधिक महंगा है) की सहिष्णुता के साथ 32 kHz क्रिस्टल का उपयोग कर रहा है, तो यह प्रति दिन 0.43 सेकंड - या प्रति माह 13 सेकंड तक बंद हो सकता है।

इसके आसपास जाने के लिए, आपको आरटीसी को ट्यून करना होगा, जहां आप एक रजिस्टर में एक सुधार कारक लिखते हैं। ऐसा करने से आपको व्यावहारिक रूप से त्रुटि शून्य हो जाएगी। लेकिन निश्चित रूप से आपको ट्यूनिंग करते समय संदर्भ के रूप में उपयोग करने के लिए एक तीसरा बाहरी घड़ी स्रोत होना चाहिए। अमेरिका में एक अत्यंत सटीक संदर्भ 60 हर्ट्ज एसी लाइन है, जो बिल्कुल सटीक होने की गारंटी है 60 * 60 * 60 * 24 ( 5.184.000) लगातार midnights के बीच 24 घंटे की अवधि में चक्र। इसके लिए उपयोगी होने के लिए, आपको पूरे 24 घंटे के लिए समय देना चाहिए, क्योंकि 60 हर्ट्ज मिडनाइट्स के बीच कुछ बहाव कर सकता है।

एक और उत्कृष्ट समय संदर्भ जीपीएस (10 एनएस सटीकता) का उपयोग होगा, अगर एक पहले से ही उनके प्रोजेक्ट में जीपीएस हार्डवेयर था।

यदि इसके बजाय आपका RTC बार किसी बाह्य स्रोत से आता है, जैसे सेलुलर नेटवर्क समय (AT + CCLK; कॉल), या NTP का उपयोग करने वाला नेटवर्क समय सर्वर, तो आप RTC मान का उपयोग कर सकते हैं क्योंकि तब से "ट्यून" करने के लिए कुछ नहीं होगा। ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.