我试图从单线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都做同样的事情,但我无法弄清楚我做错了什么。
答案 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()
}
库中有更多深入的例子