मैं ATmega16 पर डिजिटल इनपुट कैसे पढ़ूं?


18

ATmega16 पर एक डिजिटल इनपुट (पुशबटन) पढ़ने के लिए मुझे क्या करना होगा ? क्या मुझे पुलअप-रेसिस्टर्स को सक्षम करना है या क्या मैं 10 कोहम का उपयोग कर सकता हूं? कुछ सरल कोड क्या होगा? बस एक साधारण 'एलईडी को चालू करें जब वह दबाया गया हो'।

क्या एक शुरुआती ट्यूटोरियल है? मैंने गुग्लिंग और एवीआर फ्रीक्स की कोशिश की है , लेकिन सब कुछ बस एक लड़ाई में विकसित होता है और मुझे अपना जवाब नहीं मिलता है। मुझे वास्तव में इस सामान के बारे में कोई ट्यूटोरियल नहीं मिला है। विशिष्ट चीजों के टन लेकिन मेरे AVR के बारे में कुछ भी सरल नहीं है माइक्रोकंट्रोलर के ...


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

निश्चित नहीं है कि आपने मेरी पोस्ट देखी या आप इसे देख पा रहे हैं (क्षमा करें, अभी भी इस साइट के बारे में उलझन में है ...) लेकिन मुझे पता है कि कोड है, जो मेरा प्रश्न बताता है: क्या मैं बस जीएनडी और इसके कम करने के लिए एक पिन कनेक्ट करता हूं?
उत्सुक

2
आप इसे अधिक सटीक रूप से प्रतिबिंबित करने के लिए पोस्ट को संपादित क्यों नहीं करते हैं और नीचे पोस्ट को मूल पोस्ट में भी शामिल करें।
अमोस

इस AVR शैतान पृष्ठ पर से स्क्रैच AVR ट्यूटोरियल का प्रयास करें । आपको वहां बहुत अधिक सामान मिलेगा।
लियोन हेलर

जवाबों:


24

ब्राजील का अभिवादन!

सबसे पहले आपके उदाहरण के लिए जॉबी का धन्यवाद। दूसरे, उनके उदाहरण में सिर्फ एक छोटी सी त्रुटि है। 0x20 की संख्या सही नहीं है। यह 0x04 होना चाहिए। इसके अलावा, एक सुझाव के रूप में, मैं कोड में हेक्साडेसिमल संख्याओं जैसे 0xFB, 0x20, या 0x04 का उपयोग नहीं करूंगा। मैं io.h में पाई गई पिन पोर्ट परिभाषाओं और हेडर फ़ाइल द्वारा संदर्भित अन्य का उपयोग करने का सुझाव दूंगा। मैंने नीचे जॉबी का उदाहरण फिर से लिखा है, शुरुआती लोगों के लिए कुछ टिप्पणियों के साथ।

# include <avr/io.h>

int main (void)
{
    // set all pins on PORTB for output
    DDRB = 0xFF;

    // set port pin PORTD2 as input and leave the others pins 
    // in their originally state (inputs or outputs, it doesn't matter)
    DDRD &= ~(1 << PD2);        // see comment #1

    while (1) 
    {
        if (PIND & (1<<PD2))    // see comment #2
            PORTB |= (1<<PB2);  // see comment #3
        else
            PORTB &= ~(1<<PB2); // see comment #4
    }
    return 0;
}

/ *

शुरुआती के लिए टिप्पणियाँ

टिप्पणी # 1: (1 << PD2) बाइनरी 00000100 उत्पन्न करता है। ऑपरेशन "~" सभी अंकों को फ़्लिप करता है, अर्थात, बाइनरी अब 11111011 है। अंत में DDRD और 111131 के बीच तर्क "और" लागू होता है और परिणाम फिर से रखा जाता है। DDRD मेमोरी में। नोट: DDRD मेमोरी में प्रत्येक बिट के लिए ऑपरेटर "AND" क्या करता है, यह ऊपर दिए गए बाइनरी नंबर से तुलना करता है। यदि डीडीआरडी में बिट 0 है और एक ही काटने की स्थिति में बाइनरी में बिट 1 है, तो परिणामी बिट 0 है, यदि डीडीआरडी 1 है और बाइनरी में बिट 1 है, तो परिणामी बिट 1 है, और यदि DDRD में बिट 1 या 0 है और बाइनरी में बिट 0 है तो परिणामी बिट हमेशा 0 है। सारांश में, कमांड DDRD & = ~ (1 << PD2) केवल बिट पीडी 2 को शून्य में बदलता है और अन्य (शून्य या लोगों) को छोड़ देता है। यह थोड़ा जटिल लगता है, लेकिन जब आपको इसकी आदत हो जाती है, तो दूसरे बिट्स को बदले बिना इसे काटने में थोड़ा बदलना सबसे अच्छा तरीका है।

टिप्पणी # 2 : (1 << PD2) बाइनरी 00000100 बाइनरी उत्पन्न करता है। उसी तर्क का उपयोग करके "और" टिप्पणी # 1 में वर्णित है, कमांड "PIND और 0000100" केवल तभी चेक करता है यदि PIND2 (हमारा इनपुट पिन जहां पुश बटन जुड़ा हुआ है ) उच्च या नहीं पर सेट है। बाइनरी बिट्स 0 पर सेट होने के बाद से सभी अन्य पिन FALSE होंगे, और जब से बाइनरी बिट # 2 1 पर सेट होता है, यदि PD2 इनपुट उच्च या FALSE के लिए सेट किया जाता है, तो IF कथन केवल TRUE होगा यदि PD2 इनपुट कम पर सेट करें।

टिप्पणी # 3 : टिप्पणी # 1 में बताए गए तर्क के बाद, यह कमांड पोर्ट PORTB में आउटपुट पिन PINB2 को हाई वोल्टेज में सेट करता है। यदि आपका एलईडी ~ 300 ओम के एक रोकनेवाला के साथ इस पिन पोर्ट से जुड़ा हुआ है, और यह अवरोध जमीन से जुड़ा हुआ है, तो एलईडी चालू होना चाहिए।

टिप्पणी # 4 : पिछली टिप्पणियों में बताए गए कारणों के लिए एलईडी को बंद कर देना चाहिए।

अंतिम विचार:

a) इनपुट पिन PD2 में वोल्टेज दोलन से बचने के लिए जब पुश बटन (ओपन सर्किट) नहीं दबाया जाता है, तो मैं एक पुल-डाउन रेसिस्टर (1 kOhm या उच्चतर) लगाने की मजबूत सलाह देता हूं, ताकि एलईडी गलती से प्रकाश न करे इस यादृच्छिक वोल्टेज दोलन के लिए।

बी) एक अस्वीकरण नोट: यहां वर्णित विचारों को केवल शैक्षिक के रूप में उपयोग किया जाना है और इलेक्ट्रॉनिक्स में किसी विशेषज्ञ से परामर्श करने से पहले उन्हें किसी भी वास्तविक प्रणाली में उपयोग नहीं किया जाना चाहिए।

* /


3
मैं आपको अपना ईमेल देने के लिए प्रोत्साहित नहीं करता क्योंकि ईमेल द्वारा संगत संचार को निजी बनाता है। इसलिए किसी और को फायदा नहीं हो सकता। लेकिन अगर आप वास्तव में निजी संचार के लिए अपना ईमेल प्रदान करना चाहते हैं, तो ऐसा करने का सबसे अच्छा स्थान आपकी प्रोफ़ाइल में है।
डैनियल ग्रिलो

क्या यह उल्टा नहीं है - # 3 एलईडी बंद कर देता है, # 4 एलईडी चालू करता है?
बैठी जूल

2

https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

https://www.mainframe.cx/~ckuethe/avr-c-tutorial/#digital-in

#include <avr/io.h>

/*
 * Assumptions:
 *  - LED connected to PORTB.2
 *  - Switch connected to PORTD.2
 */

int main (void)
{
    /* set PORTB for output*/
    DDRB = 0xFF;
    /* set PORTD for input*/
    DDRD &= 0xFB;
    PORTD |= 0x04;

    while (1) {
        if (PIND & 0x04)
            PORTB &= ~0x20;
        else
            PORTB |= 0x20;
    }
    return 0;
}

आपूर्ति किए गए लिंक के लिए @joby टैफ़ी को धन्यवाद। मैं EEPROM कार्यों की खोज कर रहा था और मुझे इससे बहुत सहायता मिली: mainframe.cx/~ckuethe/avr-c-tutorial/lesson11.c बहुत-बहुत धन्यवाद।
बिशाल पौडेल

2

हैकाडे ने AVR प्रोग्रामिंग के लिए एक शानदार लेखन किया था, इसमें बहुत सारी शानदार जानकारी है जो आपकी मदद कर सकती है

http://hackaday.com/2010/11/19/avr-programming-04-writing-code-etc/

http://hackaday.com/2010/11/05/avr-programming-03-reading-and-compiling-code/

http://hackaday.com/2010/10/25/avr-programming-02-the-hardware/

http://hackaday.com/2010/10/23/avr-programming-introduction/



0

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

जब बटन को नीचे रखा जाता है, तो एलईडी चालू करने के लिए, आपको संभवतः डिबगिंग के बारे में चिंता करने की ज़रूरत नहीं है। कुछ अधिक जटिल के लिए (जैसे बटन प्रेस पर एलईडी को टॉगल करना), डीबॉन्सेसिंग एक जरूरी है।

जैक गन्सल की डिबॉन्डिंग के लिए एक अच्छी गाइड है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.