कैसे गैर-मानक सीरियल सिग्नल को कुशलतापूर्वक डिकोड करें


12

मैं एक प्रोजेक्ट पर काम करने वाली एक रिसर्च टीम का एक अंडरग्रेजुएट सदस्य हूं जिसमें RF-संचारण ASIC और इसके वायरलेस रिसीवर शामिल हैं जो अंततः एक पीसी को डेटा भेजना चाहिए।

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

यहाँ एक समस्या है जो मैं कर रहा हूँ, और एक मैं अनुमान लगा रहा हूँ:

  1. मैं अपने काफी शक्तिशाली 72 मेगाहर्ट्ज एआरएम कोर्टेक्स एम 3 प्रोसेसर के साथ भी बफ़र किए गए डेटा को तेज़ी से संसाधित नहीं कर सकता। बिटरेट 400 Kbps (2.5 us / bit) है। संदर्भ के लिए जो केवल 180 चक्र प्रति बिट (डिकोडिंग और आईएसआर सहित) है, जिसमें ओवरहेड ouch के ~ 30 चक्र हैं!)। एमसीयू को कई अन्य कार्यों को भी संभालना पड़ता है जो कि मुख्य लूप में मतदान करता है।

  2. USB वर्चुअल कॉम पोर्ट ड्राइवर भी आधारित है। इससे मुझे लगभग निश्चित हो जाता है कि चालक को आखिरकार प्रोसेसर इतने लंबे समय के लिए बाधित होगा कि यह 2.5 माइक्रोसेकंड (180 चक्र) विंडो को याद करता है जिसमें थोड़ा सा संचारित हो सकता है। मैं अनिश्चित हूं कि इस तरह की बाधाएं / दौड़ कैसे आम तौर पर हल हो जाती हैं।

तो सवाल यह है कि इन मुद्दों को हल करने के लिए कोई क्या कर सकता है या क्या यह बिल्कुल सही तरीका नहीं है? मैं कम सॉफ्टवेयर-केंद्रित दृष्टिकोणों पर भी विचार करने को तैयार हूं। उदाहरण के लिए, डिकोडिंग के लिए कुछ प्रकार के हार्डवेयर राज्य मशीन के साथ एक समर्पित यूएसबी चिप का उपयोग करना, लेकिन यह अपरिचित क्षेत्र है।


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

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

इतने शानदार जवाब यहां। मैंने समाधानों के बीच एक स्पष्ट विभाजन को देखा, जिसमें अवरोधों में बदलाव, और समर्पित हार्डवेयर / डिजिटल लॉजिक से जुड़े समाधान शामिल थे। FPGAs और Verilog जैसी चीजें जिनसे मैं परिचित हूं, लेकिन अभी तक इसका अनुभव नहीं हुआ है, इसका मतलब है कि उन्हें लंबे समय के लिए बचाया जाना चाहिए। शॉर्ट-टर्म @rocketmagnets में कम रुकावट-भारी विधि ठीक है। मुझे डिजिटल लॉजिक के लिए मैनिक कार्यों को समर्पित करने और सच्चे गणना के लिए एआरएम को बचाने की लालित्य पसंद है। भविष्य में एआरएम की शक्ति का उपयोग वायरलेस सीरियल डेटा के विश्लेषण और फ़िल्टरिंग के लिए किया जाएगा।
कीगन जय

क्या सिग्नल सिंक्रोनस या एसिंक्रोनस है?
21

अतुल्यकालिक। 4 स्टार्ट बिट्स, 10 डेटा बिट्स, 2 स्टॉप बिट्स। ASIC की प्रकृति के कारण जो संचारित हो रहा है, HI और LO बार चिप से चिप में बहुत भिन्न होते हैं। मैंने बॉड दर में कटौती करने के लिए पहले से ही एक एल्गोरिथ्म लिखा है।
कीगन जय

जवाबों:


5

एक और जवाब: इंटरप्ट का उपयोग करना बंद करें।

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

अक्सर एक मुख्य लूप लिखना संभव होता है जो सब कुछ इतनी तेजी से करता है कि यह विलंबता है कल्पना के भीतर, और बहुत कम समय बर्बाद होता है।

loop
{
    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (serial_byte_ready)
    {
        // decode serial data
    }

    if (enough_serial_bytes_available)
    {
        // more decoding
    }        

    if (usb_queue_not_empty)
    {
        // handle USB data
    }        
}

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

loop
{
    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (serial_byte_ready)
    {
        // decode serial data
    }

    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (enough_serial_bytes_available)
    {
        // more decoding
    }        

    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (usb_queue_not_empty)
    {
        // handle USB data
    }        
}

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


मुझे आपका उत्तर अन्य रॉकेटमैग्नेट व्यक्ति के उत्तर से अधिक पसंद है। अधिक हार्डवेयर के बजाय, तेज हार्डवेयर, कुछ और, आप रॉकेटमैग्नेट, सुझाव देते हैं: कम, बेहतर, सरल।

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

यह संभवत: समाधान है जो मैं अल्पावधि में चला जाऊंगा। मैं इससे बचने की उम्मीद कर रहा था क्योंकि इसमें मौजूदा धारावाहिक चालकों का काफी कुछ फिर से लिखना शामिल है, लेकिन यह एक सुरुचिपूर्ण समाधान है जो थोड़े समय सीमा में मेरी क्षमताओं के भीतर है।
कीगन जय

1
@ जयकेगन - हाँ, यह शायद समाधान का सबसे तेज़ मार्ग है। PSoC और FPGA अगली परियोजना के लिए दृष्टिकोण हो सकता है।
रॉकेटमैग्नेट

6

आप संभवतः वायरलेस डेटास्टेट को डीकोड और बफर करने के लिए एक माइक्रोकंट्रोलर के बजाय एक एफपीजीए का उपयोग कर सकते हैं। फिर FPGAs बफ़र्स (जैसे SPI इंटरफ़ेस का उपयोग करके) को फ्लश करने के लिए ARM प्रोसेसर का उपयोग करें और USB Comm पोर्ट से कंटेंट को शिप करें। यह काम करता है, लेकिन एक FPGA को इतनी आसानी से बनाए रखने में सक्षम होना चाहिए जब तक आप इसे सेवा करने में सक्षम होते हैं यह गारंटी देने के लिए पर्याप्त है कि इसके हार्डवेयर बफ़र्स ओवररन नहीं करते हैं (या यदि आप प्रोटोकॉल के उच्च स्तर पर गिराए गए डेटा से निपट सकते हैं )।


यह लंबे समय में एक उत्कृष्ट समाधान हो सकता है। मैं उम्मीद कर रहा था कि मुझे सॉफ्टवेयर समाधानों के अलावा बहुत सारे डिजिटल लॉजिक / हार्डवेयर सॉल्यूशंस प्राप्त हुए हैं क्योंकि अब मेरे पास इन चीजों के बारे में जानने का एक बहाना है! मैं दुर्भाग्य से अभी तक FPGAs के साथ एक अनुभव नहीं है।
कीगन जे

6

आसान: एक PSoC5 माइक्रोकंट्रोलर का उपयोग करें ।

PSoC

आपके पास एक माइक्रोकंट्रोलर के उपयोग में आसानी है, साथ ही इसमें CPLD भी है, इसलिए आप वेरिलोग में अपने स्वयं के हार्डवेयर परिधीय लिख सकते हैं। बस अपने सीरियल डेटा डिकोडर को वेरिलॉग में लिखें, और यूएसबी पोर्ट को स्ट्रीम करने के लिए डीएमए का उपयोग करें।

इस बीच, शक्तिशाली 32-बिट एआरएम कोर अपने अंगूठे के इंस्ट्रूमेंट्स को घुमा सकता है।


अवलोकन पृष्ठ घड़ी की आवृत्तियों को सूचीबद्ध नहीं करता है, जिसने मेरा संदेह बढ़ा दिया है। डेटशीट में लिखा है 40MHz (मैंने 6MHz पर 6mA पर भी ध्यान दिया)। ओपी के पास अब जो है, उसका आधा हिस्सा है। "एमसीयू को कई अन्य कार्यों को भी संभालना पड़ता है", इसलिए यह इस बात पर निर्भर हो सकता है कि वे क्या हैं यह एक अच्छा विचार है या नहीं।
स्टीवनव

वे 67MHz तक जाते हैं। तो यह लगभग ओपी के वर्तमान प्रोसेसर के रूप में तेज़ है, सिवाय इसके कि ज्यादातर काम हार्डवेयर में किया जाएगा, सीपीयू को अधिक खाली समय के साथ छोड़ देगा।
राकेटमग्नेट

1
मैंने सभी डेटाशीट्स को नहीं देखा । पहले जो मैंने उठाया वह 40MHz ने कहा।
स्टीवनव

@stevenvh - उनके पास विभिन्न गति ग्रेड हैं। पीएन में तीसरा नंबर स्पीड ग्रेड है। (4 = 48 मेगाहर्ट्ज, 6 = 67 मेगाहर्ट्ज)।
रॉकेटमेग्नेट

1
यह FPGA के विचार की तरह लंबे समय में भी एक शानदार समाधान है। मैंने इस प्रकार की चिप के बारे में कभी नहीं सुना है, लेकिन यह मेरे बोर्ड के बाकी हिस्सों में एक चिप में बहुत अधिक कार्यक्षमता लाता है। भविष्य में इसका मतलब यह हो सकता है कि पूरा रिसीवर एक अंगूठे ड्राइव के आकार पर कुछ फिट बैठता है, जो कि मेरे प्रोजेक्ट लीड की दृष्टि है। मैं अगले सेमेस्टर में वेरिलॉग सीखूंगा।
कीगन जय

4

मुझे लगता है कि आपके पास बनाने के लिए एक क्लासिक इंजीनियरिंग पसंद है: तेजी से, सस्ते, काम करता है: दो उठाओ।

@ vicatcu का समाधान निश्चित रूप से एक अच्छा है, लेकिन अगर आप इसमें और अधिक हार्डवेयर नहीं जोड़ सकते हैं (और इसमें तेज प्रोसेसर भी शामिल है) तो आपको चुनाव करना होगा। यदि यह सीरियल लिंक आईएसआर में बैठना सबसे महत्वपूर्ण है, जब तक कि सभी बिट एकत्र नहीं हो जाते। प्रति बिट 180 निर्देश वास्तव में बुरा नहीं है, लेकिन सब कुछ करने की कोशिश न करें। जब आप एक हस्तांतरण की शुरुआत का पता लगाते हैं, तो हस्तांतरण पूरा होने तक स्पिन करें। परिणाम को फीफो में भर दें और फिर सामान्य प्रसंस्करण को फिर से शुरू करें।

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


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

3

सबसे पहले, मुझे यहाँ पहले से ही कुछ उत्तर पसंद हैं, और कुछ ने मेरे वोट प्राप्त किए हैं।

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

कॉर्टेक्स-एम 3 साइड बस प्राप्त एसपीआई डेटा पर बाधित होगा। यह आपके पिछले 400 KHz के बाहरी किनारे-ट्रिगर को 50 KHz तक घटा देता है।

दो कारणों से मैं यह सुझाव दे रहा हूं, क्योंकि कुछ अन्य विधियां (PSoC या जोड़ा FPGA) थोड़ी महंगी हैं (हालांकि यह संभावना कम वॉल्यूम शैक्षणिक परियोजना के लिए मायने नहीं रखती है) और क्योंकि यह आपको कुछ को संरक्षित करने की अनुमति दे सकती है आपके वर्तमान कोड की संरचना।

इसके अलावा, मुझे लगता है कि पीएसओसी का विचार डीएमए से यूएसबी पर स्थानांतरित होने वाले अपने स्वयं के कस्टम परिधीय के साथ बहुत बढ़िया है।


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

@ जयकेगन, क्लब में आपका स्वागत है!
जॉन एल

2

यदि आपका डेटा प्रारूप UART के समान है, लेकिन अप्रत्याशित-अभी तक लगातार बॉड दर पर, मेरा झुकाव CPLD का उपयोग करने के लिए आने वाले डेटा के प्रत्येक शब्द को SPI या मानक-async प्रारूप में परिवर्तित करने के लिए होगा। मुझे नहीं लगता कि CPLD के दायरे में सभी तरह से धकेलने की कोई जरूरत है। वास्तव में, असतत तर्क भी लगभग व्यावहारिक हो सकता है। यदि आप एक ऐसी घड़ी उत्पन्न कर सकते हैं जो आपके वांछित डेटा दर से 5x से अधिक एक स्मिद्गिन थी, तो आप कुछ फाटकों के साथ डिवाइड-बाय-फाइव और डिवाइड-बाय -16 काउंटर का उपयोग कर सकते हैं। डिवाइड-बाय-फाइव काउंटर की व्यवस्था करें ताकि जब भी इनपुट निष्क्रिय हो और डिवाइड-बाय -16 काउंटर शून्य पर हो तो उसे रीसेट कर दिया जाएगा। अन्यथा एक SPI क्लॉक पल्स उत्पन्न करें और डिवाइड-बाय -16 काउंटर को किसी भी समय विभाजित करें, डिवाइड-बाय-फाइव काउंटर हिट 2।

5x घड़ी को देखते हुए, कोई 16V8 (सबसे छोटा और सबसे सस्ता उपलब्ध प्रोग्रामेबल लॉजिक लॉजिक) का उपयोग करके SPI घड़ी उत्पन्न कर सकता है। 5x घड़ी उत्पन्न करने के लिए एक दूसरे 16V8 या 22V10 को भिन्नात्मक दर विभक्त के रूप में इस्तेमाल किया जा सकता है, या कोई थोड़ा बड़ा चिप (CPLD) का उपयोग कर सकता है और एक में सब कुछ कर सकता है।

संपादित करें / परिशिष्ट

कुछ और विचार करने पर, यदि कोई CPLD का उपयोग करने जा रहा है, तो कोई आसानी से सर्किट में कुछ अतिरिक्त वृद्धि जोड़ सकता है। उदाहरण के लिए, कोई व्यक्ति सर्किट स्टाल के लिए तर्क को आसानी से जोड़ सकता है, जब तक कि उसे स्टॉप बिट का कम से कम 1.5 बिट समय प्राप्त न हो जाए, उसके बाद 3.5 बिट टाइम स्टार्ट बिट; यदि इसे बहुत कम शुरुआत मिलती है, तो इसे स्टॉप बिट की तलाश में वापस जाना चाहिए। इसके अलावा, यदि कोई एसपीआई का उपयोग कर रहा है, तो कोई यह सुनिश्चित करने के लिए / सीएस सिग्नल का उपयोग कर सकता है कि प्राप्त डिवाइस सही ढंग से तैयार किए गए डेटा को देखेगा। यदि SPI डेटा प्राप्त करने वाला उपकरण 10-बिट फ़्रेम को संभाल सकता है, तो कोई भी सीधे ऐसे फ़्रेम भेज सकता है। अन्यथा, प्रत्येक दस-बिट फ्रेम को एलएसबी सेट (डेटा के 7 बिट्स) के साथ 8-बिट फ्रेम के रूप में भेजा जा सकता है, और सभी एलएसबी के स्पष्ट (डेटा के 3 बिट) के साथ एक फ्रेम; SPI घड़ी स्टॉप बिट्स के दौरान त्वरित किया जाएगा ताकि सभी डेटा भेजा जाएगा।

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

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


डिकोडिंग के लिए डिजिटल लॉजिक डिजाइन करते समय यह सब बहुत मूल्यवान होगा। मैं वास्तव में एसपीआई के रूप में आउटपुट करूंगा। अभी के लिए, मैं सिर्फ एक स्टैंडअलोन एमसीयू (समय की कमी) का उपयोग करके डिकोडिंग कर रहा हूं। धन्यवाद!
कीगन जय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.