सीरियल नौसिखिया: मैं सिर्फ तारों को हुक क्यों नहीं कर सकता?


14

मैं किसी भी चीज़ को बहुत समझे बिना एक USB-Serial कनवर्टर पर Arduino- एस्क कोड का उपयोग करके एक ATtiny85 से पीसी तक संचारित करने की कोशिश कर रहा हूं। मैं स्तब्ध था और उसने कहा कि यह काम नहीं कर रहा है।

मैंने पुष्टि की कि टेंट अपने एक पिन पर वोल्टेज को टिमटिमा रहा है, लेकिन जब मैं उस पिन को यूएसबी-सीरियल केबल पर संचारित या प्राप्त करने के लिए जोड़ता हूं और टर्मिनल प्रोग्राम का उपयोग करके सुनने का प्रयास करता हूं, तो मुझे कुछ नहीं मिलता है।

मुझे यकीन नहीं है कि कैसे बताया जाए कि कौन सा हिस्सा टूट गया है।

क्या धारावाहिक प्रसारित करने के लिए मुझे VCC, GND और TXD से अधिक की आवश्यकता है?


विवरण:

छोटे के लिए कोड Arduino वातावरण में लिखा गया है और इसी तरह का कोड सभी 4 "PORTB" पिन को कम से कम एलईडी के अनुसार सफलतापूर्वक ब्लिंक करता है। मैं HLT और Saporetti से कोड का उपयोग करता हूं, ताकि मैं इसे प्रोग्राम करने के लिए C ++ की Arduino बोली का उपयोग कर सकूं। कार्यक्रम अभी भी एक के तहत आता है।

#include <SoftwareSerial.h>

SoftwareSerial s(0,1); //receive on "0", and transmit on "1" aka "PB1" aka pin 6

void setup() { s.begin(4800); } // assuming 1Mhz, 4800 baud
void loop() { s.println(millis()); } // transmit something at every opportunity

इसमें बहुत सारे अनुवाद शामिल हैं, लेकिन कोड बहुत बुनियादी है। कोड जो बॉड दर सेट करता है, वह 1MHz मान लेता है, लेकिन सौभाग्य से मेरे अटारी में फ़ैक्टरी डिफ़ॉल्ट फ़्यूज़ हैं और 1MHz पर चलता है। किसी भी दर पर, पिन 6 एलईडी के अनुसार अपने वोल्टेज को टिमटिमा रहा है।

इसलिए मैं FTDI USB- सीरियल कनवर्टर के "ftdi" छोर को छोटे से जोड़ने के लिए छोटे तारों का उपयोग करता हूं : GND को काला, VCC को लाल, नारंगी को 6. मैं पीसी पर प्रोग्राम "मिनिकॉम" को खोलता हूं, बॉड सेट करता हूं 4800 तक की दर और प्रतीक्षा करें, कुछ नहीं के लिए। जब मेरे बोर्डुइनो से बात की जाती है , तो उसे कोई परेशानी नहीं होती है।

FTDI कनवर्टर केबल में निम्न पिनआउट है: काला GND है, भूरा "CTS" है, लाल VCC (+ 4.98V) है, नारंगी "TXD" है, पीला "RXD" है, हरा "RTS" है।

अगर मैं पीसी से छोटे को प्रसारित करना चाहता हूं, तो क्या मुझे "TXD" या "RXD" पर वोल्टेज को टिमटिमाना चाहिए? दूसरे शब्दों में, गुलाम से मेजबान तक, या मेजबान से दास को प्रेषित करने के लिए संचारित तार है?

मैंने वास्तव में दोनों की कोशिश की, न ही काम किया। मैंने अब तक एक डॉलर के उपकरण से कम तले हैं, और मैं अहंकारी हो रहा हूं, इसलिए मैं सिर्फ केबल में तारों को प्लग करता हूं। शायद मैं "सीटीएस" और "आरटीएस" तारों को अनदेखा करने वाला नहीं हूं?

क्या मुझे किसी अन्य तारों का उपयोग करने की आवश्यकता है? क्या आरटीएस और सीटीएस कुछ भी करते हैं?

हार्डवेयर एक ATTiny85-PU (DIP-8 पैकेज है, जो 1MHz पर चल रहा है, 20MHz को रेट किया गया) 4.98V पर USB द्वारा संचालित है। होस्ट पीसी एक मैकबुक है, और यह सभी चीजों को सफलतापूर्वक करता है, जिसमें ArduinoISP का उपयोग करके एटीटीनी को अपने छोटे से दिल को झपकी देने के लिए प्रोग्राम करना शामिल है।

जवाबों:


9

आप निश्चित रूप से सिर्फ TX और GND का उपयोग करके डेटा संचारित कर सकते हैं।

सबसे पहले, आप ATtiny85 TX लाइन को FTDI RX लाइन (TTL-232R पर पीला) हुक करना चाहते हैं। सुनिश्चित करें कि USB एडॉप्टर 5V को संभाल सकता है - मुझे यकीन है कि 3.3V TTL-232R भी 5V सहिष्णु है।

SoftwareSerial के उदाहरण पृष्ठ के अनुसार , आपको अपने सेटअप फ़ंक्शन में TX और RX लाइनों की दिशा निर्धारित करने की आवश्यकता है:

// include the SoftwareSerial library so you can use its functions:
#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3
#define ledPin 13

// set up a new serial port
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
byte pinState = 0;

void setup()  {
  // define pin modes for tx, rx, led pins:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
}

बॉड्रेट आपके मामले में 4800 होगा। SoftwareSerial लाइब्रेरी सीटीएस और आरटीएस का समर्थन नहीं करती है, इसलिए सुनिश्चित करें कि आप होस्ट सॉफ़्टवेयर पर उनका उपयोग नहीं कर रहे हैं।

की जाँच करें संदर्भ अधिक जानकारी के, जहां वे कुछ संभावित समय मुद्दे हैं जो अगर आप छोटे पर आंतरिक दोलक का उपयोग कर 1MHz पर चला रहे हैं exacerbated किया जा सकता है के बारे में बात करने के लिए पेज।


धन्यवाद! संदर्भ पृष्ठ ने स्पष्ट किया कि 4800 बहुत तेज़ था, इसलिए मैं 300 बॉड में गिरा और चीजें "बेहतर" हैं। पिनकोड ट्रांसमिट को प्रभावित नहीं करता है, लेकिन मैंने चीजों को स्पष्ट करने के लिए इसे किसी भी तरह से जोड़ा। मैं अब बिट्स के बीच देरी को बदलने की कोशिश कर रहा हूं जब तक कि कुछ प्राप्त नहीं हो जाता। Minicom बस दिखा रहा है? अभी निशान। सबसे खराब स्थिति, मेरे 16mhz और 20mhz ऑसिलेटर शुक्रवार को आते हैं।
जैक श्मिट

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

ओह, पीले तार को इंगित करने के लिए भी धन्यवाद, मेरे छोटे को संचारित करने के लिए है। नारंगी तार बहुत झिलमिलाहट लगता है (पीसी से एक एलईडी को हुक)। क्या पीसी संचारित हो रहा है, या यह "अधिकांश समय" पर रहता है?
जैक श्मिट

हां, जब ट्रांसलेट करते समय निष्क्रिय और झिलमिलाहट हो तो HI रहना चाहिए - मुझे यकीन नहीं है कि अगर एफडीडीआई एक एलईडी ड्राइव करने के लिए पर्याप्त वर्तमान आपूर्ति करने में सक्षम है। AVR ठीक होगा, लेकिन मैं FTDI-TX लाइन से एलईडी को हटा दूंगा। क्रिस्टल को समय के मुद्दों को ठीक करना चाहिए (लेकिन आपको आंतरिक थरथरानवाला से स्विच करने के लिए फ़्यूज़ सेट करने की आवश्यकता है)।
पीटर गिब्सन

अभी भी इस पर काम कर रहा हूं, लेकिन मुझे यकीन है कि यह एक समय की समस्या है या एक भयानक Arduino-on-ATTiny सॉफ़्टवेयर समस्या है। कुछ मध्य 2-3 बाइट्स प्राप्त किए जा रहे हैं (लेकिन प्रदर्शित नहीं) और बाकी को 0x80 के रूप में दिखाया गया है। मैं क्रिस्टल के लिए प्रतीक्षा करते समय अपना (तुच्छ) AVR सॉफ्ट सीरियल भेजने का फंक्शन लिखने वाला हूं। क्या यह देखने के लिए कुछ आसान / सस्ता तरीका है कि क्या भेजा जा रहा है? मेरी पुरानी आंखों के लिए 300 बॉड अभी भी बहुत तेज है।
जैक श्मिट

7

तो उत्तर ऐसा प्रतीत होता है: आप बस तारों को हुक कर सकते हैं, वास्तव में सिर्फ जीएनडी (काला) और आरएक्सडी (पीला), और जब तक सॉफ्टवेयर अच्छा है तब तक सब कुछ काम करता है।

जो चीजें मायने नहीं रखती थीं:

  • आंतरिक ऑसिलेटर ठीक काम करता है। यह मेरे सीमित परीक्षण के लिए अपेक्षाकृत स्थिर प्रतीत होता है। 9600 बॉड में जो भी समस्याएं हैं वे नगण्य हैं।

  • संकेतों पर यूएसबी पावर का उपयोग करना ठीक काम करता है। आप एक अलग वोल्टेज स्रोत (एक साझा जमीन) का उपयोग कर सकते हैं, लेकिन FTDI केबल पूरी तरह से 3V और 5V दोनों संकेतों को पढ़ता है। मैंने एक बैटरी पैक को कनेक्ट किया, - एफटीडीआई और जीएनडी दोनों के जीएनडी को, छोटे वीसीसी को +, और इसने ठीक काम किया। हालांकि एफटीडीआई (यूएसबी पावर 5 वी) के वीसीसी (लाल) का उपयोग करना बहुत सरल और प्रभावी है।

जो चीजें मैंने गलत कीं:

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

  • न तो SoftwareSerial और न ही NewSoftSerial एक ATtiny के साथ बॉक्स से बाहर काम करता है। जबकि ATmega328p और ATtiny85 काफी समानताएं साझा करते हैं, लेकिन पर्याप्त अंतर हैं कि नई चिप के लिए संकलन करने के लिए पुराने सॉफ़्टवेयर को प्राप्त करना पर्याप्त नहीं है।

  • धीमी बॉड दरें चीजों को ठीक नहीं करती हैं। 300 बॉड को अधिक जटिल देरी दिनचर्या की आवश्यकता होती है क्योंकि बिट्स के बीच चक्रों की संख्या 8 बिट काउंटर से अधिक होती है। 9600 बॉड ठीक काम करता है, और उच्च बॉड दरें उल्लेखनीय हैं।

  • सी में समय आलोचनात्मक कोड लिखने से सावधान रहें, विशेष रूप से इनलाइन फ़ंक्शन। निष्पादित होने में लगने वाला समय इस बात पर निर्भर करेगा कि कंपाइलर इसका अनुकूलन कैसे करता है। विशेष रूप से, बस इसे ऊपर और नीचे बदलते हुए देरी को कैलिब्रेट करते समय, आपको एक अलग (कंपाइल टाइम डिटेक्टेबल) निरंतर विलंब का उपयोग करने की तुलना में एक अलग उत्तर मिलेगा, क्योंकि उत्पन्न विधानसभा काफी भिन्न हो सकती है। ऐसा नहीं है कि C "धीमा" है, बल्कि यह कि यह बहुत तेज़ था। एक बिंदु पर मैं 0s से 1s तेज़ी से भेज रहा था (संभवतः वे अधिक वायुगतिकीय हैं)।

  • ट्रांसमिशन शुरू करने के लिए, आप लाइन LOW (स्टार्ट बिट) लाते हैं और फिर आपको यह सुनिश्चित करने की आवश्यकता होती है कि लाइन अगले 8 नमूना बिंदुओं में से प्रत्येक पर सही वोल्टेज पर है, और फिर सुनिश्चित करें कि वोल्टेज 9 वें नमूने में उच्च है । NewSoftSerial ने शुरुआत में बिट की लंबाई को आधा करने का उल्लेख किया है, लेकिन यह मेरे लिए अच्छा नहीं रहा। मैंने शुरुआत में 75% देरी और अंत में 125% देरी का इस्तेमाल किया।

  • वोल्टेज के बारे में वास्तविक चिंता यह हो सकती है कि कुछ "धारावाहिक" (विशेष रूप से RS232) about 12V है, न कि 0V / 5V। मैंने यह समझने में बहुत समय बिताया कि मैं वोल्टेज को 5V से 3.3V तक कैसे समायोजित कर सकता हूं, लेकिन मुझे लगता है कि यह पूरी तरह अप्रासंगिक था।

किसी भी दर पर, धारावाहिक प्रसारित करना आसान है, लेकिन समय "सही" प्राप्त करना बहुत महत्वपूर्ण प्रतीत होता है। मेरे लिए, यह विधानसभा में संचार को कोड करने का एक मामला था ताकि मैं चक्रों को गिन सकूं।


2
+1 के लिए 1 और अधिक वायुगतिकीय होने के नाते :) FTDI TTL232R तर्क स्तर uart संकेतों (0-5V) को आउटपुट करता है, यदि आप सीधे एक मानक सीरियल पोर्ट के साथ हस्तक्षेप कर रहे थे, तो आपको एक इंटरफ़ेस आईसी की आवश्यकता होगी जैसे कि MAX232, जो वोल्टेज देता है दोनों तरीके।
पीटर गिब्सन

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