连续剧新手:为什么我不能把电线连接起来?

电器工程 服装 Arduino 串行 ftdi USB
2022-01-29 09:46:38

我正在尝试通过 USB 串行转换器使用 Arduino 式代码从 ATtiny85 传输到 PC,但对任何东西都不太了解。我对它不起作用感到震惊和震惊。

我确认该微型设备的一个引脚上的电压正在闪烁,但是当我将该引脚连接到 USB 串行电缆上进行发送或接收并尝试使用终端程序收听时,我什么也得不到。

我不确定如何判断哪个部分坏了。

我需要更多的 VCC、GND 和 TXD 来传输串行吗?


细节:

tiny 的代码是在 Arduino 环境中编写的,类似的代码成功地使所有 4 个“PORTB”引脚闪烁,至少根据 LED。我使用HLT 和 Saporetti 的代码让我使用 C++ 的 Arduino 方言对其进行编程。该程序仍然在 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

涉及很多翻译,但代码非常基本。设置波特率的代码似乎假定为 1MHz,但幸运的是我的服装有出厂默认保险丝并以 1MHz 运行。无论如何,引脚 6 会根据 LED 闪烁其电压。

所以我用小线将FTDI USB 串行转换器的“ftdi”端连接到小:黑色到 GND,红色到 VCC,橙色到 6。我在 PC 上打开程序“minicom”,设置波特率费率到 4800 并等待,一无所获。与我的Boarduino交谈时,它没有任何问题。

FTDI转换器电缆有以下引脚排列:黑色为GND,棕色为“CTS”,红色为VCC(+4.98V),橙色为“TXD”,黄色为“RXD”,绿色为“RTS”。

如果我想从微型传输到 PC,我应该在“TXD”或“RXD”上闪烁电压吗?换句话说,传输线是从从机传输到主机,还是主机到从机?

我实际上都试过了,都没有奏效。到目前为止,我已经炒了不到一美元的设备,而且我越来越自大,所以我只是将电线插入电缆。也许我不应该忽略“CTS”和“RTS”线?

我需要使用任何其他电线吗?RTS 和 CTS 有什么作用吗?

硬件是一个 ATtiny85-PU(DIP-8 封装,运行频率为 1MHz,额定频率为 20MHz),由 USB 供电,电压为 4.98V。主机 PC 是 MacBook,它成功地完成了 arduino 的所有工作,包括使用 ArduinoISP 对 ATtiny 进行编程以使其小心脏闪烁。

2个回答

您绝对可以仅使用 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 库似乎不支持 CTS 和 RTS,因此请确保您没有在主机软件上使用它们。

查看参考页面了解更多详细信息,其中他们讨论了一些潜在的时序问题,如果您使用微型芯片上的内部振荡器以 1MHz 运行,这些问题可能会加剧。

所以答案似乎是:你可以只连接电线,实际上只是 GND(黑色)和 RXD(黄色),只要软件良好,一切都可以正常工作。

无关紧要的事情:

  • 内部振荡器工作正常。对于我的极限测试,它似乎相对稳定。在 9600 波特时,它所遇到的任何问题都可以忽略不计。

  • 在信号上使用 USB 电源就可以了。您可以使用单独的电压源(共用一个接地),但 FTDI 电缆可以完美地读取 3V 和 5V 信号。我将电池组 - 连接到 FTDI 和 tiny 的 GND,+ 连接到 tiny 的 VCC,这工作得很好。然而,仅使用 FTDI(USB 电源 5V)的 VCC(红色)要简单得多,而且同样有效。

我做错的事情:

  • 黄色的 FTDI“RXD”线接收来自微控制器的位,因此它连接到微控制器上的传输输入。我可以通过将发送和接收线(橙色和黄色)连接到 LED 或 Arduino 并检查当我从 PC 传输时哪个电压闪烁来自己解决这个问题。

  • SoftwareSerial 和 NewSoftSerial 都不能通过 ATtiny 开箱即用。虽然 ATmega328p 和 ATtiny85 有很多相似之处,但有足够的差异,仅仅让旧软件为新芯片编译是不够的。

  • 较慢的波特率并不能解决问题。300 波特需要更复杂的延迟程序,因为位之间的周期数远远超过 8 位计数器。9600 波特工作得很好,更高的波特率是可行的。

  • 小心在 C 中编写时序关键代码,尤其是在内联函数中。执行时间取决于编译器如何优化它。特别是,当仅通过上下更改延迟来校准延迟时,您将得到与使用(编译时可检测的)恒定延迟时不同的答案,因为生成的程序集可能完全不同。不是C“慢”,而是它太快了。有一次,我发送 1 的速度比 0 快(大概它们更符合空气动力学)。

  • 要开始传输,您将线路拉低(起始位),然后您需要确保线路在接下来的 8 个采样点中的每个采样点都处于正确的电压,然后确保电压在第 9 个采样点处于高电平. NewSoftSerial 提到在开始位上做半长延迟,但这对我来说效果不佳。我在开始时使用了 75% 的延迟,在结束时使用了 125% 的延迟。

  • 对电压的真正担忧可能是某些“串行”(尤其是 RS232)是 ±12V,而不是 0V/5V。我花了很多时间试图了解如何将电压从 5V 调整到 3.3V,但我认为这完全无关紧要。

无论如何,传输串行很容易,但获得“完美”的时序似乎非常重要。对我来说,这只是在汇编中编码传输的问题,以便我可以计算周期。