Người mới nối tiếp: tại sao tôi không thể nối dây?


14

Tôi đang cố gắng truyền từ ATtiny85 sang PC bằng mã Arduino-esque qua bộ chuyển đổi USB-serial mà không hiểu gì nhiều. Tôi đã bị sốc và kinh hoàng rằng nó không hoạt động.

Tôi xác nhận rằng cái nhỏ bé đang nhấp nháy điện áp trên một trong các chân của nó, nhưng khi tôi kết nối chân đó để truyền hoặc nhận trên cáp nối tiếp USB và cố gắng nghe bằng chương trình đầu cuối, tôi không nhận được gì.

Tôi không chắc làm thế nào để biết phần nào bị hỏng.

Tôi có cần nhiều hơn VCC, GND và TXD để truyền nối tiếp không?


Chi tiết:

Mã cho nhỏ được viết trong môi trường Arduino và mã tương tự nhấp nháy thành công tất cả 4 chân "PORTB", ít nhất là theo đèn LED. Tôi sử dụng mã từ HLT và Saporetti để cho tôi sử dụng phương ngữ Arduino của C ++ để lập trình nó. Chương trình vẫn đến trong một chữ K.

#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

Có rất nhiều bản dịch liên quan, nhưng mã này khá cơ bản. Mã đặt tốc độ baud dường như giả định là 1 MHz, nhưng may mắn là thái độ của tôi có các cầu chì mặc định của nhà máy và chạy ở mức 1 MHz. Ở bất kỳ giá nào, chân 6 đang nhấp nháy điện áp của nó theo đèn LED.

Vì vậy, tôi sử dụng các dây nhỏ để kết nối đầu "ftdi" của bộ chuyển đổi nối tiếp USB FTDI với nhỏ: đen sang GND, đỏ với VCC, màu cam đến 6. Tôi mở chương trình "minicom" trên PC, đặt baud tỷ lệ lên 4800 và chờ đợi, không có gì. Khi nói chuyện với Boarduino của tôi , nó không gặp rắc rối.

Cáp chuyển đổi FTDI có sơ đồ chân sau: màu đen là GND, màu nâu là "CTS", màu đỏ là VCC (+ 4.98V), màu cam là "TXD", màu vàng là "RXD", màu xanh lá cây là "RTS".

Nếu tôi muốn truyền từ nhỏ đến PC, tôi có nên nhấp nháy điện áp trên "TXD" hoặc "RXD" không? Nói cách khác là dây truyền để truyền từ nô lệ đến máy chủ, hay máy chủ đến nô lệ?

Tôi thực sự đã thử cả hai, không làm việc. Cho đến nay tôi đã chiên các thiết bị trị giá ít hơn một đô la và tôi đang tự mãn, vì vậy tôi chỉ cần cắm dây vào cáp. Có lẽ tôi không nên bỏ qua các dây "CTS" và "RTS"?

Tôi có cần sử dụng bất kỳ dây khác? RTS và CTS có làm gì không?

Phần cứng là ATTiny85-PU (gói DIP-8, chạy ở tốc độ 1 MHz, được định mức là 20 MHz) được cung cấp bởi USB ở mức 4,98V. Máy tính chủ là MacBook, và nó thực hiện thành công tất cả mọi thứ arduino, bao gồm cả việc sử dụng ArduinoISP để lập trình ATtiny để làm cho trái tim nhỏ bé của nó tắt đi.

Câu trả lời:


9

Bạn chắc chắn có thể truyền dữ liệu chỉ bằng TX & GND.

Đầu tiên, bạn muốn nối dòng ATtiny85 TX với dòng FTDI RX (màu vàng trên TTL-232R). Đảm bảo rằng bộ chuyển đổi USB có thể xử lý 5V - Tôi khá chắc chắn ngay cả 3,3V TTL-232R có thể chịu được 5V.

Theo trang ví dụ cho SoftwareSerial , bạn cần đặt hướng của các đường TX & RX trong chức năng thiết lập của mình:

// 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 sẽ là 4800 trong trường hợp của bạn. Thư viện SoftwareSerial dường như không hỗ trợ CTS & RTS, vì vậy hãy đảm bảo rằng bạn không sử dụng chúng trên phần mềm máy chủ.

Kiểm tra trang tham khảo để biết thêm chi tiết, nơi họ nói về một số vấn đề thời gian tiềm ẩn có thể bị trầm trọng hơn nếu bạn đang chạy ở tốc độ 1 MHz bằng bộ dao động nội bộ trên máy nhỏ.


Cảm ơn! Trang tham khảo đã nói rõ rằng 4800 quá nhanh, vì vậy tôi đã giảm xuống còn 300 baud và mọi thứ "tốt hơn". PinMode không ảnh hưởng đến việc truyền, nhưng dù sao tôi cũng đã thêm nó để làm cho mọi thứ rõ ràng hơn. Bây giờ tôi đang cố gắng làm chậm việc thay đổi độ trễ giữa các bit cho đến khi nhận được thứ gì đó. Minicom chỉ hiển thị? đánh dấu ngay bây giờ. Trường hợp xấu nhất, bộ dao động 16 mhz và 20 mhz của tôi đến thứ Sáu.
Jack Schmidt

Bạn có nghĩ rằng nó có thể là vấn đề điện áp? Điều chỉnh thời gian vẫn không hiệu quả và tôi nhận được rất nhiều dấu hỏi, vì vậy một cái gì đó đang được truyền đi. Tôi có thể sửa nó chỉ bằng cách hạ Vcc xuống mức nhỏ nhất xuống 3V, nghĩa là tôi có thể nối nó với một số pin thay vì USB không? Tôi có kết nối mặt đất với cả mặt đất USB và mặt đất pin không?
Jack Schmidt

Oh, cũng cảm ơn vì đã chỉ ra dây màu vàng là cho nhỏ của tôi để truyền đi. Dây màu cam dường như nhấp nháy rất nhiều (được nối với đèn LED từ PC). Là PC truyền, hay nó ở lại "bật" hầu hết thời gian?
Jack Schmidt

Có, nên giữ HI khi không hoạt động và nhấp nháy khi truyền - Tôi không chắc FTDI có khả năng cung cấp đủ dòng để chạy đèn LED hay không. AVR sẽ ổn, nhưng tôi sẽ loại bỏ đèn LED khỏi dòng FTDI-TX. Crystal nên khắc phục các vấn đề về thời gian (nhưng bạn cần đặt các cầu chì để chuyển từ bộ dao động bên trong).
Peter Gibson

Vẫn đang làm việc với nó, nhưng tôi tin rằng đó là một vấn đề thời gian hoặc một vấn đề phần mềm Arduino-on-ATTiny khủng khiếp. Một vài 2-3 byte ở giữa đang được nhận (nhưng không được hiển thị) và phần còn lại bị cắt xén thành 0x80. Tôi sẽ viết chức năng gửi nối tiếp mềm (tầm thường) AVR của riêng mình trong khi chờ tinh thể. Có một số cách dễ dàng / rẻ tiền để xem những gì đang được gửi? 300 baud vẫn còn khá nhanh đối với đôi mắt cũ của tôi.
Jack Schmidt

7

Vì vậy, câu trả lời dường như là: bạn có thể nối dây, thực sự chỉ là GND (màu đen) và RXD (màu vàng), và mọi thứ đều hoạt động miễn là phần mềm hoạt động tốt.

Những điều không quan trọng:

  • Dao động nội bộ hoạt động tốt. Nó xuất hiện tương đối ổn định để thử nghiệm giới hạn của tôi. Ở 9600 baud bất cứ vấn đề gì nó có không đáng kể.

  • Sử dụng nguồn USB trên các tín hiệu hoạt động tốt. Bạn có thể sử dụng một nguồn điện áp riêng (chia sẻ một điểm chung), nhưng cáp FTDI đọc cả hai tín hiệu 3V và 5V một cách hoàn hảo. Tôi đã kết nối một bộ pin, - với GND của cả FTDI và nhỏ, + với VCC của tin, và điều này hoạt động tốt. Tuy nhiên, chỉ cần sử dụng VCC (màu đỏ) của FTDI (nguồn USB 5V) thì đơn giản và hiệu quả không kém.

Những điều tôi đã làm sai:

  • Dòng "RXD" màu vàng FTDI nhận các bit từ vi điều khiển, do đó, nó kết nối với truyền trong vi điều khiển. Tôi có thể tự mình tìm ra điều này bằng cách kết nối các đường truyền và nhận (màu cam và màu vàng) với đèn LED hoặc Arduino và kiểm tra điện áp nào nhấp nháy khi tôi truyền từ PC.

  • Cả SoftwareSerial và NewSoftSerial đều không hoạt động với ATtiny. Mặc dù ATmega328p và ATtiny85 có rất nhiều điểm tương đồng, nhưng có đủ sự khác biệt mà chỉ cần phần mềm cũ biên dịch cho chip mới là không đủ.

  • Tốc độ baud chậm hơn không chữa được mọi thứ. 300 baud đòi hỏi các thói quen trì hoãn phức tạp hơn vì số chu kỳ giữa các bit nhiều hơn đáng kể so với bộ đếm 8 bit. 9600 baud hoạt động tốt, và tốc độ baud cao hơn là có thể làm được.

  • Cẩn thận viết mã thời gian quan trọng trong C, đặc biệt là trong các hàm nội tuyến. Thời gian cần thiết để thực thi sẽ phụ thuộc vào cách trình biên dịch tối ưu hóa nó. Đặc biệt, khi hiệu chỉnh độ trễ bằng cách chỉ thay đổi nó lên và xuống, bạn sẽ nhận được một câu trả lời khác so với khi sử dụng độ trễ liên tục (biên dịch thời gian có thể phát hiện), bởi vì lắp ráp được tạo ra có thể khá khác nhau. Không phải là C "chậm", mà là nó quá nhanh. Tại một thời điểm tôi đã gửi 1 giây nhanh hơn 0 giây (có lẽ chúng có tính khí động học cao hơn).

  • Để bắt đầu truyền, bạn đưa đường dây THẤP (bit bắt đầu) và sau đó bạn cần đảm bảo đường dây ở đúng điện áp tại mỗi 8 điểm mẫu tiếp theo, sau đó đảm bảo điện áp CAO ở mẫu thứ 9 . NewSoftSerial đề cập đến việc trì hoãn một nửa thời gian trên bit start, nhưng điều này không hoạt động tốt với tôi. Tôi đã sử dụng độ trễ 75% khi bắt đầu và độ trễ 125% khi kết thúc.

  • Mối quan tâm thực sự về điện áp có thể là một số "nối tiếp" (đặc biệt là RS232) là ± 12V, không phải 0V / 5V. Tôi đã dành rất nhiều thời gian để cố gắng hiểu làm thế nào tôi có thể điều chỉnh điện áp từ 5V đến 3.3V, nhưng tôi nghĩ điều đó hoàn toàn không liên quan.

Ở mọi mức độ, truyền nối tiếp là dễ dàng, nhưng việc lấy thời gian "hoàn hảo" có vẻ khá quan trọng. Đối với tôi, đây chỉ là vấn đề mã hóa truyền phát trong lắp ráp để tôi có thể đếm các chu kỳ.


2
+1 cho 1 tính khí động học hơn :) FTDI TTL232R xuất tín hiệu uart mức logic (0-5V), nếu bạn giao tiếp trực tiếp với cổng nối tiếp tiêu chuẩn, bạn cần một IC giao diện như MAX 232, chuyển đổi điện áp cả hai cấp độ.
Peter Gibson

Xin chúc mừng vì đã làm cho nó hoạt động. Cảm ơn bạn đã đăng bài chi tiết của bạn, tôi hy vọng điều này sẽ giúp nhiều người khác với các dự án ATtiny của họ.
davidcary
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.