UART पर रहस्यमय RX दालों OS X Arduino ड्यू पर कनेक्ट होते हैं


14

Arduino IDE 1.6.8, Arduino ड्यू, मैक OS 10.11.3

मैं RX लाइन पर आठ रहस्यमय दालों को देख रहा हूं, जब मैं कई क्लाइंट लाइब्रेरी (पायथन, जावास्क्रिप्ट के साथ-साथ आईडीई में अंतर्निहित सीरियल मॉनिटर) का उपयोग करके सीरियल पोर्ट से जुड़ता हूं। लॉजिक प्रो 16 के साथ 1MS / s में सैंपल लिए गए लगभग 78-79स एप्पी।

रहस्य दालें

57600 बॉड में व्याख्या किए जाने पर ये आठ दालें फर्मेटा फर्मवेयर को जाम कर देंगी। और वे हर कनेक्शन पर होते हैं।

यह Arduino 1.6.8 IDE की एक नई इंस्टॉल का उपयोग कर रहा है और कई स्केच के साथ (सामान्य "ब्लिंक" स्केच भी इसे पुन: उत्पन्न करेगा)।

मेरी मशीन पर रिप्रो स्टेप्स:

  1. कोई भी स्केच स्थापित करें
  2. यदि आप इसे पकड़ना चाहते हैं तो एक लॉजिक विश्लेषक शुरू करें
  3. सीरियल मॉनीटर पर जाएं। मेरे पास 57600 बॉड, न्यूलाइन लाइन समाप्त होने के लिए कॉन्फ़िगर किया गया है, लेकिन यह कोई फर्क नहीं पड़ता
  4. यदि आप चाहते हैं, तो चरण 3 को बंद और दोहराएं
  5. नोट हर बार जब आप सीरियल पोर्ट से कनेक्ट होते हैं तो दालें

इसके निदान के लिए कोई सुझाव? ऐसा लगता है कि यह किसी तरह से सीरियल ड्राइवर-स्तर है।


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

1
स्रोत को ट्रैक करने के संदर्भ में, एक अन्य धारावाहिक क्लाइंट प्रोग्राम, एक अन्य कंप्यूटर / ऑपरेटिंग सिस्टम, एक अन्य यूएसबी-सीरियल डिवाइस, आदि की कोशिश करना उपयोगी होगा ...
क्रिस स्ट्रैटन

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

2
जब आप डिस्कनेक्ट करते हैं तो आपको एक भी मिलता है। कनेक्शन बॉड दर का नाड़ी की लंबाई पर कोई प्रभाव नहीं पड़ता है। मेरा संदेह यह है कि यह ATMega16U2 का फर्मवेयर है जो इसे कर रहा है (या जो भी चिप जो भी संस्करण पर है)।
Majenko

1
जब आप सीरियल मॉनिटर शुरू करते हैं, तो सॉफ्टवेयर arduino मॉड्यूल को रीसेट करता है। अगर arduino मॉड्यूल में बूटलोडर है, तो मुझे लगता है कि ये STK500 प्रोटोकॉल सिग्नल हैं।
मर्ट गुल्सोइ

जवाबों:


1

कम:

ATMEGA16U2 फ़र्मवेयर ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial-Arduino-usbserial.c ) को देखते हुए मुझे लगता है कि जब आप कॉन्फ़िगर / परिवर्तन सेटिंग्स बदलते हैं। USB सीरियल सीरियल पोर्ट का उपयोग करता है, USART को रीसेट किया जाता है। यह तब भी होता है जब आप Arduino Serial Monitor खोलते हैं (इसे क्रमिक गति, आदि को कॉन्फ़िगर करना होगा)। यह आपके स्पाइक का कारण बनता है।

लंबा:

फ़ंक्शन को देखें:

void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)

आप देखेंगे कि कुछ पंक्तियों के बाद, यह अपने रजिस्टरों को शून्य करके USART को रीसेट करता है:

/* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
    UCSR1B = 0;
    UCSR1A = 0;
    UCSR1C = 0;

वर्तमान ATMEGA16U2 डेटाशीट के पृष्ठ 168 पर, आप पाएंगे कि, UCSR1B के बिट 3 (TXEN1) को सेट करके, आप सामान्य पोर्ट ऑपरेशन (यानी यह आउटपुट हो जाता है) को ओवरराइड करके, ट्रांसमीटर को सक्षम करते हैं। डेटाशीट का हवाला देते हुए:

इस बिट को लिखने से USART ट्रांसमीटर सक्षम होता है। जब सक्षम हो तो ट्रांसमीटर TxDn पिन के लिए सामान्य पोर्ट ऑपरेशन को ओवरराइड करेगा। ट्रांसमीटर को निष्क्रिय करना (TXENn को शून्य लिखना) तब तक प्रभावी नहीं होगा, जब तक कि चल रहे और लंबित प्रसारण पूरे न हो जाएं, यानी जब Transmit Shift Register और Transmit Buffer Register में संचारित होने के लिए डेटा नहीं होगा। अक्षम होने पर, ट्रांसमीटर अब TxDn पोर्ट को ओवरराइड नहीं करेगा।

इसलिए, UCSR1B = 0;आपको लिखकर अब TXD1 पिन को ओवरराइड नहीं करना चाहिए, जो इनपुट के रूप में कार्य करेगा।

ATMEGA16U2 TXD ATSAM3X8E की RX लाइन से जुड़ा है। सामान्य ऑपरेशन में, UART सक्षम होने के साथ, यदि कोई डेटा प्रसारित नहीं किया जा रहा है, तो वह रेखा उच्च रहती है। यदि आप UART को अक्षम करते हैं, तो वह विशेष पंक्ति 1 से अधिक चालक नहीं है। चूंकि आरंभीकरण कोड उस पिन पर पुल-अप सेट नहीं करता है (और न ही इसे आउटपुट के रूप में कॉन्फ़िगर किया गया है), पिन एक फ्लोटिंग इनपुट बन जाता है, और कोई भी रिसाव जीएनडी या यहां तक ​​कि आपकी जांच का इनपुट प्रतिबाधा (जो आपके पिन और जीएनडी के बीच है), धीरे-धीरे तर्क स्तर को 0 पर लाएगा।

इस समस्या को ओवरराइड करने के लिए, आपको या तो होना चाहिए: 1) ATMEGA16U2 फर्मवेयर को संशोधित करें, उस पिन को OUTPUT के रूप में सेट करके, मूल्य 1. 2 के साथ) उस पिन पर पुल-अप को सक्षम करके ATMEGA16U2 फर्मवेयर को संशोधित करें। 3) (सुझाव) ATSAM3X8E पर RX लाइन पर पुल-अप सक्षम करें।

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