विषयसूची:

एवीआर असेंबलर ट्यूटोरियल 7: 12 कदम
एवीआर असेंबलर ट्यूटोरियल 7: 12 कदम

वीडियो: एवीआर असेंबलर ट्यूटोरियल 7: 12 कदम

वीडियो: एवीआर असेंबलर ट्यूटोरियल 7: 12 कदम
वीडियो: AVR Ассемблер. Урок 12. 1-Wire. AVR Assembler. Lesson 12. 1-Wire. 2024, जुलाई
Anonim
एवीआर असेंबलर ट्यूटोरियल 7
एवीआर असेंबलर ट्यूटोरियल 7

ट्यूटोरियल 7 में आपका स्वागत है!

आज हम पहले यह दिखाने जा रहे हैं कि कीपैड को कैसे साफ किया जाता है, और फिर कीपैड के साथ संचार करने के लिए एनालॉग इनपुट पोर्ट का उपयोग कैसे किया जाता है। हम इसे इंटरप्ट और इनपुट के रूप में एक तार का उपयोग करके करेंगे। हम कीपैड को तार देंगे ताकि प्रत्येक कीप्रेस एनालॉग इनपुट को एक अद्वितीय वोल्टेज भेजे जो हमें उस वोल्टेज से अंतर करने की अनुमति देगा जिसे दबाया गया था। फिर हम अपने रजिस्टर विश्लेषक को दबाए गए नंबर को यह दिखाने के लिए आउटपुट करेंगे कि सब कुछ वैसा ही हो रहा है जैसा होना चाहिए। ATmega328p में एनालॉग टू डिजिटल कन्वर्टर (ADC) का उपयोग करते समय आप कई नुकसान उठा सकते हैं और इसलिए हम करेंगे रास्ते में चीजों को कुछ चरणों में लेने की कोशिश करें और पता करें कि उनसे कैसे बचा जाए। हम यह भी देखेंगे कि एनालॉग से डिजिटल कनवर्टर का उपयोग करना कीपैड को नियंत्रित करने का सबसे अच्छा तरीका क्यों नहीं है, भले ही यह आपके माइक्रोकंट्रोलर पर कम पोर्ट का उपयोग करता हो। इस ट्यूटोरियल में आपको आवश्यकता होगी:

  1. एक कीपैड। आप एक खरीद सकते हैं या आप वही कर सकते हैं जो मैंने किया और एक को परिमार्जन किया।
  2. कीपैड के लिए 2 महिला हेडर (यदि आप एक की सफाई कर रहे हैं)
  3. कनेक्टिंग तार
  4. एक ब्रेडबोर्ड
  5. 4 1 कोहम प्रतिरोधक
  6. १ १५ कोहम रोकनेवाला
  7. 1 3.3 कोहम रोकनेवाला
  8. १ १८० ओम रोकनेवाला
  9. १ ६८० ओम रोकनेवाला
  10. एक डिजिटल मल्टीमीटर
  11. ट्यूटोरियल 5. से आपका विश्लेषक

यदि आपके पास पहले से ही एक कीपैड है और उसे साफ करने की आवश्यकता नहीं है, तो आप पहले कुछ चरणों को छोड़ना चाह सकते हैं।

यहाँ मेरे AVR असेंबलर ट्यूटोरियल के संपूर्ण संग्रह का लिंक दिया गया है:

चरण 1: कीपैड को साफ करें 1

कीपैड को साफ करें 1
कीपैड को साफ करें 1
कीपैड को साफ करें 1
कीपैड को साफ करें 1
कीपैड को साफ करें 1
कीपैड को साफ करें 1
कीपैड को साफ करें 1
कीपैड को साफ करें 1

बहुत पहले, जब आपके दादा-दादी भी केवल बच्चे थे, लोग इन अजीब दिखने वाले उपकरणों का उपयोग करते थे, जिनमें एक दूसरे के साथ संवाद करने के लिए दीवार में लंबे केबल लगे होते थे। उन्हें "टेलीफोन" कहा जाता था और आमतौर पर सस्ते प्लास्टिक की चीजें होती थीं जो किसी को आपको बुलाए जाने पर परेशान करती थीं (ऐसा नहीं है कि आज के "जस्टिन बीबर" रिंगटोन समान रूप से परेशान नहीं हैं)। किसी भी स्थिति में, इन उपकरणों में कीपैड थे जो बहुत ही सरल रूप से वायर्ड थे और इसलिए मैला करना आसान है और उन पर 2 अतिरिक्त कुंजियाँ हैं ("रीडायल" और "फ़्लैश") कीपैड से आप खरीद सकते हैं जिसे आप पुन: उपयोग करना चाहते हैं जैसे "तीर कुंजियाँ", "मेनू कुंजियाँ", या कुछ और। सबसे पहले फोन लें (मैं जीई का उपयोग करता हूं जैसा कि चित्रों में दिखाया गया है) और वायरिंग को प्रकट करने के लिए इसे अलग करें। फिर एक छेनी लें और कीपैड को पकड़े हुए प्लास्टिक के छोटे नॉब्स को स्नैप करें और कीपैड को हटा दें।

चरण 2: कीपैड को साफ करें 2

एक कीपैड परिमार्जन करें 2
एक कीपैड परिमार्जन करें 2
एक कीपैड परिमार्जन करें 2
एक कीपैड परिमार्जन करें 2
एक कीपैड परिमार्जन करें 2
एक कीपैड परिमार्जन करें 2

अब एक पीवीसी आरी लें और कीहोल के चारों ओर से प्लास्टिक को काट लें और फिर एक पतले कीपैड को छोड़कर गहराई को प्राप्त करने के लिए किनारे के चारों ओर काट लें।

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

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

वैसे भी एक बार जब आप फोन को नष्ट कर देते हैं और भागों को साफ कर देते हैं तो हम अपना कीपैड बनाना समाप्त कर देंगे।

चरण 3: कीपैड को साफ करें 3

एक कीपैड परिमार्जन करें 3
एक कीपैड परिमार्जन करें 3
एक कीपैड परिमार्जन करें 3
एक कीपैड परिमार्जन करें 3
एक कीपैड परिमार्जन करें 3
एक कीपैड परिमार्जन करें 3

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

अब जब हेडर संलग्न हो गए हैं तो आप इसे ब्रेडबोर्ड से तार कर सकते हैं, एक मल्टीमीटर ले सकते हैं, और मल्टीमीटर को रैंडम पिन पर चिपकाकर और प्रतिरोध को मापकर चाबियों का परीक्षण कर सकते हैं। यह आपको चाबियों को मैप करने की अनुमति देगा। सर्किट को देखकर यह देखना मुश्किल है कि कैसे चाबियों को आउटपुट में तार दिया जाता है, लेकिन यदि आप एक मल्टीमीटर का उपयोग करते हैं तो आप इसे किसी भी दो पिन में प्लग कर सकते हैं और तब तक बटन दबा सकते हैं जब तक कि आप एक खुले सर्किट के बजाय स्क्रीन पर एक नंबर नहीं देखते हैं।. यह उस कुंजी का पिनआउट होगा।

इस तरह से आउटपुट पिन की सभी कुंजियों को मैप करें।

चरण 4: कीपैड को तार दें

कीपैड को तार दें
कीपैड को तार दें
कीपैड को तार दें
कीपैड को तार दें

अब वायरिंग आरेख का पालन करें और कीपैड को अपने ब्रेडबोर्ड पर तार दें।

यह कैसे काम करने वाला है, हम 5V को बाईं ओर और दाईं ओर GND में डाल देंगे। आरेख में दाईं ओर पहला पिन Atmega328p माइक्रोकंट्रोलर पर हमारे पहले एनालॉग पिन में जाता है। जब कोई बटन नहीं दबाया जाता है तो सिग्नल 0V होगा, और जब प्रत्येक अलग-अलग बटन दबाए जाते हैं तो एनालॉग पोर्ट में इनपुट 0V और 5V के बीच एक अलग राशि के साथ होगा, जिसके आधार पर कुंजी को दबाया गया था। हमने रोकनेवाला मान चुना ताकि प्रत्येक पथ में एक प्रतिरोध हो जो बाकी से अलग था। माइक्रोकंट्रोलर पर एनालॉग पोर्ट एक एनालॉग सिग्नल लेता है और इसे 0V और 5V के बीच 1024 विभिन्न चैनलों में विभाजित करता है। इसका मतलब है कि प्रत्येक चैनल की चौड़ाई 5V/1024 = 0.005 V/चैनल = 5 mV/चैनल है। तो एनालॉग पोर्ट इनपुट वोल्टेज को तब तक अलग कर सकता है जब तक वे 5 एमवी से अधिक भिन्न होते हैं। हमारे मामले में हमने प्रतिरोधक मानों को चुना है ताकि कोई भी दो कीप्रेस एक वोल्टेज सिग्नल भेजे जो इससे अधिक भिन्न हो ताकि माइक्रोकंट्रोलर आसानी से यह तय करने में सक्षम हो कि कौन सी कुंजी दबाई गई थी। बड़ी समस्या यह है कि पूरी प्रणाली बहुत शोर है इसलिए हमें प्रत्येक बटन प्रेस को मैप करने के लिए वोल्टेज की एक श्रृंखला चुनने की आवश्यकता होगी - लेकिन हम थोड़ी देर बाद उस पर पहुंचेंगे।

ध्यान दें कि हम नियंत्रक को केवल एक इनपुट लाइन का उपयोग करके 14 बटन कीपैड को नियंत्रित करने में सक्षम हैं। यह एनालॉग इनपुट के उपयोगी पहलुओं में से एक है।

अब कीपैड को नियंत्रित करने का हमारा पहला प्रयास एक कीप्रेस को बाधित करने का होगा, इंटरप्ट सबरूटीन एनालॉग इनपुट पोर्ट को पढ़ेगा और तय करेगा कि कौन सी कुंजी दबाई गई थी, और फिर यह उस नंबर को हमारे रजिस्टर एनालाइज़र सबरूटीन को आउटपुट करेगा जो प्रदर्शित करेगा हमारे 8 एल ई डी पर बाइनरी में महत्वपूर्ण मूल्य जिसे हमने ट्यूटोरियल 5 में स्थापित किया है।

चरण 5: कीपैड को अपने विश्लेषक को तार दें

कीपैड को अपने एनालाइज़र से वायर करें
कीपैड को अपने एनालाइज़र से वायर करें
कीपैड को अपने एनालाइज़र से वायर करें
कीपैड को अपने एनालाइज़र से वायर करें

चित्र दिखाते हैं कि हम कीपैड को माइक्रोकंट्रोलर से कैसे वायर करना चाहते हैं ताकि हम अपने एनालाइज़र डिस्प्ले पर आउटपुट देख सकें। अनिवार्य रूप से हम केवल कीपैड से आउटपुट को पोर्टसी पिन 0 पर वायर करते हैं, जिसे ATmega328P पर ADC0 भी कहा जाता है।

हालांकि, कुछ अतिरिक्त चीजें हैं। हम PD2 में एक बटन भी वायर करने जा रहे हैं। अर्थात। अपने 5V रेल से एक बटन और बटन के दूसरी तरफ से PD2 तक एक तार लें, और अंत में, हम अपने 5V रेल से AREF पिन को डिस्कनेक्ट करना चाहते हैं और इसके बजाय इसे डिस्कनेक्ट कर देना चाहते हैं। हम चाहें तो 0.1 माइक्रोफ़ारड डिकूपिंग कैपेसिटर लगा सकते हैं। यह एक सिरेमिक कैपेसिटर है जिस पर 104 लिखा होता है। पहले दो अंक संख्या हैं और अंतिम अंक 10 की शक्ति है जिसे हम पिकोफैराड में उत्तर प्राप्त करने के लिए गुणा करते हैं (पिको का अर्थ 10 ^ -12), तो 104 का अर्थ 10 x 10 ^ 4 पिकोफैराड है, जो समान है १०० नैनोफ़ारड (नैनो का अर्थ १०^-९), जो कि ०.१ माइक्रोफ़ारड (सूक्ष्म का अर्थ १०^-६) के समान है। वैसे भी, यह सब एआरईएफ पिन को स्थिर करता है जब हम इसे अपने संदर्भ पिन के रूप में उपयोग कर सकते हैं।

हम PD2 और जमीन के बीच 1 Mohm रोकनेवाला भी चाहते हैं। हम PD2 को 0V पर आउटपुट पिन के रूप में सेट करने जा रहे हैं और हम उस पिन पर एक सकारात्मक किनारे पर ट्रिगर करेंगे। हम चाहते हैं कि जब हम बटन छोड़ते हैं तो किनारे तुरंत गायब हो जाते हैं इसलिए हम इस "पुल डाउन" रोकनेवाला को सम्मिलित करेंगे।

हम बटन चाहते हैं इसका कारण यह है कि हम चिप पर अपने एनालॉग-टू-डिजिटल कनवर्टर को पिन INT0 से ट्रिगर करना चाहते हैं, जो कि PD2 भी है। आखिरकार हम चाहते हैं कि कीप्रेस दोनों एडीसी को ट्रिगर करें और एक अलग बटन के बिना परिवर्तित होने के लिए इनपुट भी प्रदान करें, लेकिन समय के काम करने के तरीके के कारण हम एडीसी को ट्रिगर करने के लिए एक अलग बटन लगाकर शुरू करेंगे और एक बार जब हम सभी को आयरन कर देंगे बग बाहर हैं और आश्वस्त हैं कि सब कुछ ठीक से काम कर रहा है, तो हम उसी बटन प्रेस से ट्रिगरिंग के साथ आने वाले शोर और समय के मुद्दों से निपटेंगे जिसे हम पढ़ना चाहते हैं।

तो, अभी के लिए, जिस तरह से यह काम करता है, हम एक कुंजी दबाए रखेंगे, फिर एडीसी को ट्रिगर करने के लिए बटन दबाएंगे, और फिर जाने दें और उम्मीद है कि हमारे द्वारा दबाए गए बटन का बाइनरी मान विश्लेषक पर दिखाई देगा।

तो चलिए कुछ कोड लिखते हैं जो इसे पूरा करेंगे।

चरण 6: हमें कौन से टॉगल स्विच सेट करने चाहिए?

हमें कौन से टॉगल स्विच सेट करने चाहिए?
हमें कौन से टॉगल स्विच सेट करने चाहिए?

आइए पहले सोचें कि हम इसे कैसे कोडित करने जा रहे हैं ताकि नियंत्रक कीपैड से इनपुट को पढ़ सके और इसे दबाए गए बटन के अनुरूप संख्यात्मक मान में बदल सके। हम एनालॉग टू डिजिटल कन्वर्टर (एडीसी) का उपयोग करने जा रहे हैं। जिसे Atmega328p में बनाया गया है। हम अपने संदर्भ वोल्टेज के रूप में AREF का उपयोग करेंगे और हमारा कीपैड आउटपुट PortC0 या PC0 से जुड़ा होगा। ध्यान दें कि एनालॉग-टू-डिजिटल कन्वर्टर 0 के लिए इस पिन को ADC0 भी कहा जाता है। ATmega328P के लिए इंटरप्ट पर धारा 12.4 और एनालॉग-टू-डिजिटल कन्वर्टर पर अध्याय 24 को पढ़ने से पहले आपके लिए यह एक अच्छा विचार हो सकता है। शुरू किया है या कम से कम उन वर्गों को संदर्भ के लिए तैयार किया है। माइक्रोकंट्रोलर को स्थापित करने के लिए ताकि यह जान सके कि एनालॉग इनपुट सिग्नल के साथ क्या करना है, और हमारे प्रोग्राम के साथ कैसे इंटरैक्ट करना है, हमें पहले विभिन्न एडीसी में से कुछ सेट करना होगा संबंधित रजिस्टर बिट्स। ये अनिवार्य रूप से पहले कंप्यूटर पर पुराने टॉगल स्विच के बराबर हैं। आप या तो एक स्विच को चालू या बंद करते हैं, या आगे भी आप एक आउटलेट और दूसरे के बीच केबलों में प्लग लगाते हैं ताकि सड़क में उस कांटे तक पहुंचने वाले इलेक्ट्रॉनों को एक गेट बंद हो और दूसरा खुला हो जो इसे भूलभुलैया में एक अलग रास्ते पर मजबूर कर दे। सर्किटरी और इस प्रकार एक अलग तार्किक कार्य करना। असेंबली भाषा में कोडिंग करते समय हमारे पास माइक्रोकंट्रोलर के इन कार्यों तक पहुंच होती है जो पहली जगह में इसे करने के बारे में आकर्षक चीजों में से एक है। यह अधिक "हाथों पर" है और "पर्दे के पीछे" बहुत कम चल रहा है जैसा कि यह था। तो इन रजिस्टरों को एक कठिन काम के रूप में स्थापित करने के बारे में मत सोचो। यह वही है जो असेंबली भाषा को दिलचस्प बनाता है! हम चिप के आंतरिक कामकाज और तर्क के साथ एक बहुत ही व्यक्तिगत संबंध प्राप्त कर रहे हैं और इसे ठीक वही कर रहे हैं जो हम चाहते हैं - न अधिक और न ही कम। कोई व्यर्थ घड़ी चक्र नहीं। तो यहां उन स्विच की सूची दी गई है जिन्हें हमें सेट करने की आवश्यकता है:

  1. पावर रिडक्शन एडीसी बिट, पीआरएडीसी, जो कि पीआरआर रजिस्टर का बिट 0 है, को बंद कर दें, क्योंकि अगर यह बिट चालू है तो एडीसी बंद हो जाएगा। बिजली कटौती रजिस्टर अनिवार्य रूप से विभिन्न चीजों को बंद करने का एक तरीका है जो बिजली का उपयोग करते हैं जब आपको उनकी आवश्यकता नहीं होती है। चूंकि हम एडीसी का उपयोग कर रहे हैं, इसलिए हम यह सुनिश्चित करना चाहते हैं कि यह इस तरह से अक्षम न हो। (देखें पीआरएडीसी पृष्ठ ४६ पर)
  2. ADC बहुसंकेतक चयन (ADMUX) रजिस्टर में MUX3…0 को बंद करके ADC0 होने के लिए एनालॉग इनपुट चैनल का चयन करें (तालिका २४-४ पृष्ठ २४९ देखें) ये पहले से ही डिफ़ॉल्ट रूप से बंद हैं इसलिए हमें वास्तव में ऐसा करने की आवश्यकता नहीं है। हालाँकि, मैं इसे शामिल कर रहा हूँ क्योंकि यदि आप कभी भी ADC0 के अलावा किसी अन्य पोर्ट का उपयोग करते हैं, तो आपको तदनुसार इन स्विच को चालू करना होगा। MUX3, MUX2, MUX1, MUX0 के विभिन्न संयोजन आपको अपने इनपुट के रूप में किसी भी एनालॉग पोर्ट का उपयोग करने की अनुमति देते हैं और यदि आप एक ही बार में विभिन्न एनालॉग संकेतों का एक समूह देखना चाहते हैं, तो आप इन्हें तुरंत बदल भी सकते हैं।
  3. ADMUX रजिस्टर में REFS0 और REFS1 बिट्स को बंद कर दें ताकि हम AREF को आंतरिक संदर्भ के बजाय अपने संदर्भ वोल्टेज के रूप में उपयोग करें (देखें पृष्ठ २४८)।
  4. ADMUX में ADLAR बिट चालू करें ताकि परिणाम "बाएं समायोजित" हो, हम अगले चरण में इस विकल्प पर चर्चा करेंगे।
  5. PC0 में डिजिटल इनपुट को बंद करने के लिए ADC0D बिट को डिजिटल इनपुट डिसेबल रजिस्टर (DIDR0) में सेट करें। हम उस पोर्ट का उपयोग एनालॉग इनपुट के लिए कर रहे हैं ताकि हम इसके लिए डिजिटल इनपुट को अक्षम कर सकें।
  6. ISC0 और ISC1 को बाहरी व्यवधान नियंत्रण रजिस्टर A (EICRA) में यह इंगित करने के लिए सेट करें कि हम INT0 पिन (PD2) को वोल्टेज सिग्नल के बढ़ते किनारे पर ट्रिगर करना चाहते हैं, पृष्ठ 71 देखें।
  7. बाहरी इंटरप्ट मास्क रजिस्टर (ईआईएमएसके) में स्पष्ट बिट्स INT0 और INT1 यह इंगित करने के लिए कि हम इस पिन पर इंटरप्ट का उपयोग नहीं कर रहे हैं। अगर हम इस पिन पर इंटरप्ट को सक्षम करना चाहते हैं तो हमें 0x0002 पते पर एक इंटरप्ट हैंडलर की आवश्यकता होगी, लेकिन इसके बजाय हम इसे सेट कर रहे हैं ताकि इस पिन पर एक सिग्नल एडीसी रूपांतरण को ट्रिगर करे, जिसके पूरा होने पर एडीसी रूपांतरण पूर्ण इंटरप्ट द्वारा नियंत्रित किया जाता है। पता 0x002A. पृष्ठ 72 देखें।
  8. एडीसी को सक्षम करने के लिए एडीसी नियंत्रण और स्थिति रजिस्टर ए (एडीसीएसआरए) में एडीसी सक्षम (एडीईएन) बिट (बिट 7) सेट करें। पृष्ठ २४९ देखें।
  9. हम हर बार जब हम एनालॉग सिग्नल को पढ़ना चाहते थे तो एडीसी स्टार्ट कनवर्ज़न बिट (एडीएससी) सेट करके एक ही रूपांतरण शुरू कर सकते थे, हालांकि, अब जब भी कोई बटन दबाता है तो हम इसे स्वचालित रूप से पढ़ेंगे, इसलिए इसके बजाय हम एडीसी को सक्षम करेंगे ADCSRA रजिस्टर में ऑटोट्रिगर इनेबल (ADATE) बिट ताकि ट्रिगरिंग अपने आप हो जाए।
  10. हम ADPS2..0 बिट्स (AD Prescalar बिट्स) को 111 पर भी सेट करते हैं ताकि ADC घड़ी CPU घड़ी 128 के कारक से विभाजित हो।
  11. हम PD2 होने के लिए ADC ट्रिगरिंग के स्रोत का चयन करेंगे जिसे INT0 (बाहरी व्यवधान अनुरोध 0) भी कहा जाता है। हम एडीसीएसआरबी रजिस्टर में विभिन्न बिट्स को टॉगल करके ऐसा करते हैं (पृष्ठ 251 पर तालिका 24-6 देखें)। हम तालिका से देखते हैं कि हम ADTS0 बंद, ADTS1 चालू और ADTS2 बंद करना चाहते हैं ताकि ADC उस पिन को चालू कर दे। ध्यान दें कि अगर हम लगातार एनालॉग पोर्ट का नमूना लेना चाहते हैं जैसे कि हम कुछ निरंतर एनालॉग सिग्नल (जैसे ध्वनि नमूनाकरण या कुछ) पढ़ रहे थे, तो हम इसे फ्री रनिंग मोड पर सेट कर देंगे। PD2 पर ट्रिगरिंग सेट करने के लिए हम जिस विधि का उपयोग कर रहे हैं, वह बिना किसी रुकावट के एनालॉग पोर्ट PC0 की ADC रीडिंग को ट्रिगर करती है। रूपांतरण पूरा होने पर रुकावट आएगी।
  12. ADCSRA रजिस्टर में ADC इंटरप्ट इनेबल (ADIE) बिट को सक्षम करें ताकि जब डिजिटल रूपांतरण का एनालॉग पूरा हो जाए तो यह एक इंटरप्ट उत्पन्न करेगा जिसके लिए हम एक इंटरप्ट हैंडलर लिख सकते हैं और.org 0x002A पर डाल सकते हैं।
  13. इंटरप्ट को सक्षम करने के लिए SREG में I बिट सेट करें।

अभ्यास 1: सुनिश्चित करें कि आपने उपरोक्त प्रत्येक सेटिंग के लिए डेटाशीट में संबंधित अनुभागों को पढ़ा है ताकि आप समझ सकें कि क्या हो रहा है और यदि हम उन्हें वैकल्पिक सेटिंग्स में बदल दें तो क्या होगा।

चरण 7: इंटरप्ट हैंडलर लिखें

अंतिम चरण में हमने देखा कि हमने इसे सेट किया है ताकि PD2 पर पाया गया एक उभरता हुआ किनारा PC0 पर डिजिटल रूपांतरण के लिए एक एनालॉग को ट्रिगर करेगा और जब यह रूपांतरण पूरा हो जाएगा तो यह ADC रूपांतरण पूर्ण रुकावट को फेंक देगा। अब हम इस रुकावट के साथ कुछ करना चाहते हैं। यदि आप पृष्ठ ६५ पर तालिका १२-६ की जांच करते हैं तो आपको संभावित व्यवधानों की एक सूची दिखाई देगी। हम पहले से ही 0x0000 पते पर रीसेट इंटरप्ट और पिछले ट्यूटोरियल में पता 0x0020 पर टाइमर/काउंटर0 ओवरफ्लो इंटरप्ट देख चुके हैं। अब हम एडीसी इंटरप्ट को देखना चाहते हैं जिसे हम तालिका द्वारा देखते हैं, पता 0x002A पर है। तो हमारे असेंबली भाषा कोड की शुरुआत में हमें एक पंक्ति की आवश्यकता होगी जो पढ़ती है:

.org 0x002Arjmp ADC_int

जो एडीसी द्वारा रूपांतरण पूरा करने पर ADC_int लेबल वाले हमारे इंटरप्ट हैंडलर पर कूद जाएगा। तो हमें अपने इंटरप्ट हैंडलर को कैसे लिखना चाहिए? जिस तरह से एडीसी काम करता है वह निम्नलिखित गणना कर रहा है:

एडीसी = विन x १०२४ / Vref

तो चलिए देखते हैं कि अगर मैं कीपैड पर "रीडायल" बटन दबाता हूं तो क्या होता है। उस स्थिति में PC0 पर वोल्टेज कुछ मान में बदल जाएगा, जैसे कि 1.52V, और चूंकि Vref 5V पर है, हमारे पास होगा:

एडीसी = (१.५२ वी) x १०२४ / ५वी = ३११.२९६

और इसलिए यह 311 के रूप में दिखाई देगा। अगर हम इसे वापस वोल्टेज में बदलना चाहते हैं तो हम गणना को उलट देंगे। हालाँकि हमें ऐसा करने की आवश्यकता नहीं होगी क्योंकि हम वास्तविक वोल्टेज में केवल उनके बीच अंतर करने में रुचि नहीं रखते हैं। जब रूपांतरण समाप्त हो जाता है, तो परिणाम एडीसीएच और एडीसीएल रजिस्टरों में रखे गए 10-बिट नंबर में संग्रहीत किया जाता है और हमने इसे "बाएं समायोजित" किया है जिसका अर्थ है कि 10-बिट्स एडीसीएच के बिट 7 से शुरू होते हैं और नीचे जाते हैं ADCL के बिट 6 (इन दो रजिस्टरों में कुल 16 बिट हैं और हम उनमें से केवल 10 का उपयोग करते हैं, यानी 1024 चैनल)। यदि हम ADMUX रजिस्टर में ADLAR बिट को साफ़ करके चाहते तो हम परिणाम "सही समायोजित" कर सकते थे। इसका कारण यह है कि हम समायोजित छोड़ दिया चुनते हैं क्योंकि हमारे सिग्नल काफी दूर हैं कि चैनल संख्या के अंतिम दो अंक प्रासंगिक नहीं हैं और शायद केवल शोर हैं इसलिए हम केवल ऊपरी 8 अंकों का उपयोग करके कीप्रेस को अलग करेंगे, दूसरे शब्दों में, हमें केवल ADCH को देखने की आवश्यकता होगी कि कौन सा बटन दबाया गया था। इसलिए हमारे इंटरप्ट हैंडलर को केवल ADCH से बाहर की संख्या को पढ़ना चाहिए। रजिस्टर करें, उस नंबर को कीपैड मान में बदलें, और फिर उस मान को हमारे रजिस्टर विश्लेषक एलईडी को भेजें ताकि हम यह सत्यापित कर सकें कि "9" कहने पर, एलईडी के अनुरूप "00001001" को प्रकाश में लाया जाएगा। इससे पहले कि हम उस पर जाएं हालांकि हमें पहले यह देखना होगा कि जब हम विभिन्न बटन दबाते हैं तो ADCH में क्या दिखाई देता है। तो चलिए बस एक साधारण इंटरप्ट हैंडलर लिखते हैं जो ADCH की सामग्री को एनालाइज़र डिस्प्ले पर भेजता है। तो यहाँ हमें क्या चाहिए:

ADC_int:lds विश्लेषक, ADCH; ADCH का मान हमारे एनालाइज़रबी EIFR, 0 में लोड करें; बाहरी रुकावट ध्वज को साफ़ करें ताकि वह फिर से जाने के लिए तैयार हो

अब तक, आप ट्यूटोरियल 5 में हमारे विश्लेषक से कोड को कॉपी करने और इस इंटरप्ट और टॉगल सेटिंग्स को जोड़ने और इसे चलाने में सक्षम होना चाहिए। अभ्यास 2: कोड लिखें और उसे चलाएँ। देखें कि आप ADCH को अपने एनालाइज़र डिस्प्ले पर प्रदर्शित कर रहे हैं। एक ही कीप्रेस को कई बार पुश करने का प्रयास करें। क्या आपको ADCH में हमेशा समान मान मिलता है?

चरण 8: कीप्रेस मानों को मैप करें

कीप्रेस वैल्यू को मैप करें
कीप्रेस वैल्यू को मैप करें

अब हमें जो करना है वह ADCH में मानों को दबाए गए कुंजी के अनुरूप संख्याओं में परिवर्तित करना है। हम प्रत्येक कीप्रेस के लिए ADCH की सामग्री को लिखकर और फिर उसे दशमलव संख्या में परिवर्तित करके ऐसा करते हैं जैसे मैंने चित्र में किया था। हमारे इंटरप्ट हैंडलिंग रूटीन में हम प्रत्येक कीप्रेस के अनुरूप मूल्यों की एक पूरी श्रृंखला पर विचार करेंगे ताकि एडीसी उस सीमा में किसी दिए गए कीप्रेस पर कुछ भी मैप कर सके।

व्यायाम ३: इस मानचित्रण को करें और फिर अपने एडीसी इंटरप्ट रूटीन को फिर से लिखें।

यहाँ मुझे मेरे लिए मिला है (आपका बहुत अलग होगा)। ध्यान दें कि मैंने इसे प्रत्येक कीप्रेस के लिए कई मानों के साथ सेट किया है।

एडीसी_इंट:; बाहरी इंटरप्ट हैंडलरक्लर विश्लेषक; नए नंबर के लिए तैयार करेंबटनH, ADCH; जब ADCH पढ़ा जाता है तो ADC अपडेट होता है clccpi buttonH, 240brlo PC+3; यदि ADCH बड़ा है तो यह 1ldi विश्लेषक है, 1; इसलिए विश्लेषक को 1rjmp रिटर्न के साथ लोड करें; और clccpi बटन एच, 230 लौटाएं; अगर ADCH बड़ा है तो 2brlo PC+3ldi एनालाइज़र, 2rjmp रिटर्न clccpi बटनH, 217brlo PC+3ldi एनालाइज़र, 3rjmp रिटर्न clccpi बटनH, 203brlo PC+3ldi एनालाइज़र, 4rjmp रिटर्न clccpi buttonH, 187brlo PC+3ldi एनालाइज़र, 5rjmp रिटर्न, cl 155brlo PC+3ldi एनालाइज़र, 6rjmp रिटर्न clccpi buttonH, 127brlo PC+3ldi एनालाइज़र, 255; हम सभी onrjmp रिटर्न clccpi बटनH, 115brlo PC+3ldi एनालाइज़र, 7rjmp रिटर्न clccpi बटनH, 94brlo PC+3ldi एनालाइज़र, 8rjmp रिटर्न clccpi बटनH, 62brlo PC+3ldi एनालाइज़र, 9rjmp रिटर्न clccpi बटनH, 37brlo PC+3ldi के रूप में फ़्लैश सेट करेंगे। 0b11110000; तारांकन शीर्ष आधा onrjmp रिटर्न clccpi बटनH, 28brlo PC+3ldi विश्लेषक, 0rjmp रिटर्न clccpi बटनH, 17brlo PC+3ldi विश्लेषक, 0b00001111 है; हैश साइन नीचे आधा है onrjmp रिटर्न clccpi buttonH, 5brlo PC+3ldi विश्लेषक, 0b11000011; रीडायल टॉप 2 बॉटम 2rjmp रिटर्न एलडीआई एनालाइजर है, 0b11011011; अन्यथा त्रुटि हुई वापसी: रेटी

चरण 9: संस्करण 1 के लिए कोड और वीडियो

मैंने कीपैड ड्राइवर के इस पहले संस्करण के लिए अपना कोड संलग्न किया है। इसमें आपको की को पुश करना होता है और फिर बटन को पुश करना होता है ताकि एडीसी कीपैड से इनपुट को पढ़ सके। इसके बजाय हमारे पास कोई बटन नहीं है बल्कि इसके बजाय रूपांतरण करने का संकेत कीप्रेस से ही आता है। व्यायाम 3: इस कोड को इकट्ठा करें और अपलोड करें और इसे आज़माएं। आपको अपने कीप्रेस वोल्टेज के अनुरूप विभिन्न रूपांतरण थ्रेशोल्ड को बदलना पड़ सकता है क्योंकि वे संभवतः मेरे से भिन्न हैं। यदि आप बटन के बजाय ADC0 और बाहरी इंटरप्ट पिन दोनों के लिए कीपैड से इनपुट का उपयोग करने का प्रयास करते हैं तो क्या होता है? मैं हमारे कीप्रेस ड्राइवर के इस पहले संस्करण के संचालन का एक वीडियो भी संलग्न करूंगा। आप देखेंगे कि मेरे कोड में स्टैक पॉइंटर को इनिशियलाइज़ करने वाला एक सेक्शन है। ऐसे कई रजिस्टर हैं जिन्हें हम स्टैक से पुश और पॉप करना चाहते हैं जब हम चर में हेरफेर कर रहे हैं और क्या नहीं और ऐसे रजिस्टर भी हैं जिन्हें हम बाद में सहेजना और पुनर्स्थापित करना चाहते हैं। उदाहरण के लिए, SREG एक रजिस्टर है जो इंटरप्ट में संरक्षित नहीं है, इसलिए संचालन के परिणामस्वरूप सेट और साफ़ किए गए विभिन्न फ़्लैग्स को बदला जा सकता है यदि किसी चीज़ के बीच में कोई रुकावट आती है। तो यह सबसे अच्छा है यदि आप SREG को इंटरप्ट हैंडलर की शुरुआत में स्टैक पर पुश करते हैं और फिर इंटरप्ट हैंडलर के अंत में इसे फिर से पॉप करते हैं। मैंने इसे कोड में यह दिखाने के लिए रखा है कि इसे कैसे आरंभ किया जाता है और यह अनुमान लगाने के लिए कि हमें बाद में इसकी आवश्यकता कैसे होगी, लेकिन चूंकि हमें परवाह नहीं है कि हमारे कोड में व्यवधान के दौरान SREG का क्या होता है, इसलिए मैंने इसके लिए स्टैक का उपयोग नहीं किया। यह भी ध्यान दें कि मैंने प्रारंभ करते समय रजिस्टरों में विभिन्न बिट्स सेट करने के लिए शिफ्ट ऑपरेशन का उपयोग किया है। उदाहरण के लिए पंक्ति में:

एलडीआई अस्थायी, (1<> एसटीएस EICRA, अस्थायी

उपरोक्त कोड की पहली पंक्ति में "<<" कमांड एक शिफ्ट ऑपरेशन है। यह अनिवार्य रूप से बाइनरी नंबर 1 लेता है, जो कि 0b00000001 है और इसे ISC01 नंबर की मात्रा से छोड़ दिया जाता है। यह EICRA रजिस्टर में ISC01 नाम के बिट की स्थिति है। चूंकि ISC01 बिट 1 है, संख्या 1 को 0b00000010 बनने के लिए बाईं ओर 1 स्थिति में स्थानांतरित कर दिया गया है। इसी तरह दूसरा, ISC00, EICRA का बिट 0 है और इसलिए नंबर 1 की शिफ्ट बाईं ओर शून्य स्थिति है। यदि आप पहले ट्यूटोरियल में डाउनलोड की गई m328Pdef.inc फ़ाइल पर एक और नज़र डालें और तब से evrr का उपयोग कर रहे हैं, तो आप देखेंगे कि यह ".equ" कथनों की एक लंबी सूची है। आप पाएंगे कि ISC01 1 के बराबर है। असेंबलर कुछ भी इकट्ठा करना शुरू करने से पहले इसके प्रत्येक उदाहरण को 1 से बदल देता है। वे मनुष्यों को कोड पढ़ने और लिखने में मदद करने के लिए रजिस्टर बिट्स के नाम हैं। अब, ऊपर दिए गए दो शिफ्ट संचालन के बीच लंबवत रेखा एक तार्किक "या" ऑपरेशन है। यहाँ समीकरण है:

0b00000010 | 0b00000001 = 0b00000011

और यही वह है जिसे हम लोड कर रहे हैं ("एलडीआई" का उपयोग करके) अस्थायी में। एक रजिस्टर में मान लोड करने के लिए लोग इस पद्धति का उपयोग करने का कारण यह है कि यह केवल एक संख्या के बजाय बिट के नाम का उपयोग करने की अनुमति देता है और इससे कोड को पढ़ना बहुत आसान हो जाता है। हमने दो अन्य तकनीकों का भी उपयोग किया है। हम "ओरी" और "एंडी" निर्देशों का उपयोग करते हैं। ये हमें रजिस्टर में किसी भी अन्य बिट को बदले बिना क्रमशः SET और CLEAR बिट्स की अनुमति देते हैं। उदाहरण के लिए, जब मैंने इस्तेमाल किया

ओरी अस्थायी, (1

यह "या" 0b00000001 के साथ अस्थायी है जो शून्य बिट में 1 डालता है और बाकी सभी को अपरिवर्तित छोड़ देता है। साथ ही जब हमने लिखा

एंडी टेम्प, 0b11111110

यह अस्थायी के शून्य बिट को 0 में बदल देता है और बाकी सभी को अपरिवर्तित छोड़ देता है।

अभ्यास 4: आपको कोड को पढ़ना चाहिए और सुनिश्चित करना चाहिए कि आप प्रत्येक पंक्ति को समझते हैं। चीजों को करने के लिए बेहतर तरीके खोजना और एक बेहतर कार्यक्रम लिखना आपको दिलचस्प लग सकता है। चीजों को कोड करने के सौ तरीके हैं और मुझे पूरा विश्वास है कि आप मेरी तुलना में बहुत बेहतर तरीका खोज सकते हैं। आप (स्वर्ग न करे!) त्रुटियां और चूक भी पा सकते हैं। उस मामले में मैं निश्चित रूप से उनके बारे में सुनना चाहूंगा ताकि उन्हें ठीक किया जा सके।

ठीक है, अब देखते हैं कि क्या हम उस फालतू बटन से छुटकारा पा सकते हैं…

चरण 10: संस्करण 2 के लिए कोड

बटन से छुटकारा पाने का सबसे सरल तरीका यह है कि इसे पूरी तरह से हटा दें, PB2 के इनपुट को भूल जाएं और ADC को "फ्री रनिंग मोड" पर स्विच करें।

दूसरे शब्दों में केवल ADCSRB रजिस्टर को बदल दें ताकि ADTS2, ADTS1, और ADTS0 सभी शून्य हो जाएं।

फिर ADCSRA में ADSC बिट को 1 पर सेट करें जो पहला रूपांतरण शुरू करेगा।

अब इसे अपने माइक्रोकंट्रोलर पर अपलोड करें और आप पाएंगे कि सही नंबर डिस्प्ले पर तब आता है जब आप बटन दबा रहे होते हैं और केवल तभी जब आप बटन दबा रहे होते हैं। ऐसा इसलिए है क्योंकि ADC लगातार ADC0 पोर्ट का नमूना ले रहा है और मान प्रदर्शित कर रहा है। जब आप बटन से अपनी उंगली हटाते हैं, तो "बटन बाउंस" कुछ यादृच्छिक मान बहुत तेज़ी से उत्पन्न करेगा और फिर यह 0V इनपुट पर वापस आ जाएगा। हमारे कोड में हमारे पास यह 0V 0b11011011 के रूप में दिखाई दे रहा है (क्योंकि कीप्रेस `0' पहले से ही 0b00000000 डिस्प्ले वैल्यू का उपयोग कर रहा है)

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

तो आइए जानते हैं एक और उपाय…

चरण 11: हम बटन से कैसे छुटकारा पा सकते हैं? संस्करण 3

हम बटन से कैसे छुटकारा पा सकते हैं? संस्करण 3
हम बटन से कैसे छुटकारा पा सकते हैं? संस्करण 3

ऐसे कई तरीके हैं जिनसे हम आगे बढ़ सकते हैं। पहले हम बटन से छुटकारा पाने के लिए हार्डवेयर जोड़ सकते थे। उदाहरण के लिए हम कीप्रेस की आउटपुट लाइन पर सर्किट में एक ट्रांजिस्टर लगाने की कोशिश कर सकते हैं ताकि यह आउटपुट से करंट का एक छोटा सा ट्रिकल ले सके और 5V पल्स को इंटरप्ट पिन PD2 में भेज सके।

हालाँकि, यह शायद कम से कम बहुत शोर होगा और कम से कम यह एक सटीक कीप्रेस रीडिंग के लिए पर्याप्त समय नहीं देगा क्योंकि कीपैड के वोल्टेज आउटपुट में एडीसी रीडिंग कैप्चर होने से पहले स्थिर होने का समय नहीं होगा।

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

सही बात? अच्छा चलो करते हैं…

संलग्न नए कोड पर एक नज़र डालें।

आप निम्न परिवर्तन देखें:

  1. हमने INT0 बाहरी व्यवधान को संभालने के लिए पते.org 0x0002 पर एक rjmp जोड़ा
  2. हमने यह इंगित करने के लिए EIMSK रजिस्टर को बदल दिया है कि हम INT0 पिन को बाधित करना चाहते हैं
  3. हमने ऑटोट्रिगरिंग को अक्षम करने के लिए ADCSRA रजिस्टर में ADATE पिन को बदल दिया है
  4. हमने ADCSRB सेटिंग्स से छुटकारा पा लिया क्योंकि ADATE के बंद होने पर वे अप्रासंगिक हो जाती हैं
  5. हमें अब बाहरी ट्रिगर फ्लैग को रीसेट करने की आवश्यकता नहीं है क्योंकि INT0 इंटरप्ट रूटीन इसे पूरा होने पर स्वचालित रूप से करता है - पहले हमारे पास एक इंटरप्ट रूटीन नहीं था, हमने उस पिन पर सिग्नल के एडीसी को बंद कर दिया था, इसलिए हमें करना पड़ा उस झंडे को हाथ से साफ करो।

अब इंटरप्ट हैंडलर में हम केवल एडीसी से एकल रूपांतरण कहते हैं।

व्यायाम 5: इस संस्करण को चलाएँ और देखें कि क्या होता है।

चरण 12: कार्यशील संस्करण के लिए कोड और वीडियो

जैसा कि हमने पिछले संस्करण से देखा, बटन इंटरप्ट बहुत अच्छी तरह से काम नहीं करता है क्योंकि पीडी 2 को पिन करने के लिए बढ़ते किनारे पर इंटरप्ट ट्रिगर होता है और फिर इंटरप्ट हैंडलर एडीसी रूपांतरण को कॉल करता है। हालाँकि, एडीसी को स्थिर होने से पहले वोल्टेज रीडिंग मिलती है और इसलिए यह बकवास पढ़ता है।

हमें जो चाहिए वह है PD2 पर रुकावट और PC0 पर ADC रीडिंग के बीच एक देरी का परिचय देना। हम इसे टाइमर/काउंटर, काउंटर ओवरफ्लो इंटरप्ट, और देरी रूटीन जोड़कर करेंगे। सौभाग्य से हम पहले से ही जानते हैं कि ट्यूटोरियल 3 से यह कैसे करना है! इसलिए हम वहां से संबंधित कोड को कॉपी और पेस्ट करेंगे।

मैंने परिणामी कोड और एक वीडियो दिया है जो इसे ऑपरेशन में दिखा रहा है।

आप देखेंगे कि रीडिंग उतनी सटीक नहीं हैं जितनी किसी को उम्मीद होगी। यह कई स्रोतों के कारण होने की संभावना है:

  1. हम PD2 पर ट्रिगर करने के लिए कीपैड के वोल्टेज आउटपुट से टैप कर रहे हैं जो PC0 में रीडिंग को प्रभावित करता है।
  2. हम वास्तव में नहीं जानते कि सर्वोत्तम रीडिंग प्राप्त करने के लिए ट्रिगर के बाद कितनी देर हो सकती है।
  3. एडीसी रूपांतरण को पूरा होने में कुछ चक्र लगते हैं जिसका अर्थ है कि हम कीपैड पर तेजी से आग नहीं लगा सकते।
  4. कीपैड में ही शायद शोर है।
  5. आदि…

इसलिए, हालांकि हम कीपैड को काम करने में कामयाब रहे, और अब हम इसे एनालाइज़र डिस्प्ले पर आउटपुट करने के बजाय किसी अन्य तरीके से कीप्रेस वैल्यू का उपयोग करके अनुप्रयोगों में उपयोग कर सकते हैं, यह बहुत सटीक नहीं है और यह बहुत कष्टप्रद है। इसलिए मुझे लगता है कि कीपैड को वायर करने का सबसे अच्छा तरीका है कि कीपैड से प्रत्येक आउटपुट को एक अलग पोर्ट में चिपका दिया जाए और यह तय किया जाए कि कौन सी कुंजी को किस पोर्ट से वोल्टेज देखा जाए। यह आसान, बहुत तेज़ और बहुत सटीक है।

वास्तव में, केवल दो कारण हैं कि कोई कीपैड को उस तरह से चलाना चाहेगा जिस तरह से हमने यहां किया है:

  1. यह हमारे माइक्रोकंट्रोलर पर 8 के बजाय केवल 2 पिन का उपयोग करता है।
  2. माइक्रोकंट्रोलर पर एडीसी के विभिन्न पहलुओं को दिखाने के लिए यह एक महान परियोजना है जो मानक चीजों से अलग है जो आप वहां पा सकते हैं जैसे तापमान रीडिंग, टर्निंग पोटेंशियोमीटर, आदि। मुझे ट्रिगर सिंगल रीडिंग और बाहरी पिन ऑटो-ट्रिगरिंग का एक उदाहरण चाहिए था। केवल फ्री रनिंग सीपीयू-गोबलिंग मोड के बजाय।

वैसे भी, यहाँ आपके लिए कुछ अंतिम अभ्यास हैं:

अभ्यास 6: लुक-अप तालिका का उपयोग करने के लिए ADC रूपांतरण पूर्ण इंटरप्ट हैंडलर को फिर से लिखें। अर्थात। ताकि यह तालिका में पहले आइटम के साथ एनालॉग मान का परीक्षण करे और यदि यह बड़ा है तो यह इंटरप्ट से वापस आ जाता है, यदि ऐसा नहीं है तो यह तालिका में अगले आइटम के लिए Z को बढ़ाता है और फिर से परीक्षण के लिए शाखाएं देता है। यह कोड को छोटा करेगा और इंटरप्ट रूटीन को साफ करेगा और इसे अच्छा लगेगा। (मैं अगले चरण के रूप में एक संभावित समाधान दूंगा) व्यायाम 7: माइक्रोकंट्रोलर पर अपने कीपैड को 8 पिन से जोड़ दें और इसके लिए सरल ड्राइवर लिखें और अनुभव करें कि यह कितना अच्छा है। क्या आप हमारे तरीके को बेहतर बनाने के कुछ तरीकों के बारे में सोच सकते हैं?

इस ट्यूटोरियल के लिए बस इतना ही। मैंने पॉइंटर्स के साथ अंतिम संस्करण संलग्न किया है। जैसे-जैसे हम अपने अंतिम लक्ष्य के करीब पहुंचेंगे, हम ट्यूटोरियल 9 में एक बार फिर कीबोर्ड का उपयोग यह दिखाने के लिए करेंगे कि इसके साथ सात सेगमेंट डिस्प्ले को कैसे नियंत्रित किया जाए (और कुछ दिलचस्प बनाने के लिए जो फोन कीपैड पर अतिरिक्त कुंजियों का उपयोग करता है) और फिर हम करेंगे इसके बजाय बटन-प्रेस के साथ चीजों को नियंत्रित करने के लिए स्विच करें (चूंकि यह विधि उस अंतिम उत्पाद के साथ बेहतर फिट बैठती है जिसे हम इन ट्यूटोरियल के साथ बना रहे हैं) और हम केवल कीपैड को बंद कर देंगे।

फिर मिलते हैं!

सिफारिश की: