क्या धमाकेदार है


26

मैं माइक्रोकंट्रोलर प्रोग्रामिंग में नया हूं। मैं ATmega32-A कंट्रोलर और CodeVisionAVR कंपाइलर का उपयोग कर रहा हूं। मैं एसपीआई संचार का उपयोग करके एक साइनवेव सिग्नल उत्पन्न करने के लिए तरंग जनरेटर (AD9833) का उपयोग कर रहा हूं। मैं सफलतापूर्वक पापी उत्पन्न करने में सक्षम हूं। अब मैं सेंसर को वह संकेत दे रहा हूं। सेंसर आउटपुट को मल्टीप्लेक्सर के माध्यम से चुना जाता है और एडीसी को भेजा जाता है। अब मैं SPI संचार का उपयोग करके ADC मान पढ़ना चाहता हूं। मैंने एडीसी के रजिस्टरों को सेटअप करने की बहुत कोशिश की है। फिर भी यह काम नहीं कर रहा है। SPI संचार कोड को देखने के लिए spi संचार का उपयोग करके मेरे पिछले पोस्ट ADC रजिस्टर सेटअप पर एक नज़र है । मैं पीसी (पुट्टी) पर मूल्यों को प्रिंट करने के लिए USART (RS232) संचार का उपयोग कर रहा हूं।

किसी ने मुझे बिट-बैंगिंग का उपयोग करने की सलाह दी। मैं उस अवधारणा के लिए नया हूं। क्या कोई मुझे SPI संचार की बिट बैंगिंग का एक उदाहरण कोड प्रदान कर सकता है। उस प्रक्रिया को कैसे शुरू करें? क्या कोई मुझे एक अच्छा मैटरेल प्रदान कर सकता है। क्या मुझे किसी बाहरी हार्डवेयर की आवश्यकता है?

मैंने इसे लिखा है, जिसमें पिन कनेक्शन शामिल हैं:

#define ADC_CS PORTB.3
#define MOSI PORTB.5
#define MISO PINB.6
#define SCK PORTB.7

void send_8bit_serial_data(unsigned char data)
{
    int i;  
    ADC_CS=0;
    for (i = 0; i < 8; i++)
    {
        // consider leftmost bit
        // set line high if bit is 1, low if bit is 0
        if (data & 0x80)
            output_high(PORTB.5);
        else
            output_low(PORTB.5);

        // pulse clock to indicate that bit value should be read
        output_low(PORTB.7);
        output_high(PORTB.7);

        // shift byte left so next bit will be leftmost
        data <<= 1;
    }

    // deselect device
    ADC_CS=1;
}


आपका कोड ठीक-ठाक दिखता है, क्लॉक आउटपुट कम और सेटिंग में देरी से पहले होना चाहिए। आपको समय को ठीक करने के लिए कुछ देरी की आवश्यकता है (इसलिए घड़ी की ऊँचाई कम / अधिक लगभग समान अवधि होती है) स्टीवन कोड पर फिर से नज़र डालें। यदि आप पढ़ना चाहते हैं तो आपको इसके लिए कोड भी जोड़ना होगा।
ओली ग्लेसर

@OliGlaser क्या मैं सामान्य SPI कोड के बजाय सीधे इस कोड का उपयोग कर सकता हूं जो कि रजिस्टरों को सेटअप करता है।
वेरेंड

@verendra - निश्चित नहीं है कि "सामान्य SPI कोड" से आपका क्या तात्पर्य है। यदि आप हार्डवेयर SPI के बजाय मतलब है, तो ADC परवाह नहीं करता है कि जब तक वे प्रोटोकॉल और समय के साथ सहमत हैं, तब तक दाल कैसे उत्पन्न होती है।
ओली ग्लेसर

जवाबों:


25

बिटकॉइन माइक्रोकंट्रोलर के अंदर हार्डवेयर के एक टुकड़े पर निर्भर होने के बजाय, सॉफ्टवेयर में दालों की पूरी श्रृंखला बना रहा है।

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

लेकिन कुछ माइक्रोकंट्रोलर्स में बोर्ड पर SPI हार्डवेयर नहीं होता है और फिर आपको मैन्युअल रूप से सब कुछ करके इसका अनुकरण करना होता है। SPI में कई अलग-अलग मोड हैं, मैं इस पल्स आरेख का उपयोग एक उदाहरण के रूप में करूंगा:

यहाँ छवि विवरण दर्ज करें

इसलिए जब एक समर्पित SPI कंट्रोलर सभी दालों, डेटा शिफ्टिंग और टाइमिंग का ध्यान रखता है, जब बिट-बैंगिंग को आपको खुद एक्शन लेना पड़ता है:

Make Slave Select low  
Short delay
Do 8 times
  Make the SCK (Serial Clock) pin low 
  Make the MOSI (Master-Out-Slave-In) pin high or low depending on bit 7 of the data  
  Add brief delay  
  Make the SCK output high
  Read MISO (Master-In-Slave-Out) pin
  Shift received data left, and shift the bit just read in as bit 0   
  Add brief delay  
  Shift the data byte 1 bit left
Make Slave Select high again  

बिट-बैंगिंग एसपीआई अपेक्षाकृत सरल है, उदाहरण के लिए बिट-पीकिंग I2C का कोड अधिक जटिल होगा, और यदि आपको UART प्रोटोकॉल को बिट-बैंग करना है तो आपको किसी तरह टाइमर की आवश्यकता होगी।


2
क्या आप एक नमूना सी कोड प्रदान कर सकते हैं।
वीर

1
@ वीरेंद्र - मैंने एक छद्मकोड उदाहरण जोड़ा, जिसे आप आसानी से सी। में अनुवाद करने में सक्षम होना चाहिए
स्टीवन्वह

मैं सफलतापूर्वक SPI संचार का उपयोग कर Wavefrom उत्पन्न कर रहा हूँ। मुझे केवल SPI का उपयोग करके ADC मान पढ़ने में समस्या है। मुझे एडीसी मूल्यों को पढ़ने के लिए या केवल दोनों के लिए बिट बैंगिंग का उपयोग करना होगा। क्या आप 8 बिट भेजने के लिए मेरे कोड को देख सकते हैं, क्या यह लिखना है। लेकिन मैं इसे कैसे उपयोग करने के लिए भ्रमित कर रहा हूँ। क्या मैं इस कोड को सीधे मेरे SPI कोड के बजाय सेटअप रजिस्टर में रख सकता हूं।
वीरेंद्र

@ सीन - आपके द्वारा दिखाया गया आरेख पहले MSB है, इसलिए आपको 7 से लेफ्ट शिफ्ट और 0. में लेफ्ट शिफ्ट करने की आवश्यकता है। मुझे पता है कि कोई मानक नहीं है इसलिए यह पहले LSB हो सकता है, लेकिन मुझे लगता है कि ज्यादातर SPI बाह्य उपकरणों को इस तरह से करते हैं ।
ओली ग्लेसर

2
@ ओली - अच्छी बात है, मैं चूक गया। मैं इसे ठीक कर दूंगा, प्रतिक्रिया के लिए धन्यवाद। कोई मानक नहीं होने का कारण यह है कि यह तब तक मायने नहीं रखता जब तक कि स्थानांतरित बिट्स की संख्या शिफ्ट रजिस्टर की लंबाई के बराबर न हो। हाल ही में कुछ माइक्रोकंट्रोलर्स (जैसे एनएक्सपी कॉर्टेक-एम 3) में एक वैरिएबल लेंथ शिफ्ट रजिस्टर होता है, और फिर दिशा मायने रखती है। AVR में IIRC आप पहले MSB या पहले LSB का चयन कर सकते हैं।
स्टीवनवह

6

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

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

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

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

उदाहरण के लिए, मान लें कि एक प्रोसेसर को UART- शैली के डेटा को एक दर पर क्रमिक रूप से प्रसारित करना है जो कि इसकी घड़ी की गति के सापेक्ष बहुत अधिक है (उदाहरण के लिए एक PIC जो 1200 बीपीएस पर डेटा उत्पादन के लिए प्रति सेकंड 8,192 निर्देश चला रहा है)। यदि कोई व्यवधान सक्षम नहीं है, तो इस तरह का प्रसारण मुश्किल नहीं है (हर सात निर्देश चक्र को एक बिट देखें)। यदि कोई PIC कुछ नहीं कर रहा है, लेकिन आने वाले 1200bps डेटा बाइट के लिए प्रतीक्षा कर रहा है, तो यह 3-चक्र लूप को स्टार्ट बिट के लिए इंतजार कर सकता है, और फिर सात-चक्र अंतराल पर डेटा में घड़ी के लिए आगे बढ़ सकता है। वास्तव में, यदि किसी पीआईसी के पास डेटा की एक बाइट होती है, जब डेटा की एक आवक बाइट आती है, तो आने वाले बाइट को पढ़ने के साथ पीआईसी को अपना डेटा भेजने के लिए सात चक्र प्रति बिट पर्याप्त समय होगा। इसी तरह,यदि इस तरह के उत्तर से मूल प्रसारण के सापेक्ष समय निश्चित हो जाता । दूसरी ओर, PIC के लिए कोई तरीका नहीं होगा कि बिट-बैंग संचार को इस तरह से गति दें कि या तो डिवाइस को किसी भी समय संचारित करने की अनुमति दी गई थी जो कि फिट दिखे (एक डिवाइस होने के विपरीत जो इसे देखा जा सकता है। फिट, और जो कुछ भी पसंद नहीं है, जब वह संचारित नहीं करता है, और एक उपकरण जिसे अपना अधिकांश समय कुछ भी करने में खर्च करना होगा, लेकिन पहले डिवाइस से प्रसारण की प्रतीक्षा कर रहा है)।

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