Jfpoilpret का स्वीकृत उत्तर बहुत अच्छी तरह से लिखा गया है, पूरी तरह से मान्य है और 99% मामलों में मैं वही करता हूँ जो वह समझाता है। उनके समाधान आपके परिभाषित मापदंडों के भीतर अच्छी तरह से हैं, इसलिए उन्हें बहुत अच्छी तरह से काम करना चाहिए। लेकिन " बहुत अच्छी " से बेहतर क्या है ? पूर्णता! आखिरकार, सवाल एक सटीक मूल्य पैदा करने के बारे में है। जैसा कि कहा गया है कि ज्यादातर मामलों में (लगभग सभी) अच्छा है, और यहां तक कि घड़ियों के रूप में कुछ के साथ काम करते समय जब 1 सेकंड के लिए 1 सेकंड की आवश्यकता होती है, तो आपको अभी भी विरासत में मिले भागों की खामियों को भुगतना पड़ता है।
मैं जो सुझाव दूंगा वह हमेशा संभव नहीं है। कुछ मामलों में, यह संभव है, लेकिन इस मामले की तुलना में बहुत अधिक परेशानी और प्रयास के साथ। क्या यह मामला-दर-मामला आधार पर निर्भर है। मेरा लक्ष्य ज्यादातर भविष्य के संदर्भों के लिए एक विकल्प दिखाना है जो कुछ हद तक फ्रिंज मामलों में बेहतर है। यह नौसिखिया Arduino उपयोगकर्ताओं को ध्यान में रखकर लिखा गया है, जिनके पास इलेक्ट्रॉनिक्स में व्यापक अनुभव नहीं है।
अधिक उन्नत लोगों के लिए यह संभवतः बहुत अधिक क्रियात्मक और नीचे गूंगा दिखाई देगा। लेकिन मेरा मानना है कि, उन्हीं लोगों को शायद यह पहले से ही पता है और उन्हें इस जवाब की आवश्यकता नहीं है। यह हर माइक्रोकंट्रोलर और हर निर्माता और वास्तुकला पर भी लागू होता है। लेकिन अन्य माइक्रोकंट्रोलर्स के लिए आपको उचित रजिस्टर और प्रीस्केल नामों और मूल्यों का पता लगाने के लिए सही डेटशीट से परामर्श करने की आवश्यकता होगी।
आपके मामले में, आपको एक विशिष्ट आवृत्ति की आवश्यकता है और इसके बारे में अच्छी बात यह है कि वास्तव में 56 kHz को बहुत आसानी से प्राप्त किया जा सकता है (भागों की व्यावहारिक खामियों की गिनती नहीं)। तो यह भी एक आदर्श उदाहरण मामला है।
सिग्नल उत्पन्न करना माइक्रोकंट्रोलर के टाइमर और क्लॉक सोर्स पर निर्भर करता है, जैसा कि jfpoilpret द्वारा अच्छी तरह से समझाया गया है। उनका जवाब केवल एक बिंदु की समस्या से संबंधित है और यह समय के साथ स्पष्ट है। लेकिन आप घड़ी के स्रोत के साथ भी तालमेल कर सकते हैं, या तालमेल और भयानक परिणाम दोनों के लिए बेहतर हो सकते हैं। पर्यावरण के मापदंडों को बदलकर, इस मामले में सिस्टम को हैक करना और घड़ी के स्रोत की जगह, हम एक विशिष्ट समस्या से बहुत अधिक, बहुत अधिक सहजता और सरलता से निपट सकते हैं।
पहले याद दिलाने के लिए, पिन राज्य को टॉगल करने के कारण, आपको सिग्नल आवृत्ति की तुलना में आईएसआर को दो गुना अधिक निष्पादित करना होगा। यह प्रति सेकंड 112,000 बार है। 56,000 और 16,000,000 बहुत अच्छी तरह से जोड़ नहीं है जैसा कि पहले ही बताया गया है। हमें सिग्नल फ्रिक्वेंसी या टैक्स् फ़्रीक्वेंसी को बदलना होगा। चलिए अब एक अपरिवर्तनीय सिग्नल आवृत्ति के साथ सौदा करते हैं और एक बेहतर घड़ी गति पाते हैं।
56 kHz (या 112 kHz से अधिक) के परिमाण के कुछ क्रम के साथ एक घड़ी चुनना सबसे सरल होगा, लेकिन यह व्यावहारिक रूप से समान है), क्योंकि आप केवल शून्य जोड़ते हैं और इस तरह का गणित अधिकांश लोगों के लिए सबसे सरल है। दुर्भाग्य से इस दुनिया में सब कुछ किसी न किसी तरह का समझौता है। हर मान से काम नहीं चलेगा।
पहला उदाहरण बहुत कम टैक जनरेटर गति के साथ है।
यदि आप 56,000 हर्ट्ज की घड़ी चुनते हैं तो आप कुछ भी नहीं कर पाएंगे क्योंकि आपको आईएसआर को हर चक्र पर कॉल करना होगा और कुछ और नहीं कर सकते। यह सरासर बेकार है। यदि आप 10 गुना तेज गति (560 kHz) चुनते हैं, तो आपके पास अपना काम करने के लिए 9 (10 चक्रों के लिए अधिकतम मूल्य - ISR फ़ंक्शन को कॉल करने के लिए एक चक्र) माइक्रोकंट्रोलर चक्र होगा और यह काफी संभव नहीं हो सकता है। आपको अक्सर अधिक कम्प्यूटेशनल शक्ति की आवश्यकता होती है।
यदि आप दूसरे हाथ पर बहुत अधिक मूल्य चुनते हैं, तो 56 मेगाहर्ट्ज का माइक्रोकंट्रोलर बस इसके साथ काम नहीं कर सकता है। यह बहुत तेज़ है। तो, बस दुकान में सबसे बड़ा मूल्य चुनना या तो यह कटौती नहीं करेगा।
मूल Arduino Uno R3 में 16 MHz पर एक स्टॉक घड़ी है, इसलिए कुछ भी धीमा है जो काम करने की गारंटी है। अगला मूल्य जो 56 की तुलना में बड़ा और 16 मेगाहर्ट्ज से कम का क्रम 5.6 मेगाहर्ट्ज है। यह आईएसआर को प्रत्येक 50 चक्रों में कॉल करने में सक्षम होगा और 112,000 हर्ट्ज टाइमर आवृत्ति को सही बनाएगा। और आपका सिग्नल ठीक 56 kHz होगा। आईएसआर कॉल के बीच अपने कार्यक्रम को निष्पादित करने के लिए आपके पास 49 एमसीयू चक्र होंगे, लेकिन यह मूल घड़ी की गति के 1/3 के आसपास है। एक आधार के रूप में 112 का उपयोग कर सकता है और एक 11.2 मेगाहर्ट्ज घड़ी का उपयोग कर सकता है और यह स्टॉक 16 मेगाहर्ट्ज के प्रतिध्वनि के बारे में 2/3 देगा। ISR फ़ंक्शन को हर 100 चक्र कहा जाएगा और अभी भी एक परिपूर्ण 56 kHz सिग्नल पैदा करेगा।
हालाँकि इन मूल्यों के साथ दो प्रमुख समस्याएं मौजूद हैं।
पहली समस्या गंभीर रूप से आपकी आवश्यकताओं पर निर्भर करती है: आप सटीक सिग्नल आवृत्ति प्राप्त करने के लिए अपनी अधिकतम कम्प्यूटेशनल शक्ति के 1/3 (11.2 मेगाहर्ट्ज के साथ) का त्याग करते हैं जो एक आसान-से-रजिस्टर रजिस्टर मूल्य (ओसीआर आईक्रैक ) का उपयोग करते हैं। आप इसके साथ ठीक हो सकते हैं या आप नहीं हो सकते हैं।
दूसरी समस्या एक कठिन शोस्टॉपर है : मूल्यों को खोजना बहुत आसान है, लेकिन बहुत बार वे केवल एक निर्मित घड़ी स्रोत के रूप में मौजूद नहीं होते हैं। यह Farnell का अनुनाद वेब पेज है जिसमें केवल 5.6 MHz और 11.2 MHz दोनों का अभाव है।
इसे दरकिनार करने के लिए हम उपलब्ध अनुनादक मानों को देख सकते हैं और कुछ और पता लगा सकते हैं जिनका उपयोग बिल्कुल वांछित मान उत्पन्न करने के लिए किया जा सकता है। यदि हम 56 को 4 से विभाजित करते हैं तो हमें 14 मिलते हैं और सौभाग्य से एक 14 मेगाहर्ट्ज का गुंजयमान यंत्र है। यह हमें अधिक उच्च गति और अधिक शक्ति प्रदान करता है और रजिस्टर मूल्य खोजने के लिए समान रूप से आसान है। ISR को प्रति सेकंड 112,000 बार कॉल करने के लिए हमें OCR रजिस्टर में दशमलव 124 या हेक्साडेसिमल 0x7C का मान डालने की आवश्यकता होती है, इसलिए ISR को कॉल करने के लिए 124 चक्र + 1 की गिनती के साथ, हमें अपना वांछित सही मूल्य मिलता है।
एनबी
- ISR - इंटरप्ट सर्विस रूटीन (यह वह कोड है जो केवल उत्पन्न इंटरप्ट पर निष्पादित होता है)
- आपका प्रोग्राम कितना बड़ा हो सकता है यह मेमोरी साइज़ पर निर्भर करता है! इसका घड़ी की गति से कोई लेना-देना नहीं है और इसका इस बात से कोई लेना-देना नहीं है कि आप ISR को कितनी बार कहते हैं।
जब माइक्रोकंट्रोलर प्रोग्राम कमांड से शुरू होता है तो एक काउंटर बढ़ जाता है। यदि एक बाधा उत्पन्न होती है, तो ISR कहा जाता है और यह मान एक विशेष रजिस्टर में संग्रहीत किया जाता है। जब ISR कोड पूरा हो जाता है, तो प्रोग्राम काउंटर के मूल्य को इस विशेष रजिस्टर से बहाल कर दिया जाता है और कार्यक्रम जारी रहता है जहां से यह बाधित हुआ था जैसे कि यह कभी नहीं हुआ था।
मैं एक बेहद गूंगा-नीचे उदाहरण दूंगा। यदि आप एक शुद्धतावादी हैं, तो मैं आपको चेतावनी देता हूं: नाक और आंखों से रक्तस्राव हो सकता है।
सोचिए आपको कहीं से कहीं चलना है। चरण-दर-चरण मार्ग निर्देश आपके मुख्य कार्यक्रम और इसके आदेश हैं। आप कितनी तेजी से चलते हैं या दौड़ते हैं, यह आपकी "क्लॉक स्पीड" पर निर्भर करता है, लेकिन मार्ग के निर्देशों पर नहीं (30 कदम आगे, 1 मोड़ 90 ग्रेड। बाएं, 10 कदम आगे, 45 ग्रेड पर। दाएँ, आदि) वे हमेशा समान होते हैं। । अब एक छोटे से बच्चे की कल्पना करें या एक लालची भ्रष्ट स्थानीय राजनेता आपके जूते अब और फिर से खोल दें। यह वह घटना है जो एक व्यवधान उत्पन्न करती है। फिर आप अपने अंतिम चरण के बाद रुक जाएं, फिर से अपना जूता मोड़ें। यह आपका ISR प्रोग्राम है।
फिर आप उस स्थान से जारी रखते हैं जिसे आपने रोका है; आप शुरू से शुरू नहीं करते हैं। जब आप दुनिया में हर समय और बिना किसी परवाह के चलते हैं, तो आपको परवाह नहीं है, भले ही आपको अपना जूता हर दूसरे कदम पर बांधना पड़े। यदि आप इसे समय की कमी के साथ करते हैं, जैसे ओलंपिक में 100 मीटर दौड़ना (या भूखे मांस खाने वाले शिकारी से दौड़ना), तो आपके जूते को रोकना और बाँधना गंभीर परिणाम हो सकता है। वही माइक्रोकंट्रोलर के साथ है। यहां तक कि अगर आप कोड की केवल एक पंक्ति को निष्पादित करते हैं, तो आपका कार्यक्रम जारी रहेगा, भले ही वह धीमा हो। यदि आप गति के बारे में बिल्कुल परवाह नहीं करते हैं, तो यह समस्या नहीं होगी। यदि आपको कुछ समय संबंधित करना है, जैसे अन्य टाइमर पर निर्भर क्रियाओं का उपयोग करना, हस्तक्षेप बहुत अवांछित और समस्याग्रस्त हो सकता है।
थोड़ा ही काफी है! एक तेज घड़ी हमेशा बेहतर नहीं होती है। धीमी गति से चलने वाले उपकरण काफी कम बिजली का उपयोग करते हैं। बैटरी से चलने वाले उपकरण में यह एक महत्वपूर्ण बिंदु हो सकता है।
आवश्यक सूत्र इस सूत्र से लिए गए हैं:
(घड़ी की गति / (प्रिस्कलर मूल्य * आवश्यक ISR कॉलिंग आवृत्ति)) - 1