ऑसिलोस्कोप से सीरियल डेटा कैसे पढ़ें


21

मेरे पास एक माइक्रोकंट्रोलर (PICAXE 20X2) और एक पॉट मीटर है। मैंने माइक्रो प्रोग्राम किया ताकि वह पीसी के सीरियल पोर्ट में पॉट मीटर के किसी भी बदलाव को भेज सके। जाहिर है कि यह एक 8bit ADC है। अब मेरे लिए दिलचस्प बात यह है कि यह सीरियल डेटा को आस्टसीलस्कप पर डिकोड करने में सक्षम हो रहा है।

यहां दो चित्र हैं, पहला है जब माइक्रो पीसी को "0" भेज रहा है और दूसरा तब है जब यह "255" भेजता है। 9600 बड का उपयोग करके डेटा प्रसारित किया जा रहा है और मैं उन्हें पीसी टर्मिनल पर प्राप्त कर सकता हूं।

पहले पी। सी यहाँ छवि विवरण दर्ज करें

दूसरी तस्वीर यहाँ छवि विवरण दर्ज करें

तो मेरा सवाल यह है कि क्या मैंने अपने दायरे में सही डेटा कैप्चर किया है, और दूसरा यह कि इस दालों को हेक्स या एएससीआई प्रारूप में कैसे पढ़ा और डिकोड किया जा सकता है। मेरा मतलब है कि इस बढ़ती और गिरती हुई दाल (0/1) को कैसे पढ़ें।

धन्यवाद।


3
क्रमिक रेखाएं तार्किक '1' अवस्था में निष्क्रिय होती हैं, इसलिए ध्यान रखें कि आपके तल पर 1 और यहाँ शीर्ष पर 0 है। मुझे पता है कि लोग पहले ही उस पर ताला लगा चुके हैं। मेरी टिप्पणी सीरियल डेटा के भविष्य की गुंजाइश-कब्रों को निर्देशित करने के उद्देश्य से है; आप चीजों की जांच कर सकते हैं ताकि निष्क्रिय अवस्था अधिक हो।
JustJeff

जवाबों:


14

पहले कुछ ओलिन के रूप में अच्छी तरह से देखा: स्तर क्या एक microcontoller आमतौर पर आउटपुट के विपरीत हैं:

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

चिंता की कोई बात नहीं, हम देखेंगे कि हम इसे इस तरह भी पढ़ सकते हैं। हमें बस यह याद रखना है कि स्कोप पर एक स्टार्ट बिट 1और स्टॉप बिट होगा 0

अगला, आपके पास इसे ठीक से पढ़ने के लिए गलत समय आधार है। 9600 बिट्स प्रति सेकंड (बॉड की तुलना में अधिक उपयुक्त इकाइयाँ, हालांकि बाद वाला गलत नहीं है) प्रति बिट 104 s है, जो आपकी वर्तमान सेटिंग में 1/10 वें डिवीजन का है। ज़ूम इन करें, और पहले किनारे पर एक ऊर्ध्वाधर कर्सर सेट करें। यह आपके स्टार्ट बिट की शुरुआत है। अगले किनारों में से प्रत्येक के लिए दूसरा कर्सर ले जाएँ। शाप देनेवालों के बीच का अंतर 104 s के गुणक का होना चाहिए । प्रत्येक 104 एक बिट है, पहले स्टार्ट बिट ( ), फिर 8 डेटा बिट, कुल समय 832 एस और एक स्टॉप बिट ( )। μ μ μμμμ1μ0

ऐसा नहीं लगता कि स्क्रीन डेटा भेजे गए से मेल खाता है 0x00। आपको एक संकीर्ण 1बिट (आरंभ बिट) देखना चाहिए, उसके बाद एक निम्न स्तर (936 s, 8 शून्य डेटाबिट्स + एक स्टॉप बिट)। आप भेज रहे हैं के लिए भी वही ; आपको एक लंबा उच्च स्तर (फिर से 936 s, इस बार स्टार्ट बिट + 8 डेटा बिट्स) देखना चाहिए । ताकि आपकी वर्तमान सेटिंग के साथ लगभग 1 विभाजन होना चाहिए, लेकिन ऐसा नहीं है जो मैं देख रहा हूं। ऐसा लगता है कि पहले स्क्रीनशॉट में आप दो बाइट भेज रहे हैं, और दूसरे चार में, 2 और 3 समान मूल्य के साथ। μμ
0xFFμ

guesstimates:

0b11001111 = 0xCF
0b11110010 = 0xF2

0b11001101 = 0xCD
0b11001010 = 0xCA
0b11001010 = 0xCA
0b11110010 = 0xF2


Olin को संपादित करना बिल्कुल सही है, यह ASCII जैसा कुछ है। तथ्य की बात के रूप में यह 1 ASCII का पूरक है।

0xCF ~ 0x30 = '0'
0xCE ~ 0x31 = '1'
0xCD ~ 0x32 = '2'
0xCC ~ 0x33 = '3'
0xCB ~ 0x34 = '4'
0xCA ~ 0x35 = '5'

0xF2 ~ 0x0D = [CR]

यह पुष्टि करता है कि स्क्रीनशॉट की मेरी व्याख्या सही है।


संपादित करें 2 (मैं लोकप्रिय अनुरोध पर डेटा की व्याख्या कैसे करता हूं))
चेतावनी: यह एक लंबी कहानी है, क्योंकि यह मेरे सिर में क्या होता है, जब मैं इस तरह से एक चीज को डिकोड करने की कोशिश करता हूं, तो यह एक प्रतिलेख है। यदि आप इससे निपटना चाहते हैं, तो केवल इसे पढ़ें।

उदाहरण: 1 स्क्रीनशॉट पर दूसरा बाइट, 2 संकीर्ण दालों के साथ शुरू। मैं दूसरे बाइट को उद्देश्य से शुरू करता हूं क्योंकि पहले बाइट की तुलना में अधिक किनारे हैं, इसलिए इसे सही करना आसान होगा। संकीर्ण दालों में से प्रत्येक 1/10 वें भाग के बारे में है, ताकि बीच में कम बिट के साथ 1 प्रत्येक उच्च हो। मैं भी इस से संकरा कुछ भी नहीं देखता, तो मुझे लगता है कि यह एक एकल बिट है। यही हमारा संदर्भ है।
फिर, 101निम्न स्तर पर लंबी अवधि के बाद । पिछले वाले की तुलना में दोगुना चौड़ा दिखता है, ताकि यह हो सके 00। उच्च निम्न जो फिर से दो बार चौड़ा है, इसलिए वह होगा 1111। अब हमारे पास 9 बिट्स हैं: एक स्टार्ट बिट ( 1) प्लस 8 डेटा बिट्स। तो अगला बिट स्टॉप बिट होगा, लेकिन क्योंकि यह है0यह तुरंत दिखाई नहीं दे रहा है। इसलिए इसे हम सभी को एक साथ रखकर 1010011110शुरू और रोक के सहित। अगर स्टॉप बिट शून्य नहीं होगा, तो मैंने कहीं न कहीं एक गलत धारणा बनाई होगी!
याद रखें कि एक UART सबसे पहले LSB (कम से कम महत्वपूर्ण बिट) भेजता है, इसलिए हमें 8 डेटा बिट्स को उल्टा करना होगा: 11110010= 0xF2

अब हम एक एकल बिट की चौड़ाई, एक डबल बिट और 4 बिट अनुक्रम जानते हैं, और हमारी पहली बाइट पर एक नजर है। पहली उच्च अवधि (विस्तृत नाड़ी) 1111दूसरी बाइट की तुलना में थोड़ी चौड़ी है , इसलिए यह 5 बिट्स चौड़ी होगी। प्रत्येक के बाद निम्न और उच्च अवधि अन्य बाइट में डबल बिट जितनी चौड़ी होती है, इसलिए हम प्राप्त करते हैं 111110011। फिर से 9 बिट्स, इसलिए अगला एक कम बिट, स्टॉप बिट होना चाहिए। यह ठीक है, इसलिए यदि हमारा मार्गदर्शन सही है तो हम फिर से डेटा बिट्स को उल्टा कर सकते हैं: 11001111= 0xCF

फिर हमें ओलिन से इशारा मिला। पहला संचार 2 बाइट्स लंबा, 2 बाइट्स दूसरे की तुलना में छोटा होता है। और "0" भी "255" से 2 बाइट्स छोटा है। तो यह शायद ASCII जैसा कुछ है, हालांकि बिल्कुल नहीं। मैं यह भी ध्यान देता हूं कि "255" का दूसरा और तीसरा बाइट एक ही है। महान, यह डबल "5" होगा। हम ठीक कर रहे हैं! (आपको समय-समय पर खुद को प्रोत्साहित करना होगा।) "0", "2" और "5" को डिकोड करने के बाद, मुझे लगता है कि पहले दो के कोड के बीच 2 का अंतर है, और अंतिम के बीच 3 का अंतर है। दो। और अंत में मैंने देखा कि 0xC_पूरक है 0x3_, जो ASCII में अंकों के लिए पैटर्न है।


सुझावों के लिए धन्यवाद, मैं सही तरंग को पकड़ने और अपने प्रश्न को अपडेट करने की कोशिश करूंगा।
सीनू

धन्यवाद, क्या आप उस चित्र को चिन्हित करना चाहेंगे जैसे आप उन डेटा को कैसे खोजते हैं?
सीनू

1
@ Sean87 - यह एक लंबी कहानी बन गई है, मैंने इसे अपने जवाब में जोड़ दिया। यह मेरे ऐसा करने के तरीके को दिखाता है, दूसरे अलग-अलग रास्तों पर चल सकते हैं। चिंता मत करो अगर आपको लगता है कि आपने इसका आधा हिस्सा नहीं देखा होगा; इसका अधिकांश अनुभव और कल्पना मात्र है। इसमें कोई विशेष खुफिया शामिल नहीं है।
स्टीवनवह जूल 31'11

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

7

कुछ जोड़ नहीं है। आपके संकेत 3.3V शिखर से शिखर तक दिखाई देते हैं, जिसका अर्थ है कि वे माइक्रो से सीधे बाहर हैं। हालाँकि, माइक्रोकंट्रोलर UART का स्तर हमेशा (लगभग) उच्च और सक्रिय कम निष्क्रिय होता है। आपके सिग्नल उससे उलटे हैं, जो समझ में नहीं आ रहा है।

अंततः इस डेटा को एक पीसी में लाने के लिए, इसे RS-232 के स्तर में बदलना होगा। यह एक पीसी COM पोर्ट को देखने की उम्मीद है। RS-232 निष्क्रिय कम और सक्रिय उच्च है, लेकिन निम्न -5 वी से नीचे है और उच्च + 5 वी से ऊपर है। सौभाग्य से इसके लिए चिप्स हैं जो विशिष्ट माइक्रोकंट्रोलर तर्क स्तर UART के संकेतों और RS-232 के बीच परिवर्तित करना आसान बनाते हैं। इन चिप्स में आपके 3.3V बिजली की आपूर्ति से RS-232 वोल्टेज बनाने के लिए चार्ज पंप हैं। कभी-कभी इन चिप्स को सामान्य रूप से "MAX232" के रूप में संदर्भित किया जाता है क्योंकि यह उस प्रकार की एक प्रारंभिक और लोकप्रिय चिप के लिए एक भाग संख्या थी। जब आप जाहिरा तौर पर 3.3V बिजली का उपयोग कर रहे हैं, तो आपको एक अलग संस्करण की आवश्यकता है, न कि 5V की। हम एक उत्पाद बनाते हैं जो मूल रूप से कनेक्टर्स वाले बोर्ड पर इन चिप्स में से एक है। Http://www.embedinc.com/products/rslink2 पर जाएंऔर इस तरह के एक चिप को हुक करने का एक उदाहरण देखने के लिए योजनाबद्ध को देखें।

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

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

तो इस सब से आपको यह देखने में सक्षम होना चाहिए कि पहला ट्रेस कम से कम दो बाइट्स भेजते हुए प्रतीत होता है, और अंतिम शायद 5 जैसा दिखता है।

यदि आप निशान के समय पैमाने का विस्तार करते हैं तो यह मदद करेगा। इस तरह से आप माप सकते हैं कि वास्तव में थोड़ा सा समय क्या है। यह आपको वास्तव में 9600 बॉड (104 verify / बिट) सत्यापित करने की अनुमति देगा, और आपको एक कैप्चर के व्यक्तिगत बिट्स को डीकोड करने देगा। जैसा कि अभी है, बिट्स कहां हैं, यह देखने के लिए पर्याप्त संकल्प नहीं है, और इसलिए वास्तव में डिकोड किया जाता है कि क्या भेजा जा रहा है।

जोड़ा गया:

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

वैसे भी, समय के पैमाने का विस्तार करें और हम वही भेज सकते हैं जो इसे भेजा जा रहा है।


1
स्टॉप बिट (और यह बिट के विपरीत होने के नाते) भी एक नए प्रसारण की शुरुआत में बढ़त हासिल करता है।
स्टीवनवह

@ जल्द: हाँ, मुझे एहसास हुआ कि मैंने अपने उत्तर को फिर से पढ़ने पर छोड़ दिया और इसे एक संपादन में जोड़ा, संभवत: उसी समय जब आप अपनी टिप्पणी लिख रहे थे।
ओलिन लेथ्रोप

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

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

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

1

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

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


हमेशा एक स्टार्ट बिट होता है और हमेशा कम से कम एक स्टॉप बिट होता है। अतिरिक्त स्टॉप बिट्स हो सकते हैं, लेकिन ये बाइट्स के बीच मृत समय से अप्रत्यक्ष हैं। पुराने यांत्रिक डिकोडर को तंत्र को रीसेट करने के लिए समय की अनुमति देने के लिए कभी-कभी दो स्टॉप बिट्स की आवश्यकता होती है। आजकल लगभग हमेशा 8 डेटा बिट और कोई समता बिट नहीं होते हैं, लेकिन जैसा कि आप कहते हैं, यह भिन्न हो सकता है।
ओलिन लेथ्रोप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.