从高速5v单线总线读取开/关信号

时间:2013-10-11 09:03:08

标签: serial-port arduino

我试图从单线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都做同样的事情,但我无法弄清楚我做错了什么。

1 个答案:

答案 0 :(得分:0)

你的循环是无状态的。换一种说法;如果A0 == 1则没有任何反应。但是如果A0 == 0那么它会堵塞Serial.print填充它比它实际上在紧密循环中永远发送的速度快。吹起来。您需要设置一些边缘条件,仅发送转换状态。

您还可以考虑使用PinChangeInt功能和支持库来使用中断来查找边缘。可以在here

找到图书馆
#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()
}

库中有更多深入的例子