串行新手:为什么我不能将电线连接起来?


14

我试图通过USB-Serial转换器使用Arduino-esque代码从ATtiny85传输到PC,却不了解任何东西。我感到震惊和震惊,因为它不起作用。

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

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

我是否需要超过VCC,GND和TXD来传输串行信号?


细节:

微型程序的代码是在Arduino环境中编写的,至少根据LED指示灯,类似的代码成功地使所有4个“ PORTB”引脚闪烁。我使用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,但是幸运的是我的attiny出厂时具有保险丝,并以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,它成功完成了所有任务,包括使用ArduinoISP对ATtiny进行编程以使其心碎。

Answers:


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库似乎不支持CTS和RTS,因此只需确保您不在主机软件上使用它们即可。

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


谢谢!参考页清楚地表明4800太快了,所以我降低到300波特并且情况“更好”。pinMode不会影响传输,但是无论如何我都添加了它,以使情况更清晰。我现在正在尝试减慢更改位之间的延迟,直到收到某种东西为止。Minicom只是展示?现在标记。最坏的情况是,我的16MHz和20MHz振荡器在星期五到达。
杰克·施密特

您认为可能是电压问题吗?调整时间仍然没有用,并且我收到很多问号,所以正在传送一些信息。是否可以仅通过将Vcc降低至3V来解决问题,即可以将其连接到一些电池上而不是USB上吗?是否将接地连接到USB接地和电池接地?
杰克·施密特

哦,也感谢您指出黄线是我的小细线可以继续传输的。橙色线似乎闪烁很多(已从PC连接到LED)。PC是在传输还是在大多数时间都保持打开状态?
杰克·施密特

是的,在空闲时应保持HI状态,在发送时应闪烁-我不确定FTDI是否能够提供足够的电流来驱动LED。AVR会很好,但我会从FTDI-TX线上卸下LED。Crystal应该解决时序问题(但是您需要设置保险丝以从内部振荡器切换过来)。
彼得·吉布森

仍在努力,但我坚信这是时序问题或可怕的Arduino-ATTiny软件问题。接收到一些中间的2-3个字节(但不显示),其余的则乱码为0x80。我要在等待晶体时编写自己的(简单的)AVR软串行发送功能。是否有一些简单/便宜的方法来查看正在发送的内容?对于我的老眼睛来说,300波特仍然相当快。
杰克·施密特

7

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

无关紧要的事情:

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

  • 在信号上使用USB电源就可以了。您可以使用单独的电压源(共享公共接地),但是FTDI电缆可以完美读取3V和5V信号。我将电池组-接到FTDI和微型机的GND,+接到微型机的VCC,这很好用。但是,仅使用FTDI(USB电源5V)的VCC(红色)会更加简单且有效。

我做错的事情:

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

  • 无论是SoftwareSerial还是NewSoftSerial,都无法与ATtiny一起使用。尽管ATmega328p和ATtiny85具有许多相似之处,但有足够的差异,仅靠旧软件来为新芯片进行编译是不够的。

  • 较慢的波特率无法解决问题。300波特需要更复杂的延迟例程,因为位之间的循环数明显大于8位计数器。9600波特率很好,并且可以使用更高的波特率。

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

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

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

无论如何,传输串行都是很容易的,但是获得定时“完美”似乎很重要。对我来说,这只是将传输编码为汇编形式,以便我可以计算周期。


2
+1表示空气动力更强:) FTDI TTL232R输出逻辑电平uart信号(0-5V),如果直接与标准串行接口连接,则需要接口IC,例如MAX232,它可以转换电压两种水平。
彼得·吉布森

祝贺您能正常工作。感谢您提供详细的信息,希望对其他人的ATtiny项目有所帮助。
davidcary
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.