มือใหม่อนุกรม: ทำไมฉันไม่สามารถเชื่อมต่อสายได้?


14

ฉันพยายามส่งจาก ATtiny85 ไปยังพีซีโดยใช้รหัส Arduino-esque บนตัวแปลง USB-Serial โดยไม่ต้องเข้าใจอะไรมาก ฉันตกใจและตกใจว่ามันไม่ได้ผล

ฉันยืนยันว่าตัวเล็ก ๆ กำลังกะพริบแรงดันไฟฟ้าที่ขาหนึ่งของมัน แต่เมื่อฉันเชื่อมต่อหมุดนั้นเพื่อส่งหรือรับบนสายเคเบิลอนุกรม USB และลองฟังโดยใช้โปรแกรมเทอร์มินัลฉันก็ไม่ได้อะไรเลย

ฉันไม่แน่ใจว่าจะบอกได้อย่างไรว่าส่วนไหนเสีย

ฉันต้องการมากกว่า VCC, GND และ TXD เพื่อส่งสัญญาณอนุกรมหรือไม่


รายละเอียด:

รหัสสำหรับตัวจิ๋วนั้นถูกเขียนขึ้นในสภาพแวดล้อมของ Arduino และรหัสที่คล้ายกันก็สามารถใช้หมุด "PORTB" ทั้ง 4 ตัวได้ ฉันใช้รหัสจาก HLT และ Saporettiเพื่อให้ฉันใช้ภาษา Arduino ของ C ++ เพื่อเขียนโปรแกรม โปรแกรมยังมาในภายใต้เค

#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 จะกะพริบแรงดันไฟฟ้าตาม LED

ดังนั้นฉันจึงใช้สายเล็ก ๆ เพื่อเชื่อมต่อปลาย "ftdi" ของตัวแปลงอนุกรม FTDI USBเข้ากับตัวจิ๋ว: ดำถึง GND, สีแดงถึง VCC, สีส้มถึง 6 ฉันเปิดโปรแกรม "minicom" บนพีซีตั้งค่า baud ให้คะแนน 4800 และรอเพื่ออะไร เมื่อพูดคุยกับBoarduinoของฉันมันไม่มีปัญหา

สายเคเบิลตัวแปลง FTDI มี pinout ต่อไปนี้: สีดำคือ GND, สีน้ำตาลคือ "CTS", สีแดงคือ VCC (+ 4.98V), สีส้มคือ "TXD", สีเหลืองคือ "RXD", สีเขียวคือ "RTS"

หากฉันต้องการส่งสัญญาณจากเครื่องจิ๋วไปยังพีซีฉันควรสะบัดแรงดันไฟฟ้าที่ "TXD" หรือ "RXD" หรือไม่ กล่าวอีกนัยหนึ่งคือลวดส่งสัญญาณที่จะส่งจากทาสไปยังโฮสต์หรือโฮสต์ไปยังทาส?

ฉันลองทั้งสองอย่างแล้วก็ไม่ได้ผล ฉันเคยทอดอุปกรณ์น้อยกว่าหนึ่งดอลลาร์และฉันก็อวดดีดังนั้นฉันแค่เสียบสายเข้ากับสายเคเบิล บางทีฉันไม่ควรเพิกเฉยต่อสาย "CTS" และ "RTS"

ฉันจำเป็นต้องใช้สายไฟอื่น ๆ หรือไม่? RTS และ CTS ทำอะไรหรือไม่

ฮาร์ดแวร์คือ ATTiny85-PU (แพคเกจ DIP-8, ทำงานที่ 1MHz, สูงสุด 20MHz) โดยใช้พลังงาน USB ที่ 4.98V พีซีโฮสต์เป็น MacBook และประสบความสำเร็จในการทำทุกสิ่ง arduino รวมถึงการใช้ ArduinoISP ในการเขียนโปรแกรม ATtiny เพื่อกะพริบหัวใจเล็ก ๆ ของมันออกมา

คำตอบ:


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);
}

Baudrate จะเป็น 4800 ในกรณีของคุณ ดูเหมือน SoftwareSerial ไลบรารี่จะไม่สนับสนุน CTS & RTS ดังนั้นให้แน่ใจว่าคุณไม่ได้ใช้มันในซอฟแวร์โฮสต์

ตรวจสอบหน้าอ้างอิงสำหรับรายละเอียดเพิ่มเติมที่พวกเขาพูดคุยเกี่ยวกับปัญหาเวลาที่อาจเกิดขึ้นซึ่งอาจรุนแรงขึ้นหากคุณทำงานที่ 1MHz โดยใช้ oscillator ภายในที่เล็ก


ขอบคุณ! หน้าอ้างอิงทำให้ชัดเจนว่า 4800 นั้นเร็วเกินไปดังนั้นฉันจึงลดเหลือ 300 baud และสิ่งต่าง ๆ "ดีกว่า" pinMode ไม่ส่งผลกระทบต่อการส่งสัญญาณ แต่ฉันเพิ่มเข้าไปเพื่อทำให้สิ่งต่าง ๆ ชัดเจนขึ้น ตอนนี้ฉันกำลังพยายามชะลอการเปลี่ยนการหน่วงเวลาระหว่างบิตจนกว่าจะมีบางอย่างได้รับ Minicom กำลังแสดงอยู่ใช่ไหม ทำเครื่องหมายว่าตอนนี้ กรณีที่เลวร้ายที่สุดออสซิลเลเตอร์ 16mhz และ 20mhz ของฉันมาถึงวันศุกร์
Jack Schmidt

คุณคิดว่าอาจเป็นปัญหาแรงดันไฟฟ้าหรือไม่? การปรับเวลายังใช้งานไม่ได้และฉันได้รับเครื่องหมายคำถามมากมายดังนั้นจึงมีการส่งบางสิ่งบางอย่าง ฉันสามารถแก้ไขได้ด้วยการลด Vcc ลงเหลือเพียง 3V นั่นคือฉันสามารถเชื่อมต่อแบตเตอรี่บางตัวแทน USB ได้หรือไม่ ฉันจะเชื่อมต่อกราวด์กับกราวด์ USB และกราวด์แบตเตอรีหรือไม่?
Jack Schmidt

โอ้ขอบคุณที่ชี้ให้เห็นว่าเส้นลวดสีเหลืองนั้นเล็กสำหรับฉันที่จะส่ง สายสีส้มดูเหมือนจะสั่นไหวมาก (ติดกับ LED จากพีซี) พีซีกำลังส่งสัญญาณหรือว่า "เปิด" เป็นส่วนใหญ่อยู่ตลอดเวลา?
Jack Schmidt

ใช่ควรอยู่ HI เมื่อไม่ได้ใช้งานและสั่นไหวเมื่อส่งสัญญาณ - ฉันไม่แน่ใจว่า FTDI สามารถจ่ายกระแสได้เพียงพอที่จะขับ LED หรือไม่ AVR จะใช้ได้ แต่ฉันจะลบ LED ออกจากสาย FTDI-TX Crystal ควรแก้ไขปัญหาเกี่ยวกับเวลา (แต่คุณต้องตั้งฟิวส์เพื่อสลับจากออสซิลเลเตอร์ภายใน)
ปีเตอร์กิบสัน

ยังทำงานอยู่ แต่ฉันเชื่อว่ามันเป็นปัญหาเรื่องเวลาหรือปัญหาซอฟต์แวร์ Arduino-on-ATTiny ที่น่ากลัว กำลังรับกลาง 2-3 ไบต์บางส่วน (แต่ไม่แสดง) และส่วนที่เหลือจะอ่านไม่ออกเป็น 0x80 ฉันจะเขียนฟังก์ชั่นการส่งแบบนิ่มนวล AVR เล็กน้อยของตัวเองในขณะที่รอคริสตัล มีวิธีง่าย ๆ / ราคาถูกเพื่อดูสิ่งที่ถูกส่งไป? 300 baud ยังค่อนข้างเร็วสำหรับดวงตาเก่าของฉัน
Jack Schmidt

7

ดังนั้นคำตอบจึงดูเหมือนว่า: คุณสามารถต่อสายได้แน่นอนแค่ GND (สีดำ) และ RXD (สีเหลือง) และทุกอย่างทำงานได้ตราบใดที่ซอฟต์แวร์นั้นดี

สิ่งที่ไม่สำคัญ:

  • ออสซิลเลเตอร์ภายในทำงานได้ดี ดูเหมือนว่าค่อนข้างคงที่สำหรับการทดสอบที่ จำกัด ของฉัน ที่ 9600 baud ปัญหาอะไรก็ตามมันมีเล็กน้อย

  • การใช้พลังงาน USB บนสัญญาณทำงานได้ดี คุณสามารถใช้แหล่งจ่ายแรงดันไฟฟ้าแยกต่างหาก (แชร์พื้นดินทั่วไป) แต่สาย FTDI อ่านทั้งสัญญาณ 3V และ 5V ได้อย่างสมบูรณ์แบบ ฉันเชื่อมต่อชุดแบตเตอรี่ - ไปยัง GND ของ FTDI และจิ๋ว + กับ VCC ของจิ๋วและสิ่งนี้ใช้ได้ดี อย่างไรก็ตามการใช้ VCC (สีแดง) ของ FTDI (USB power 5V) นั้นง่ายกว่าและมีประสิทธิภาพ

สิ่งที่ฉันทำผิด:

  • สายสีเหลือง FTDI "RXD" รับบิตจากไมโครคอนโทรลเลอร์ดังนั้นจึงเชื่อมต่อกับการส่งสัญญาณบนไมโครคอนโทรลเลอร์ ฉันสามารถหาสิ่งนี้ได้ด้วยตนเองโดยเชื่อมต่อสายส่งและรับ (สีส้มและสีเหลือง) เข้ากับไฟ LED หรือ Arduino และตรวจสอบว่าแรงดันไฟฟ้ากระพริบเมื่อฉันส่งจากพีซี

  • SoftwareSerial และ NewSoftSerial ไม่สามารถใช้งานได้กับ ATtiny ในขณะที่ ATmega328p และ ATtiny85 มีความคล้ายคลึงกันมาก แต่ก็มีความแตกต่างกันมากพอที่จะทำให้ซอฟต์แวร์เก่าที่จะรวบรวมสำหรับชิปใหม่นั้นไม่เพียงพอ

  • อัตราการรับส่งข้อมูลที่ช้าลงไม่สามารถแก้ไขได้ 300 baud ต้องการรูทีนการหน่วงเวลาที่ซับซ้อนมากขึ้นเนื่องจากจำนวนรอบระหว่างบิตเป็นมากกว่าตัวนับ 8 บิต 9600 baud ใช้งานได้ดีและอัตรา baud ที่สูงขึ้นสามารถทำได้

  • ระวังการเขียนรหัสเวลาที่สำคัญใน C โดยเฉพาะในฟังก์ชั่นแบบอินไลน์ เวลาที่ใช้ในการดำเนินการจะขึ้นอยู่กับวิธีที่คอมไพเลอร์ปรับให้เหมาะสม โดยเฉพาะอย่างยิ่งเมื่อปรับเทียบความล่าช้าโดยเพียงแค่เปลี่ยนมันขึ้นและลงคุณจะได้รับคำตอบที่แตกต่างจากเมื่อใช้การหน่วงเวลาคงที่แบบตรวจจับการคอมไพล์ได้เนื่องจากการประกอบที่สร้างขึ้นอาจแตกต่างกัน ไม่ใช่ว่า C "ช้า" แต่ค่อนข้างเร็วเกินไป มีอยู่ช่วงหนึ่งที่ฉันส่งสัญญาณเร็วกว่า 0s 1 วินาที (น่าจะเป็นอากาศพลศาสตร์มากกว่า)

  • ในการเริ่มต้นการส่งสัญญาณให้คุณนำสาย LOW (บิตเริ่ม) จากนั้นคุณต้องตรวจสอบให้แน่ใจว่าสายอยู่ที่แรงดันไฟฟ้าที่ถูกต้องที่จุดตัวอย่าง 8 จุดถัดไปจากนั้นตรวจสอบให้แน่ใจว่าแรงดันไฟฟ้าสูงในตัวอย่างที่ 9 . NewSoftSerial กล่าวถึงการหน่วงเวลาครึ่งความยาวของบิตเริ่มต้น แต่สิ่งนี้ไม่ได้ผลสำหรับฉัน ฉันใช้ความล่าช้า 75% ในการเริ่มต้นและความล่าช้า 125% ในตอนท้าย

  • ความกังวลที่แท้จริงเกี่ยวกับแรงดันไฟฟ้าอาจเป็นได้ว่า "อนุกรม" (โดยเฉพาะ RS232) โดยเฉพาะคือ± 12V ไม่ใช่ 0V / 5V ฉันใช้เวลาพยายามทำความเข้าใจว่าฉันสามารถปรับแรงดันไฟฟ้าจาก 5V เป็น 3.3V ได้อย่างไร แต่ฉันคิดว่ามันไม่เกี่ยวข้องอย่างสมบูรณ์

การส่งสัญญาณอนุกรมทำได้ง่าย แต่การได้รับเวลา "สมบูรณ์แบบ" นั้นค่อนข้างสำคัญ สำหรับฉันนี่เป็นเพียงเรื่องของการเข้ารหัสการส่งสัญญาณในการชุมนุมเพื่อให้ฉันสามารถนับรอบ


2
+1 สำหรับผู้ที่มีอากาศพลศาสตร์มากขึ้น :) FTDI TTL232R ส่งสัญญาณตรรกะระดับ uart (0-5V) หากคุณเชื่อมต่อโดยตรงกับพอร์ตอนุกรมมาตรฐานคุณต้องมีอินเทอร์เฟซ IC เช่น MAX232 ซึ่งจะแปลงแรงดันไฟฟ้า ระดับทั้งสองวิธี
Peter Gibson

ขอแสดงความยินดีที่ได้ทำงาน ขอบคุณสำหรับรายละเอียดโพสต์ของฉันฉันหวังว่านี่จะช่วยคนอื่น ๆ ในโครงการ ATtiny ของพวกเขา
davidcary
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.