0

我正在尝试从单线 5v 总线读取数据,该总线应该是 ~0v 或 ~5v,并且最多每 25 微秒更改一次。

在硬件方面:我只是将单根线连接到我的 arduino (atmel328p) 上的一个引脚。我试过针脚 3、8 和 A0。我需要进行端口操作以达到我需要的速度。由于 atmel328p 每秒运行 1600 万次操作,这应该在 arduino 的能力范围内。

这是我的代码:

void setup() {
  pinMode(3, INPUT);
  Serial.begin(115200);
  for(;;) {
    uint8_t a = PIND;//analogRead(A0);
    if (a==0)
      // normally I won't be writing to USB serial this often, I'm
      // just simplifying as much as possible and I just want to know if this
      // actually works
      Serial.println(a);
  }
}
void loop() {}

我在硬件或软件方面做错了什么?

其他几个项目,例如 SoftwareSerial、NewSoftSerial 或 AltSerial 或 I2C 或 OneWire 都做同样的事情,但我不知道我做错了什么。

4

1 回答 1

0

您的循环是无状态的。换句话说; 如果 A0==1 那么什么都不会发生。但是如果 A0==0 那么它堵塞的 Serial.print 填充它的速度比它实际上可以在一个紧密的循环中永远发送出去的速度更快。吹起来。您需要放入一些边缘条件,以便仅发送转换状态。

您还可以考虑使用PinChangeInt功能和支持库来使用中断来查找边缘。图书馆可以在这里找到

#include <PinChangeInt.h>

void pinfunc() {
  Serial.println();
  Serial.print("Pin =");
  Serial.print(A0, DEC); 
  Serial.println("!");
}

void setup() {
  PCintPort::attachInterrupt(A0, &pinfunc, CHANGE);
  Serial.begin(115200);
}

uint8_t i;
void loop() {
  Serial.print(".");
  delay(1000); // important to slow up preceding print.
  // do other things. 
  // possibly look for a flag set in pinfunc()
}

库中有更深入的示例

于 2013-10-11T13:46:25.920 回答