UART की आवृत्तियां कितनी महत्वपूर्ण हैं?


17

मैं 16 MIPS (PLL 4x, 2 चक्र निर्देशों) पर अपने माइक्रोकंट्रोलर को चलाने के लिए 8 मेगाहर्ट्ज क्रिस्टल का उपयोग करने जा रहा हूं। हालांकि, 8 मेगाहर्ट्ज किसी भी UART आवृत्तियों AFAIK में विभाजित नहीं होता है ... तो ये आवृत्तियों कितने महत्वपूर्ण हैं? मेरी योजना 115,200 बॉड का उपयोग करने की है।

क्या UART ± 1% के भीतर चल सकता है? यदि यह काम नहीं करता है, तो मुझे किस आवृत्ति का उपयोग करना चाहिए? (मैं अधिकतम प्रसंस्करण गति के लिए जितना संभव हो उतना 16 MIPS के पास प्राप्त करना चाहूंगा।) अगर यह मायने रखता है, तो मैं PIC24FJ64GA004 का उपयोग कर रहा हूं।

जवाबों:


13

यदि आप 1% के भीतर हैं, तो आपको ठीक होना चाहिए।

मान लें कि आपका UART 16x ओवरसैंपलिंग घड़ी का उपयोग करता है, उदाहरण के लिए, आप इसे 1,843,200 हर्ट्ज से 16x 115,200 बीपीएस ओवरसैप कर सकते हैं। (इस तरह से निरीक्षण करना काफी आम है) इससे UART को स्टार्ट बिट के गिरते हुए किनारे से 8 ओवर-क्लॉक की गिनती करने की सुविधा मिलती है, इसलिए यह बिट कोशिकाओं के केंद्र को +/- ओवर क्लॉक की एक अवधि के भीतर पता लगा सकता है, के बाद यह नमूना देखने के लिए निर्धारित करने के लिए ओवर-क्लॉक की 16 अवधियों की गणना करता है।

यदि आप मानते हैं कि यह स्टार्ट बिट के केंद्र को हिट कर सकता है, तो 8 डेटा बिट्स में सही बिट कोशिकाओं में सीरियल डेटा का नमूना रखने के लिए, घड़ी की आवृत्ति को (8-0.5) / 8 और (8 + 0.5) के बीच रहना होगा ) / 8, या +/- 6.25% इच्छित बिट दर। उच्च ओवरक्लॉकिंग स्टार्ट बिट के केंद्र को हिट करने की आदर्श स्थिति के करीब हो जाती है, लेकिन 8x या 16x आमतौर पर इतना करीब है कि आप मान सकते हैं कि 5% बेमेल काम करेगा।

हालाँकि, आप दूसरी तरफ आवृत्ति पर पूरी तरह से भरोसा नहीं कर सकते। यदि आप किसी ऐसे उपकरण से कनेक्ट होते हैं जो 4% तेज़ है जो किसी उपकरण से 4% धीमा है, तो आपको समस्या होगी। मैं कम से कम एक मामले में चला गया हूं, एक पीसी थोड़ा धीमा चल रहा था, और एक उपकरण थोड़ा तेज, और दो केवल मामूली संवाद कर सकते थे, हालांकि एक ही उपकरण अन्य पीसी के साथ ठीक था, और पीसी अन्य के साथ ठीक था उपकरण। (O-scoped about 112kbps and 119kbps) इस कारण से यह नाममात्र आवृत्ति को यथासंभव निकट से मारने की कोशिश करना अच्छा है। मैंने कभी भी नाममात्र के 2% के भीतर कुछ भी नहीं देखा है एक समस्या है।

सामान्य बात यह है कि मास्टर घड़ी की दर का उपयोग करना है जो कि बॉड दर के कई गुना अधिक यूएटी से अधिक-नमूना दर प्रदान करता है। उदाहरण के लिए, यदि आप CPU को 8MHz पर चलाना चाहते हैं, तो आप एक 7.3728MHz ऑसिलेटर का उपयोग कर सकते हैं, जिसे 1.8432MHz प्राप्त करने के लिए 4 से विभाजित किया जा सकता है, जो कि 16 गुना 115200 के बराबर होता है।


8 मेगाहर्ट्ज को 69 से विभाजित करके 115,942 प्राप्त किया जा सकता है जो कि। 1% के भीतर है। मुझे आश्चर्य है कि अगर PIC अपने बॉड दर जनरेटर के लिए इस प्रकार के विभाजन का समर्थन करता है। मैं उम्मीद कर रहा हूँ, लेकिन मुझे नहीं लगता कि यह होगा।
थॉमस ओ

PIC में बॉड रेट जनरेटर है। यह अच्छी तरह से काम करेगा, लेकिन केवल 9600 की तरह कम बॉड के लिए, यह 115,200 की तरह उच्च बॉड के लिए काम नहीं करेगा, यह बहुत ही असंभव हो जाता है।
थॉमस ओ

क्या आपको लगता है कि मैं एक 7.3728 मेगाहर्ट्ज क्रिस्टल का उपयोग कर सकता हूं? (मैं आंतरिक M.३ M मेगाहर्ट्ज थरथरानवाला का उपयोग नहीं करने जा रहा हूं, क्योंकि मैं सटीक चाहता हूं।) यह मुझे ६४ से विभाजित करने के लिए ११५,२०० की UART आवृत्ति प्राप्त करने की अनुमति देता है। यह सबसे तेज़ है जो मैं उच्च सहिष्णुता के साथ जा सकता हूं।
थॉमस ओ

1
अगर आपका UART इसका समर्थन करता है, तो इसे ओवरक्लॉक (जैसे 16x) देना बेहतर होगा, ताकि यह स्टार्ट बिट को ओवरलैप कर सके और बिट सेल का केंद्र ढूंढ सके, लेकिन 115K के लिए 16x को 1% के भीतर प्राप्त करना एक चुनौती हो सकती है, जब तक कि यह एक चुनौती न हो। आप एक बॉड-कई क्रिस्टल का उपयोग करते हैं।
JustJeff

4

1% @JustJeff उल्लेखों की आवश्यकता नहीं है। अधिकांश UART अंतिम बिट पर आधा बिट त्रुटि की अनुमति देते हैं। अधिकांश समय में एक फ्रेम में 10 बिट्स के लिए 1 स्टार्ट बिट, 8 डेटाबिट्स और 1 स्टॉप बिट होते हैं। 10 बिट्स पर आधा सा 5% है (जस्टजेफ के 6.25% स्टार्ट को नहीं लेते हैं और खाते में बिट को रोकते हैं)।


1
मुझे गलत मत बोलो; "1%", मेरा कथन था कि इसे प्राप्त करना कठिन हो सकता है। "6.25%" मान रहा था कि आप स्टार्ट बिट के केंद्र से टकराएंगे, और ऐसी परिस्थितियों में रिसीवर-बनाम-ट्रांसमीटर घड़ी दरों में अधिकतम स्वीकार्य अंतर होगा ।
जस्टजेफ

1

जस्टजेफ़ स्टार्ट बिट के बारे में भूल गया, लेकिन स्टीवन ने स्टॉप बिट को जोड़ा। 8 डेटा बिट्स के सामान्य प्रोटोकॉल को मानते हुए, 1 स्टार्ट बिट, और नो पैरिटी बिट, (स्टॉप बिट्स की संख्या कोई फर्क नहीं पड़ता), प्रारंभ बिट के प्रमुख किनारे से 8 बिट के केंद्र तक 8 1/2 बिट बार हैं अंतिम डेटा बिट। आम तौर पर, आप चाहते हैं कि रिसीवर 1/4 बिट समय के भीतर इस अंतिम बिट का नमूना ले। ध्यान दें कि 1/2 बिट थ्रेशोल्ड को विफल करने की गारंटी है। वहाँ के पास कुछ भी अवास्तविक हो जाता है क्योंकि वहाँ हमेशा कुछ विद्युत शोर और घबराहट होती है।

1/4 को 8 1/2 = 2.94% से विभाजित किया गया।

जैसा कि जस्टजेफ ने उल्लेख किया है, अधिकांश यूएआरटी कार्यान्वयन वास्तव में एक अतुल्यकालिक 16x घड़ी के साथ आने वाले डेटा का नमूना लेते हैं। यह एक और 1/16 बिट समय अनिश्चितता जोड़ता है क्योंकि वह त्रुटि है जिसके साथ प्रारंभ बिट के अग्रणी किनारे को मापा जा सकता है। 8 1/2 बिट्स में से 1/16 बिट समय एक और .74% है। वह पहले गणना किए गए त्रुटि बजट से बाहर आता है। आप अपने केंद्र के 1/4 बिट समय के भीतर अंतिम बिट का नमूना लेने के लिए 2.2% अनुमत घड़ी बेमेल के साथ समाप्त होते हैं।

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


मैं सहमत नहीं हूं कि स्टॉप बिट्स कोई मायने नहीं रखते। में इस सवाल का संचार विफल हो गया क्योंकि बंद सा ग़लती से एक निम्न स्तर के लिए स्थापित किया गया था।
स्टीवनव

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

मैंने तीन बार स्टार्ट बिट का जिक्र किया, क्या मैंने नहीं किया?
JustJeff

@OlinLathrop: बंद सा सुनिश्चित करना है कि जब एक बाइट जिसका MSB है भेजने शून्य वहाँ होगा आवश्यक है हो अगले शुरू बिट के लिए एक गिरते धार। अलग-अलग डिवाइस उन मामलों में अलग-अलग व्यवहार करते हैं, जहां डेटा लाइन कम होने से पहले जाती है, लेकिन अगर शून्य बाइट्स के एक संचरित अनुक्रम को रोकना नहीं था, तो कोई उपयोगी समय जानकारी नहीं होगी। इस तरह की आवश्यकता को अन्य माध्यम से पूरा किया जा सकता है, जिसमें एक निश्चित फ्रेमिंग ओवरहेड 25% से कम है, लेकिन मैं ऐसा करने वाले किसी व्यक्ति से अनजान हूं।
सुपरकैट

1

एक बिंदु का अभी तक उल्लेख नहीं किया गया है कि कुछ उपकरण प्राप्त होने वाले डेटा के प्रत्येक बाइट के लिए डेटा की बाइट प्रसारित करने की अपेक्षा करते हैं। यदि इस तरह के उपकरण को लगातार डेटा खिलाया जाता है, तो इसकी बॉड दर ट्रांसमिटिंग डिवाइस की तुलना में 0.1% धीमी है, और इसमें थोड़ा सिकुड़ा हुआ स्टॉप बिट्स भेजने की कोई सुविधा नहीं है, इसका उत्पादन प्रत्येक 1000 लगातार के लिए एक बाइट को पीछे छोड़ देगा बाइट्स जो अंदर आते हैं। यदि डिवाइस बफ़रिंग के 16 बाइट्स तक सीमित है, तो यह लगभग 16,000 पास होने के बाद डेटा की बाइट छोड़ देगा और इसके बाद प्रति हजार बाइट लगभग एक बाइट छोड़ देगा। यह ध्यान देने योग्य है कि तथाकथित "1200 बॉड" मोडेम वास्तव में 1200 बिट्स / सेकंड से थोड़ा अधिक की दर से संचालित होता है (मुझे लगता है कि यह लगभग 1202 है) ठीक इसी कारण से (ताकि भले ही ट्रांसमीटर 0.15% तेजी से हो। हो सकता है,

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