विषयसूची:

एवीआर असेंबलर ट्यूटोरियल 9: 7 चरण
एवीआर असेंबलर ट्यूटोरियल 9: 7 चरण

वीडियो: एवीआर असेंबलर ट्यूटोरियल 9: 7 चरण

वीडियो: एवीआर असेंबलर ट्यूटोरियल 9: 7 चरण
वीडियो: Лекция 4. Архитектура AVR. Ассемблер 2024, नवंबर
Anonim
एवीआर असेंबलर ट्यूटोरियल 9
एवीआर असेंबलर ट्यूटोरियल 9

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

आज हम दिखाएंगे कि हमारे ATmega328P और AVR असेंबली भाषा कोड का उपयोग करके 7-सेगमेंट डिस्प्ले और 4-अंकीय डिस्प्ले दोनों को कैसे नियंत्रित किया जाए। ऐसा करने के क्रम में हमें उन रजिस्टरों की संख्या को कम करने के लिए स्टैक का उपयोग करने के तरीके में मोड़ लेना होगा जिन्हें हमें टाई करने की आवश्यकता है। हम अपने कीपैड पर शोर को कम करने की कोशिश करने के लिए कुछ कैपेसिटर (लो-पास फिल्टर) जोड़ेंगे। हम ट्रांजिस्टर के एक जोड़े से एक वोल्टेज एम्पलीफायर बनाएंगे ताकि हमारा INT0 इंटरप्ट स्विच कीपैड की निचली पंक्ति पर कम वोल्टेज बटन के लिए बेहतर काम करे। और हम अपने सिर को दीवार के खिलाफ थोड़ा सा सही प्रतिरोधों को प्राप्त करने की कोशिश करेंगे ताकि चीज ठीक से काम करे।

हम ट्यूटोरियल 7. से अपने कीपैड का उपयोग करेंगे

इस ट्यूटोरियल को करने के लिए, मानक सामग्री के अतिरिक्त, आपको निम्न की आवश्यकता होगी:

  1. एक 7-सेगमेंट डिस्प्ले

    www.sparkfun.com/products/8546

  2. 4-अंकीय डिस्प्ले

    www.sparkfun.com/products/11407

  3. एक पुशबटन

    www.sparkfun.com/products/97

  4. प्रदर्शन के लिए डेटाशीट जिन्हें ऊपर से जुड़े उनके संबंधित पृष्ठों से डाउनलोड किया जा सकता है।
  5. एक 68 पीएफ सिरेमिक कैपेसिटर, 104 कैपेसिटर की एक जोड़ी, प्रतिरोधों का एक गुच्छा, दो 2N3904 NPN ट्रांजिस्टर।

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

चरण 1: 7-सेग डिस्प्ले को तार देना

7-सेग डिस्प्ले की वायरिंग
7-सेग डिस्प्ले की वायरिंग
7-सेग डिस्प्ले की वायरिंग
7-सेग डिस्प्ले की वायरिंग
7-सेग डिस्प्ले की वायरिंग
7-सेग डिस्प्ले की वायरिंग

हम उसी कोड का उपयोग करने जा रहे हैं जिसका उपयोग हमने 7-सेगमेंट डिस्प्ले को नियंत्रित करने के लिए कीपैड के लिए ट्यूटोरियल 7 में किया था। इसलिए आपको इसकी एक प्रति बनानी होगी और हम इसे संशोधित करेंगे।

हम अपने माइक्रोकंट्रोलर के पिन के लिए खंडों को निम्नानुसार मैप करेंगे:

(dp, g, f, e, d, c, b, a) = (PD7, PD6, PB5, PB4, PB3, PB2, PB1, PB0)

जहां चित्र में खंडों के अक्षरों को सामान्य 5V के अनुरूप पिनआउट और प्रदर्शन के निचले दाईं ओर दशमलव बिंदु (dp) सहित प्रत्येक LED खंड के साथ दिखाया गया है। इसका कारण यह है कि हम पूरे नंबर को एक ही रजिस्टर में इनपुट कर सकते हैं और आउटपुट को पोर्ट बी और डी में रजिस्टर कर सकते हैं ताकि सेगमेंट को रोशन किया जा सके। जैसा कि आप देख सकते हैं कि बिट्स क्रमिक रूप से 0 से 7 तक गिने जाते हैं और इसलिए वे अलग-अलग बिट्स को सेट और साफ़ किए बिना सही पिन पर मैप करेंगे।

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

मुझे यह जोड़ना चाहिए कि आपको प्रदर्शन के सामान्य एनोड और 5V रेल के बीच एक अवरोधक लगाने की आवश्यकता है। मैंने हमेशा की तरह एक 330 ओम अवरोधक चुना, लेकिन यदि आप चाहें तो प्रदर्शन से अधिकतम चमक प्राप्त करने के लिए आवश्यक न्यूनतम प्रतिरोध की गणना कर सकते हैं। यहाँ यह कैसे करना है:

पहले डेटा शीट को देखें और ध्यान दें कि पहले पेज पर यह डिस्प्ले के विभिन्न गुण देता है। महत्वपूर्ण मात्राएँ "फॉरवर्ड करंट" (I_f = 20mA) और "फॉरवर्ड वोल्टेज" (V_f = 2.2V) हैं। ये आपको बताते हैं कि डिस्प्ले पर वोल्टेज ड्रॉप तब होगा जब करंट फॉरवर्ड करंट के बराबर हो। यह अधिकतम करंट है जिसे डिस्प्ले बिना फ्राई किए ले जाएगा। यह परिणामी रूप से अधिकतम चमक भी है जो आप खंडों से प्राप्त कर सकते हैं।

तो आइए ओम के नियम और किरचॉफ के लूप नियम का उपयोग करके यह पता लगाएं कि अधिकतम चमक प्राप्त करने के लिए हमें डिस्प्ले के साथ श्रृंखला में कौन सा न्यूनतम प्रतिरोध लगाने की आवश्यकता होगी। किरचॉफ का नियम कहता है कि सर्किट में बंद लूप के चारों ओर वोल्टेज परिवर्तन का योग शून्य के बराबर होता है और ओम का नियम कहता है कि प्रतिरोध R के एक प्रतिरोधक पर वोल्टेज गिरता है: V = I R जहां I रोकनेवाला के माध्यम से बहने वाली धारा है।

तो वी का एक स्रोत वोल्टेज दिया गया है और हमारे सर्किट के चारों ओर जा रहा है:

वी - वी_एफ - आई आर = 0

जिसका अर्थ है (वी - वी_एफ)/आई = आर। तो अधिकतम चमक प्राप्त करने के लिए आवश्यक प्रतिरोध (और शायद खंडों को तलना) होगा:

आर = (वी - वी_एफ)/आई_एफ = (5.0वी - 2.2वी)/0.02ए = 140 ओम

तो अगर आप चाहें तो बिना किसी चिंता के 150 ओम का खुशी-खुशी इस्तेमाल कर सकते हैं। हालाँकि, मुझे लगता है कि १४० ओम इसे मेरी पसंद के हिसाब से बहुत उज्ज्वल बनाता है और इसलिए मैं ३३० ओम का उपयोग करता हूं (जो कि एल ई डी के लिए मेरे व्यक्तिगत गोल्डीलॉक्स प्रतिरोध की तरह है)

चरण 2: असेंबली कोड और वीडियो

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

आइए अब 4 अंकों के डिस्प्ले को देखें।

चरण 3: 4-अंकीय डिस्प्ले को वायर करना

4-अंकीय डिस्प्ले की वायरिंग
4-अंकीय डिस्प्ले की वायरिंग
4-अंकीय डिस्प्ले की वायरिंग
4-अंकीय डिस्प्ले की वायरिंग

डेटाशीट के अनुसार, 4 अंकों के डिस्प्ले में 60 mA का फॉरवर्ड करंट और 2.2 वोल्ट का फॉरवर्ड वोल्टेज होता है। इसलिए, पहले की तरह ही गणना के द्वारा, मैं चाहता तो 47 ओम अवरोधक का उपयोग कर सकता था। इसके बजाय मैं एक का उपयोग करने जा रहा हूं … घंटा.. मुझे देखने दो … 330 ओम के बारे में कैसे।

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

अभी के लिए, आइए परीक्षण करें कि सभी खंड काम करते हैं।

अपने 330 ओम रोकनेवाला को अपने ब्रेडबोर्ड की सकारात्मक रेल और डिस्प्ले पर पहले एनोड के बीच रखें। डेटाशीट हमें बताती है कि पिनों को 1 से 16 वामावर्त क्रमांकित किया जाता है, जो नीचे बाईं ओर से शुरू होता है (जब आप सामान्य रूप से प्रदर्शन को देख रहे होते हैं.. नीचे दशमलव बिंदुओं के साथ) और यह बताता है कि एनोड पिन नंबर 6 हैं।, 8, 9, और 12.

इसलिए हम पिन को 6 से 5V से जोड़ते हैं और फिर आपके GND रेल से एक नकारात्मक लीड लेते हैं और इसे अन्य सभी पिनों में डालते हैं और देखते हैं कि सभी खंड उस अंक पर प्रकाश डालते हैं जो इससे मेल खाता है (जो वास्तव में दूसरा अंक है) सही)। सुनिश्चित करें कि आपको सभी 7 खंड और दशमलव बिंदु प्रकाश में आए।

अब अपने जीएनडी तार को किसी एक खंड को रोशन करने के लिए पिन में से एक में चिपका दें और इस बार रोकनेवाला को अन्य 3 एनोड के चारों ओर ले जाएं और देखें कि एक ही खंड अन्य अंकों में से प्रत्येक में रोशनी करता है।

कुछ असामान्य?

यह पता चला है कि डेटाशीट पर पिनआउट गलत है। ऐसा इसलिए है क्योंकि यह 12-पिन, 4-अंकीय डिस्प्ले के लिए डेटाशीट और पिनआउट है। अर्थात। एक बिना कोलन या ऊपरी दशमलव बिंदु वाला। जब मैंने इसे ऑर्डर किया तो मुझे जो डिस्प्ले मिला, वह 16 पिन, 4-अंकीय डिस्प्ले है। वास्तव में, खदान पर, खंड एनोड पिन 1, 2, 6, और 8 पर हैं। कोलन एनोड पिन 4 (कैथोड पिन 12) है और ऊपरी डीपी एनोड पिन 10 है (कैथोड पिन 9 है)

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

जिस तरह से हम सेगमेंट मैप को कोड करना चाहते हैं, ठीक उसी तरह जैसा हमने ऊपर सिंगल डिजिट 7-सेगमेंट डिस्प्ले के साथ किया था - हमें कोड में कुछ भी बदलने की जरूरत नहीं है, केवल एक चीज जो हम बदलते हैं वह यह है कि वायर कैसे जुड़े होते हैं पर सवार। बस माइक्रोकंट्रोलर पर सही पोर्ट पिन को 4-अंकीय डिस्प्ले पर संबंधित पिन से प्लग करें ताकि, उदाहरण के लिए, PB0 अभी भी सेगमेंट a के अनुरूप पिन पर जाए, PB1 सेगमेंट B में जाए, आदि।

अंतर केवल इतना है कि अब हमें एनोड के लिए 4 अतिरिक्त पिन की आवश्यकता है क्योंकि हम अब केवल 5V रेल पर नहीं जा सकते। हमें यह तय करने के लिए माइक्रोकंट्रोलर की आवश्यकता है कि कौन सा अंक रस प्राप्त करता है।

तो हम 4 अंकों के एनोड को नियंत्रित करने के लिए PC1, PC2, PC3 और PD4 का उपयोग करेंगे।

आप आगे भी जा सकते हैं और तारों को प्लग कर सकते हैं। (एनोड तारों पर 330 ओम प्रतिरोधों को न भूलें!)

चरण 4: 4-अंकीय डिस्प्ले को कोड करना

4-अंकीय डिस्प्ले की कोडिंग
4-अंकीय डिस्प्ले की कोडिंग

आइए इस बारे में सोचें कि हम इस डिस्प्ले को कैसे कोडित करना चाहते हैं।

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

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

हम यह भी चाहते हैं कि जब हम अगला अंक टाइप करें तो यह "कर्सर" को एक स्थान पर दाईं ओर ले जाए। ताकि अगर मैं उदाहरण के लिए 1234 टाइप करना चाहता हूं, तो मैं 1 टाइप करने के बाद कर्सर आगे बढ़ जाएगा ताकि अगला अंक जो मैं टाइप करता हूं वह अगले 7-सेगमेंट डिस्प्ले पर दिखाई दे और इसी तरह। यह सब हो रहा है, फिर भी मैं यह देखना चाहता हूं कि मैंने क्या टाइप किया है, इसलिए इसे अभी भी अंकों के माध्यम से साइकिल चलाना और उन्हें प्रदर्शित करना है।

एक लंबे आदेश की तरह ध्वनि?

हालात वास्तव में और भी बुरे हैं। हमें 4 और सामान्य प्रयोजन रजिस्टरों की आवश्यकता है जिनका उपयोग हम उन 4 अंकों के वर्तमान मूल्यों को संग्रहीत करने के लिए कर सकते हैं जिन्हें हम प्रदर्शित करना चाहते हैं (यदि हम उनके माध्यम से साइकिल चलाने जा रहे हैं तो हमें उन्हें कहीं संग्रहीत करना होगा) और इसके साथ समस्या यह है कि हमारे पास है पागलों की तरह सामान्य प्रयोजन के रजिस्टरों का उपयोग कर रहे हैं और यदि हम ध्यान नहीं देते हैं तो हमारे पास कुछ भी नहीं बचेगा। तो शायद यह एक अच्छा विचार है कि उस मुद्दे को जल्द से जल्द निपटाया जाए और आपको यह दिखाया जाए कि स्टैक का उपयोग करके रजिस्टरों को कैसे मुक्त किया जाए।

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

चरण 5: 'एन पॉप' पुश करें

पुश 'एन पोप'
पुश 'एन पोप'

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

एक उदाहरण इसे और स्पष्ट करने में मदद करेगा।

ध्यान दें कि हमारे एनालॉग से डिजिटल रूपांतरण में ADC_int को पूर्ण रूप से बाधित करने के लिए हम एक सामान्य प्रयोजन रजिस्टर का उपयोग करते हैं जिसे हमने बटन एच नाम दिया है जिसका उपयोग हम ADCH के मूल्य को लोड करने के लिए करते हैं और इसकी तुलना हमारे एनालॉग से बटन प्रेस रूपांतरणों की लुकअप तालिका से करते हैं। हम केवल ADC_int सबरूटीन के भीतर इस बटनएच रजिस्टर का उपयोग करते हैं और कहीं नहीं। इसलिए इसके बजाय हम अपने चर temp2 का उपयोग करेंगे जिसका उपयोग हम एक अस्थायी चर के रूप में करते हैं जिसका उपयोग हम किसी दिए गए सबरूटीन के भीतर कर सकते हैं और इसका मान उस सबरूटीन के बाहर किसी भी चीज़ को प्रभावित नहीं करेगा (अर्थात हम जो मान ADC_int में देते हैं उसका कहीं भी उपयोग नहीं किया जाएगा) अन्यथा)।

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

शुद्ध परिणाम यह है कि हमने अस्थायी उपयोग के लिए अस्थायी और अस्थायी 2 "उधार" लिया है और फिर जब हम समाप्त कर लेंगे तो उन्हें उनके पिछले मूल्यों पर बहाल कर दिया जाएगा।

यहाँ यह परिवर्तन करने के बाद ADC_int व्यवधान दिनचर्या है:

एडीसी_इंट:

धक्का अस्थायी; अस्थायी सहेजें क्योंकि हम इसे यहां संशोधित करते हैं temp2 धक्का; temp2 lds temp2, ADCH सहेजें; लोड कीप्रेस एलडीआई जेडएच, हाई (2 * नंबर) एलडीआई जेडएल, लो (2 * नंबर) सीपीआई टेम्प 2, 0 ब्रेक रिटर्न; यदि शोर ट्रिगर 7segnumber सेटकी नहीं बदलते हैं: lpm temp, Z+; तालिका से लोड करें और वेतन वृद्धि के बाद clc cp temp2, temp; टेबल के साथ कीप्रेस की तुलना करें पीसी+4; अगर ADCH कम है, तो फिर से कोशिश करें lpm 7segnumber, Z; अन्यथा keyvalue तालिका inc अंक लोड करें; अंक संख्या में वृद्धि rjmp वापसी; और वापसी आदि ZH:ZL, 1; वेतन वृद्धि Z rjmp सेटकी; और शीर्ष वापसी पर वापस जाएं: pop temp2; अस्थायी 2 पॉप अस्थायी बहाल करें; अस्थायी रेटी बहाल करें

ध्यान दें कि जिस तरह से स्टैक काम करता है वह यह है कि पहली बार आखिरी बंद है। बिल्कुल कागजों के ढेर की तरह। आप देखते हैं कि हमारी पहली दो पंक्तियों में हम temp के मान को स्टैक पर धकेलते हैं, फिर हम temp2 को स्टैक पर धकेलते हैं, फिर हम उन्हें अन्य चीजों के लिए सबरूटीन में उपयोग करते हैं, और अंत में हम उन्हें उनके पिछले मानों पर फिर से पुनर्स्थापित करते हैं पहले टेम्पिंग 2 को बंद करना (चूंकि यह आखिरी था जिसे उस पर धकेला गया था वह स्टैक के शीर्ष पर है और वह पहला होगा जिसे हम वापस पॉप करते हैं) और फिर अस्थायी पॉपिंग।

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

चरण 6: लो-पास फिल्टर और वोल्टेज एम्पलीफायर

लो-पास फिल्टर और वोल्टेज एम्पलीफायर
लो-पास फिल्टर और वोल्टेज एम्पलीफायर
लो-पास फिल्टर और वोल्टेज एम्पलीफायर
लो-पास फिल्टर और वोल्टेज एम्पलीफायर

शोर को थोड़ा साफ करने के लिए और हमारे कीपैड को बेहतर काम करने के लिए हम कुछ कम-पास फिल्टर जोड़ना चाहते हैं। ये उच्च आवृत्ति शोर को फ़िल्टर करते हैं और कम आवृत्ति सिग्नल को गुजरने देते हैं। अनिवार्य रूप से ऐसा करने का तरीका हमारे एनालॉग इनपुट और ग्राउंड के बीच 68 पीएफ कैपेसिटर और हमारे पीडी 4 (आईएनटी 0) इंटरप्ट और ग्राउंड के बीच 0.1 माइक्रोफ़ारड (यानी 104) कैपेसिटर जोड़ना है। यदि आप कीपैड पर बटन दबाते समय इनके साथ खेलते हैं तो आप देख पाएंगे कि वे क्या करते हैं।

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

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

जब आप अपने कीपैड और अपने वोल्टेज एम्पलीफायर को तार करते हैं, तो यह बहुत संभावना है कि वही प्रतिरोधक मान जो मैंने उपयोग किए हैं, काम नहीं करने वाले हैं। तो आपको अपने लिए काम करने वाले मूल्यों को प्राप्त करने के लिए कुछ प्रयोग करना होगा।

यदि आप इस चरण से जुड़े आरेख को देखते हैं तो आप देखेंगे कि वोल्टेज एम्पलीफायर कैसे काम करने वाला है। हम कुछ प्रतिरोधों और दो ट्रांजिस्टर का उपयोग करते हैं। जिस तरह से ट्रांजिस्टर काम करते हैं (डेटा शीट देखें!) क्या एक न्यूनतम वोल्टेज है जिसे आपको ट्रांजिस्टर (मध्य पिन) पर बेस पिन में इनपुट करने की आवश्यकता होती है जो इसे संतृप्त करेगा और कलेक्टर पिन और एमिटर के बीच करंट प्रवाहित होने देगा। पिन। 2N3904 ट्रांजिस्टर के मामले में जिसका हम यहां उपयोग कर रहे हैं, वोल्टेज 0.65V है। अब हम उस वोल्टेज को कीपैड से अपने आउटपुट से ले रहे हैं और हम उस आउटपुट को बदलना नहीं चाहते हैं इसलिए हम कीपैड से आउटपुट और पहले ट्रांजिस्टर के बेस (मैंने 1Mohm का इस्तेमाल किया) के बीच एक बड़ा रेसिस्टर लगाएंगे। मैंने इसे आरेख में R_1 के रूप में लेबल किया है। फिर हम एक वोल्टेज विभक्त स्थापित करना चाहते हैं ताकि ट्रांजिस्टर का आधार पहले से ही 0.65 वोल्ट पर "लगभग" हो और केवल एक नन्हा वेनी थोड़ा अधिक इसे शीर्ष पर धकेल देगा और इसे संतृप्त करेगा। जब हम एक बटन दबाते हैं तो वह नन्हा बिट कीपैड के आउटपुट से आएगा। चूँकि कीपैड पर निचली कुंजियाँ केवल एक छोटा वोल्टेज लगा रही हैं, इसलिए हमें पहले से ही संतृप्ति के बहुत करीब होने की आवश्यकता है ताकि वे पर्याप्त हों। वोल्टेज विभक्त प्रतिरोधों को आरेख पर R_a और R_b लेबल किया जाता है। मैंने R_a = 1Mohm और R_b = 560Kohm का उपयोग किया लेकिन यह लगभग तय है कि आपको अपने सेटअप के लिए इसे सही करने के लिए इन नंबरों के साथ खेलना होगा।हो सकता है कि आप अपने सिर को टकराने के लिए पास में एक दीवार और हाथ पर दो या तीन गिलास स्कॉच रखना चाहें (मैं लैप्रोएग की सिफारिश करूंगा - महंगा, लेकिन अगर आपको धूम्रपान पसंद है तो इसके लायक है। अगर चीजें वास्तव में पागल हो जाती हैं, तो बस एक जग लें बी.वी. और रात के लिए बस गए)

अब देखते हैं कि ट्रांजिस्टर हमें INT0 कुंजी में जाने के लिए एक अच्छी बढ़ती बढ़त कैसे प्राप्त करने जा रहे हैं और हमारे कीप्रेस इंटरप्ट उत्पन्न करते हैं। पहले देखते हैं कि जब मैं एक कुंजी नहीं दबा रहा हूं तो क्या होता है। उस स्थिति में पहला ट्रांजिस्टर (आरेख में T1 लेबल) बंद है। अतः संग्राहक और उत्सर्जक पिनों के बीच कोई धारा प्रवाहित नहीं हो रही है। इस प्रकार अन्य ट्रांजिस्टर (टी 2 लेबल) का आधार ऊंचा खींचा जाएगा और इस प्रकार यह अपने पिनों के बीच प्रवाह की अनुमति देने के लिए संतृप्त होगा। इसका मतलब यह है कि T2 के उत्सर्जक को कम खींचा जाएगा क्योंकि यह कलेक्टर से जुड़ा है जो खुद जमीन से जुड़ा है। इस प्रकार, हमारे INT0 कीप्रेस इंटरप्ट पिन (PD4) पर जाने वाला आउटपुट कम होगा और कोई रुकावट नहीं होगी।

अब क्या होता है जब मैं एक कुंजी दबाता हूं? खैर तब T1 का आधार 0.65V से ऊपर चला जाता है (निचली कुंजियों के मामले में यह केवल मुश्किल से ऊपर जाता है!) और फिर करंट को प्रवाहित होने दिया जाएगा जो T2 के आधार को कम वोल्टेज की ओर खींचेगा और यह T2 को बंद कर देगा। लेकिन हम देखते हैं कि जब T2 बंद होता है, तो आउटपुट उच्च खींचा जाता है और इसलिए हमें अपने INT0 पिन पर जाने वाला 5V सिग्नल मिलेगा और यह एक रुकावट का कारण बनेगा।

ध्यान दें कि यहाँ शुद्ध परिणाम क्या है। यदि हम 1 कुंजी को दबाते हैं, तो हमें ADC0 में जाने वाले आउटपुट को महत्वपूर्ण रूप से बदले बिना 5V PD4 में जाता है, और इससे भी महत्वपूर्ण बात यह है कि भले ही हम तारांकन चिह्न, 0, हैश, या रेडियल को धक्का देते हैं, हमें INT0 पर जाने वाला 5V सिग्नल भी मिलता है। रुकावट पैदा कर रहा है! यह महत्वपूर्ण है क्योंकि अगर हम सीधे कीपैड आउटपुट से INT0 पिन पर जाते हैं, तो वे चाबियां लगभग कोई वोल्टेज उत्पन्न नहीं कर रही हैं और वे उस इंटरप्ट पिन को ट्रिगर करने के लिए पर्याप्त नहीं होंगी। हमारे वोल्टेज एम्पलीफायर ने इस समस्या को हल कर दिया है।

चरण 7: 4-अंकीय प्रदर्शन कोड और वीडियो

ट्यूटोरियल 9 के लिए बस इतना ही! मैंने ऑपरेशन दिखाने वाला कोड और एक वीडियो संलग्न किया है।

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

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

एक बार जब हमारे पास संचार काम कर रहा होता है और डिस्प्ले पर दिखने वाले रोल हम अंत में अपने अंतिम उत्पाद का पहला टुकड़ा बना सकते हैं। आप देखेंगे कि सभी एनालॉग पोर्ट स्टफ के बिना हमारा कोड काफी छोटा और पढ़ने में आसान होने वाला है।

आप में से उन लोगों के लिए जो महत्वाकांक्षी हैं। यहां एक "प्रोजेक्ट" है जिसे आप कोशिश कर सकते हैं कि आपको निश्चित रूप से इस बिंदु पर करने के लिए ज्ञान है यदि आप इन सभी ट्यूटोरियल से इस बिंदु तक गए हैं:

परियोजना: एक कैलकुलेटर बनाओ! हमारे 4-अंकीय डिस्प्ले और हमारे कीपैड का उपयोग करें और एक बाहरी बटन पुश जोड़ें जो "एंटर" कुंजी की तरह कार्य करेगा। तारांकन को "समय", हैश को "प्लस" में "विभाजित" करने के लिए और फ्लैश को "माइनस" में मैप करें और एक कैलकुलेटर रूटीन लिखें जो उन पुराने एचपी "रिवर्स पॉलिश" कैलकुलेटरों में से एक की तरह काम करता है जो सभी इंजीनियरों के पास था दिन में वापस। अर्थात। जिस तरह से वे काम करते हैं वह यह है कि आप एक नंबर दर्ज करें और "एंटर" दबाएं। यह उस नंबर को स्टैक पर धकेलता है, फिर आप दूसरा नंबर दर्ज करते हैं और "एंटर" दबाते हैं, जो दूसरे नंबर को स्टैक पर धकेलता है। अंत में आप एक्स, /, + या - जैसे किसी एक ऑपरेशन को दबाते हैं और यह उस ऑपरेशन को स्टैक पर शीर्ष दो नंबरों पर लागू करेगा, परिणाम प्रदर्शित करेगा, और परिणाम को स्टैक पर धक्का देगा ताकि आप इसे फिर से उपयोग कर सकें यदि आप पसंद। उदाहरण के लिए 2+3 जोड़ने के लिए आप यह करेंगे: 2, "एंटर", 3, "एंटर", "+" और फिर डिस्प्ले 5 पढ़ेगा। आप जानते हैं कि स्टैक, डिस्प्ले, कीपैड का उपयोग कैसे करें, और आप अधिकांश पृष्ठभूमि कोड पहले ही लिखे जा चुके हैं। कैलकुलेटर के लिए आवश्यक एंटर कुंजी और सबरूटीन जोड़ें। यह आपके विचार से थोड़ा अधिक जटिल है, लेकिन यह मजेदार और करने योग्य है।

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

सिफारिश की: