विषयसूची:

एवीआर माइक्रोकंट्रोलर। एक पुश बटन स्विच का उपयोग करके एलईडी को टॉगल करें। पुश बटन डिबगिंग।: 4 कदम
एवीआर माइक्रोकंट्रोलर। एक पुश बटन स्विच का उपयोग करके एलईडी को टॉगल करें। पुश बटन डिबगिंग।: 4 कदम

वीडियो: एवीआर माइक्रोकंट्रोलर। एक पुश बटन स्विच का उपयोग करके एलईडी को टॉगल करें। पुश बटन डिबगिंग।: 4 कदम

वीडियो: एवीआर माइक्रोकंट्रोलर। एक पुश बटन स्विच का उपयोग करके एलईडी को टॉगल करें। पुश बटन डिबगिंग।: 4 कदम
वीडियो: C++ Debugging for the ESP32 in Visual Studio 2024, जुलाई
Anonim
Image
Image

इस खंड में, हम सीखेंगे कि एक बटन स्विच से इनपुट के अनुसार तीन एलईडी की स्थिति को टॉगल करने के लिए ATMega328PU के लिए प्रोग्राम C कोड कैसे बनाया जाए। साथ ही, हमने 'स्विच बाउंस' की समस्या का समाधान खोजा है। आमतौर पर, हम प्रोग्राम कोड के काम की जांच करने के लिए AVR ATmega328 के आधार पर विद्युत सर्किट को इकट्ठा करेंगे।

चरण 1: एकीकृत विकास प्लेटफॉर्म Atmel Studio का उपयोग करके C कोड में AVR माइक्रोकंट्रोलर एप्लिकेशन लिखना और बनाना 7

इंटीग्रेटेड डेवलपमेंट प्लेटफॉर्म Atmel Studio 7 का उपयोग करके C कोड में AVR माइक्रोकंट्रोलर एप्लिकेशन लिखना और बनाना
इंटीग्रेटेड डेवलपमेंट प्लेटफॉर्म Atmel Studio 7 का उपयोग करके C कोड में AVR माइक्रोकंट्रोलर एप्लिकेशन लिखना और बनाना
इंटीग्रेटेड डेवलपमेंट प्लेटफॉर्म Atmel Studio 7 का उपयोग करके C कोड में AVR माइक्रोकंट्रोलर एप्लिकेशन लिखना और बनाना
इंटीग्रेटेड डेवलपमेंट प्लेटफॉर्म Atmel Studio 7 का उपयोग करके C कोड में AVR माइक्रोकंट्रोलर एप्लिकेशन लिखना और बनाना
इंटीग्रेटेड डेवलपमेंट प्लेटफॉर्म Atmel Studio 7 का उपयोग करके C कोड में AVR माइक्रोकंट्रोलर एप्लिकेशन लिखना और बनाना
इंटीग्रेटेड डेवलपमेंट प्लेटफॉर्म Atmel Studio 7 का उपयोग करके C कोड में AVR माइक्रोकंट्रोलर एप्लिकेशन लिखना और बनाना

यदि आपके पास Atmel Studio नहीं है, तो आपको इसे डाउनलोड और इंस्टॉल करना चाहिए।

www.microchip.com/mplab/avr-support/atmel-studio-7

पहली कुछ पंक्तियों में हमारे पास कुछ कंपाइलर परिभाषित हैं।

F_CPU हर्ट्ज में घड़ी की आवृत्ति को परिभाषित करता है और avr-libc पुस्तकालय का उपयोग करने वाले कार्यक्रमों में आम है। इस मामले में इसका उपयोग विलंब दिनचर्या द्वारा यह निर्धारित करने के लिए किया जाता है कि समय की देरी की गणना कैसे करें।

#ifndef F_CPU

#define F_CPU 16000000UL // कंट्रोलर क्रिस्टल फ़्रीक्वेंसी (16 मेगाहर्ट्ज AVR ATMega328P) को बता रहा है #endif

पिन पर डेटा प्रवाह नियंत्रण को सक्षम करने के लिए #include // हेडर। पिन, पोर्ट आदि को परिभाषित करता है।

पहली शामिल फ़ाइल avr-libc का हिस्सा है और इसका उपयोग आपके द्वारा काम किए जाने वाले किसी भी AVR प्रोजेक्ट में किया जाएगा। io.h आपके द्वारा उपयोग किए जा रहे CPU को निर्धारित करेगा (यही कारण है कि आप संकलन करते समय भाग निर्दिष्ट करते हैं) और बदले में हम जिस चिप का उपयोग कर रहे हैं उसके लिए उपयुक्त IO परिभाषा शीर्षलेख शामिल करें। यह बस आपके सभी पिनों, बंदरगाहों, विशेष रजिस्टरों आदि के लिए स्थिरांक को परिभाषित करता है।

#include // हेडर प्रोग्राम में डिले फंक्शन को इनेबल करने के लिए

लाइब्रेरी util/delay.h में छोटी देरी के लिए कुछ रूटीन शामिल हैं। हम जिस फ़ंक्शन का उपयोग करेंगे, वह _delay_ms() है।

हम अपने बटन और एलईडी के बंदरगाहों और पिनों को घोषित करने के लिए परिभाषित का उपयोग करते हैं। इस तरह परिभाषित बयानों का उपयोग करने से हमें केवल 3 आसान-से-खोज लाइनों को संशोधित करने की आवश्यकता होती है यदि हम एलईडी को एक अलग I/O पिन पर ले जाते हैं या एक अलग एवीआर का उपयोग करते हैं।

#define BUTTON1 1 // पोर्ट B पिन से जुड़ा बटन स्विच 1

#define LED1 0 // LED1 पोर्ट B पिन से जुड़ा है 0 #define LED2 1 // LED2 पोर्ट C पिन से जुड़ा है

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

#define DEBOUNCE_TIME 25 // "डी-बाउंसिंग" बटन के दौरान प्रतीक्षा करने का समय

#define LOCK_INPUT_TIME 300 // एक बटन दबाने के बाद प्रतीक्षा करने का समय

शून्य init_ports_mcu ()

{

इस फ़ंक्शन को हमारे प्रोग्राम की शुरुआत में सिर्फ एक बार इनपुट आउटपुट पिन को इनिशियलाइज़ करने के लिए कहा जाता है जिसका हम उपयोग करेंगे।

बटन के लिए, हम लिखने और पढ़ने के लिए पोर्ट और पिन रजिस्टरों का उपयोग करेंगे। AVRs के साथ, हम उसके PINx रजिस्टर का उपयोग करके एक पिन पढ़ते हैं और हम उसके PORTx रजिस्टर का उपयोग करके एक पिन को लिखते हैं। पुल-अप को सक्षम करने के लिए हमें बटन रजिस्टर में लिखना होगा।

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

सबसे पहले, हम एलईडी के I/O पिन को इसके डेटा दिशा रजिस्टर का उपयोग करके आउटपुट के रूप में सेट कर रहे हैं।

डीडीआरबी = 0xFFu; // PORTB के सभी पिन को आउटपुट के रूप में सेट करें।

इसके बाद, बटन पिन को इनपुट के रूप में स्पष्ट रूप से सेट करें।

डीडीआरबी &= ~(1<

इसके बाद, इसे चालू करने के लिए PORTB पिन को उच्च (+5 वोल्ट) पर सेट किया जाता है। आउटपुट पिन शुरू में उच्च है, और चूंकि हमारी एलईडी सक्रिय-उच्च वायर्ड है, यह तब तक चालू रहेगा जब तक हम इसे स्पष्ट रूप से बंद नहीं करते।

और अंत में, हम अपने बटन के लिए उपयोग किए जा रहे इनपुट पिन पर आंतरिक पुल-अप रोकनेवाला को सक्षम करते हैं। यह केवल एक को पोर्ट पर आउटपुट करके किया जाता है। जब एक इनपुट के रूप में कॉन्फ़िगर किया जाता है, तो ऐसा करने से पुल-अप सक्षम होता है और जब आउटपुट के रूप में कॉन्फ़िगर किया जाता है, तो ऐसा करने से बस एक उच्च वोल्टेज आउटपुट होता है।

पोर्टब = 0xFF; // PORTB के सभी पिनों को हाई के रूप में सेट करें। एलईडी चालू है, // पहले पिन PORTB का आंतरिक पुल अप रेसिस्टर भी सक्षम है। डीडीआरसी = 0xFFu; // PORTC के सभी पिन को आउटपुट के रूप में सेट करें। PORTC = 0x00u; // PORTC के सभी पिन कम सेट करें जो इसे बंद कर देता है। डीडीआरडी = 0xFFu; // PORTD के सभी पिन को आउटपुट के रूप में सेट करें। PORTD = 0x00u; // PORTD के सभी पिन कम सेट करें जो इसे बंद कर देता है। }

अहस्ताक्षरित चार बटन_स्टेट ()

{

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

अब, याद रखें कि जब हम स्विच दबाते हैं, तो इनपुट आउटपुट पिन जमीन पर आ जाता है। इस प्रकार, हम पिन के कम होने का इंतजार कर रहे हैं।

/* बटन दबाया जाता है जब BUTTON1 बिट स्पष्ट होता है */

अगर (!(पिनब और (1<.)

हम यह जांच कर ऐसा करते हैं कि बिट स्पष्ट है या नहीं। यदि बिट स्पष्ट है, यह दर्शाता है कि बटन दबा हुआ है, तो हम पहले DEBOUNCE_TIME द्वारा परिभाषित समय की अवधि के लिए देरी करते हैं जो कि 25ms है और फिर बटन की स्थिति को फिर से जांचें। यदि बटन 25ms के बाद दब जाता है तो स्विच को डिबॉउन्ड माना जाता है और एक घटना को ट्रिगर करने के लिए तैयार होता है और इसलिए हम अपने कॉलिंग रूटीन में 1 वापस कर देते हैं। यदि बटन दबा हुआ नहीं है, तो हम अपने कॉलिंग रूटीन में 0 वापस कर देते हैं।

_delay_ms (DEBOUNCE_TIME);

अगर (!(पिनब और (1<.)

मुख्य अंतर (शून्य)

{

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

अहस्ताक्षरित चार n_led = 1; // शुरुआत में एलईडी नंबर अभी चालू है

उपयोग किए जा रहे I/O पिन को प्रारंभ करने के लिए फ़ंक्शन का कॉल:

init_ports_mcu ();

अनंत लूप जहां हमारा प्रोग्राम चलता है:

जबकि (1)

{

जब बटन_स्टेट यह दर्शाता है कि बटन दबाया गया था और डिबॉन्स किया गया था, तो n_led पैरामीटर के अनुसार एलईडी की वर्तमान स्थिति को बारी-बारी से चालू किया जाता है।

if (button_state ()) // यदि बटन दबाया जाता है, तो LED की स्थिति को चालू करें और 300ms के लिए विलंब करें (#define LOCK_INPUT_TIME)

{स्विच (n_led){ केस 1: PORTB ^= (1<<LED1); PORTC ^= (1<<LED2); टूटना;

ये कथन C बिटवाइज़ ऑपरेटरों का उपयोग करते हैं। इस बार यह एक्सक्लूसिव OR ऑपरेटर का उपयोग कर रहा है। जब आप उस बिट के बिट मान के साथ पोर्ट को एक्सओआर करते हैं जिसे आप टॉगल करना चाहते हैं, तो उस बिट को अन्य बिट्स को प्रभावित किए बिना बदल दिया जाता है।

मामला 2:

PORTC ^= (1<<LED2); PORTD ^= (1<<LED3); टूटना; केस 3: PORTD ^= (1<<LED3); PORTB ^= (1<<LED1); n_led=0; // एलईडी नंबर ब्रेक रीसेट करें; } n_led++; // अगली एलईडी _delay_ms (LOCK_INPUT_TIME) चालू है; } } वापसी (0); }

तो अब, जब आप इस प्रोग्राम को चलाते हैं, तो आप पुश-बटन को एलईडी के टॉगल करने के लिए दबाने में सक्षम होना चाहिए। LOCK_INPUT_TIME द्वारा परिभाषित हमारे विलंब के कारण, आप उस बटन को दबाकर रख सकते हैं जिसके कारण LED एक स्थिर दर पर बंद और चालू हो जाएगी (प्रत्येक 275ms से थोड़ा अधिक)।

प्रोग्रामिंग पूरी हो गई है।

अगला चरण प्रोजेक्ट का निर्माण कर रहा है और avrdude प्रोग्राम का उपयोग करके हेक्स फ़ाइल को माइक्रोकंट्रोलर में प्रोग्रामिंग कर रहा है।

आप c कोड में प्रोग्राम के साथ main.c फाइल डाउनलोड कर सकते हैं:

चरण 2: प्रोग्राम की HEX फ़ाइल को चिप की फ्लैश मेमोरी में स्थानांतरित करना

प्रोग्राम की HEX फाइल को चिप की फ्लैश मेमोरी में ट्रांसफर करना
प्रोग्राम की HEX फाइल को चिप की फ्लैश मेमोरी में ट्रांसफर करना
प्रोग्राम की HEX फाइल को चिप की फ्लैश मेमोरी में ट्रांसफर करना
प्रोग्राम की HEX फाइल को चिप की फ्लैश मेमोरी में ट्रांसफर करना

AVRDUDE डाउनलोड और इंस्टॉल करें। उपलब्ध नवीनतम संस्करण 6.3 है: ज़िप फ़ाइल डाउनलोड करें

सबसे पहले, प्रोग्राम की हेक्स फ़ाइल को AVRDUDE डायरेक्टरी में कॉपी करें। मेरे मामले में यह ButtonAVR.hex. है

फिर, डॉस प्रॉम्प्ट विंडो में कमांड टाइप करें: avrdude –c [प्रोग्रामर का नाम] –p m328p –u –U फ्लैश: w: [आपकी हेक्स फ़ाइल का नाम]।

मेरे मामले में यह है: avrdude –c ISPProgv1 –p m328p –u –U flash:w:ButtonAVR.hex

यह कमांड माइक्रोकंट्रोलर की मेमोरी में हेक्स फाइल लिखता है।

माइक्रोकंट्रोलर फ्लैश मेमोरी बर्निंग के विस्तृत विवरण के साथ वीडियो देखें:

माइक्रोकंट्रोलर फ्लैश मेमोरी बर्निंग…

ठीक! अब, माइक्रोकंट्रोलर हमारे कार्यक्रम के निर्देशों के अनुसार काम करता है। चलो पता करते हैं!

चरण 3: हार्डवेयर स्विच डिबगिंग

हार्डवेयर स्विच डिबगिंग
हार्डवेयर स्विच डिबगिंग

सॉफ्टवेयर स्विच डिबाउंसिंग के अलावा हम हार्डवेयर स्विच डिबाउंसिंग तकनीक का उपयोग कर सकते हैं। ऐसी तकनीक के पीछे मूल विचार स्विच सिग्नल में त्वरित परिवर्तनों को फ़िल्टर करने के लिए एक संधारित्र का उपयोग करना है।

किस मूल्य के संधारित्र का चयन किया जाना चाहिए? यह अंततः इस बात पर निर्भर करेगा कि इस विशेष समस्या के संबंध में बटन कितना खराब प्रदर्शन करता है। कुछ बटन एक जबरदस्त बाउंसिंग व्यवहार प्रदर्शित कर सकते हैं, फिर भी अन्य के पास बहुत कम होगा। 1.0 नैनोफ़ारड जैसा कम संधारित्र मान बहुत तेज़ी से प्रतिक्रिया करेगा, बाउंसिंग पर बहुत कम या कोई प्रभाव नहीं होगा। इसके विपरीत, एक उच्च संधारित्र मान जैसे कि 220 नैनोफ़ारड (जो अभी भी कैपेसिटर के मामले में बहुत छोटा है) शुरू से अंत वोल्टेज (5 वोल्ट से 0 वोल्ट) तक धीमा संक्रमण प्रदान करेगा। २२० नैनोफ़ारड क्षमता के साथ देखा गया संक्रमण अभी भी वास्तविक दुनिया के अर्थ में बहुत तेज़ है, और इस प्रकार खराब प्रदर्शन करने वाले बटनों पर इसका उपयोग किया जा सकता है।

चरण 4: विद्युत सर्किट

विद्युत सर्किट
विद्युत सर्किट
विद्युत सर्किट
विद्युत सर्किट
विद्युत सर्किट
विद्युत सर्किट

योजनाबद्ध आरेख के अनुसार घटकों को कनेक्ट करें।

सिफारिश की: