घड़ी बनाने के लिए आपको RTC की आवश्यकता नहीं है: ATmega चिप में RTC के कर्तव्यों को पूरा करने के लिए आवश्यक सभी हार्डवेयर हैं। यहां कैसे:
एक 32768 हर्ट्ज घड़ी क्रिस्टल प्राप्त करें: या तो इसे खरीदें या एक पुरानी घड़ी को इकट्ठा करें। विशेष रूप से समय को ध्यान में रखते हुए बनाए गए इन क्रिस्टलों में तापमान बहुत कम होता है। यदि आप RTC चिप का उपयोग करना चाहते हैं, तो आपको उनमें से एक की भी आवश्यकता होगी।
8 मेगाहर्ट्ज RC थरथरानवाला को चलाने के लिए अपने ATmega के फ़्यूज़ को कॉन्फ़िगर करें। यह आपके millis()
फ़ंक्शन को बहुत गलत बना देगा , और XTAL1 और XTAL2 पिन भी मुक्त कर देगा।
घड़ी क्रिस्टल को TOSC1 और TOSC2 पिन से कनेक्ट करें। ये XTAL1 और XTAL2 (328P पर 9 और 10) के समान पिन हैं। अलग-अलग नामों का मतलब अलग-अलग कार्यों से है।
अतुल्यकालिक ऑपरेशन के लिए टाइमर / काउंटर 2 को कॉन्फ़िगर करें, सामान्य गिनती मोड, 128 के लिए प्रस्केलर सेट करें और टाइमर के प्रवाह में बाधा को सक्षम करें।
अब आपको प्रति सेकंड एक बार बहुत ही स्थिर दर पर TIMER2_OVF व्यवधान मिलेगा। आपको केवल ISR में घड़ी के प्रदर्शन को एक सेकंड से आगे बढ़ाना होगा। बीच-बीच में, आप MCU को बहुत गहरी नींद में डाल सकते हैं (पावर-सेव स्लीप मोड: कुछ भी नहीं बल्कि टाइमर / काउंटर 2) और कुछ वर्षों तक AA कोशिकाओं पर चलते हैं। जब तक प्रदर्शन शक्ति-भूख है, जाहिर है।
मैंने अपनी 24-घंटे की एक दीवाल घड़ी बनाने के लिए ठीक यही किया । यह लिंक अब फ्रेंच में मूल प्रलेखन के अंग्रेजी अनुवाद की ओर इशारा करता है।
क्वार्ट्ज अंशांकन
यदि आप अपने क्वार्ट्ज को कैलिब्रेट नहीं करते हैं, तो आप एक महत्वपूर्ण बहाव की उम्मीद कर सकते हैं, आमतौर पर प्रति सप्ताह कुछ सेकंड । बहाव दर एमसीयू में क्रिस्टल को जोड़ने वाले निशानों के आवारा समाई पर निर्भर करता है। सिद्धांत रूप में, इसे कुछ अतिरिक्त, बारीक ट्यून्ड कैपेसिटेंस जोड़कर हटाया जा सकता है। यह ध्यान देने योग्य है कि आरटीसी के साथ आपको एक ही बहाव समस्या होगी ।
यदि आप इस तरह की सटीकता से संतुष्ट हैं, तो इसके साथ रहें और खुश रहें। हालांकि, यदि आप बहाव को मापने के लिए परवाह करते हैं, तो आप देखेंगे कि यह बहुत स्थिर है। फिर आप आसानी से सॉफ़्टवेयर में इसकी भरपाई कर सकते हैं, और प्रति वर्ष कुछ सेकंड की सटीकता प्राप्त कर सकते हैं ।
बहाव को सही करने के लिए एल्गोरिथ्म बहुत सरल है। मापा बहाव से, आप इंटरप्ट के बीच सटीक देरी का पता लगाते हैं, जो कि 10 9 नैनोसेकेंड के करीब होना चाहिए , फिर:
#define ONE_SECOND 1000000000 // in nanoseconds
#define ONE_INTERRUPT 999993482 // for example
ISR(TIMER2_OVF_vect)
{
static uint32_t unaccounted_time;
unaccounted_time += ONE_INTERRUPT;
while (unaccounted_time >= ONE_SECOND) {
advance_display_by_one_second();
unaccounted_time -= ONE_SECOND;
}
}
उपरोक्त उदाहरण में, क्वार्ट्ज थोड़ा तेज है, और सॉफ्टवेयर हर कुछ दिनों में "लापता" एक टिक की भरपाई करता है। यदि क्वार्ट्ज बहुत धीमा था, तो समान कोड हर कुछ दिनों में एक बार डबल-टिक करेगा।
इस तरह का अंशांकन आरटीसी के लिए भी किया जा सकता है, लेकिन यह काफी अधिक जटिल होगा, क्योंकि आरटीसी टूटे-फूटे रूप में समय की रिपोर्ट करता है जो स्वाभाविक रूप से अंकगणितीय संचालन के लिए उधार नहीं देता है।