我有一个Arduino Mega应用程序,其中我在不同的占空比下读取低频脉冲(大约10Hz)的时序。
我使用外部中断来捕获脉冲,将信号更改时间信息添加到16位数组[320]中,我在完成后读回。
我通过将第一次上行变化的时间设置为时间0来标准化时间。
请参阅随附的简化代码段(使用Arduino Mega进行工作测试,针脚D2)
问题:复位后的第一个完整周期按预期读取时序,而每个后续周期只有第一个脉冲正常,而所有下一个脉冲都是“#”。时间正在随机转移
我已经测试并尝试了很多选项,包括仅在更改时使用volatile和interrupt,但总是得到相同的结果:首次运行正常,下一次运行被移位。
任何想法都将受到高度赞赏。
/*Program reads input pulses at D2 and builds timing array of the up and
down going signals, using change interrupts on pin D2 of Mega
To run, send array size in hex.
by Sam Tal sam@tadin.co.il Nov 9, 2017
*/
#define interruptPin 2
unsigned int dataArraySize;
unsigned int timeData[320];
volatile byte state = LOW;
unsigned int counts = 0 ; //Changes counter
unsigned long startTime; //The first up going interrupt time.
//==========================================================
void setup()
{
Serial.begin(115200);
pinMode(interruptPin, INPUT);
}
//=========================================================
void loop()
{
if (Serial.available())
{
dataArraySize = Serial.read();
StartCycle();
}
}
//========================================================
void StartCycle(void)
{
Serial.println("Starting cycle...");
//Reset the time array;
memset ( timeData, 0, dataArraySize);
counts = 0 ;
state = LOW;
attachInterrupt(digitalPinToInterrupt(interruptPin), Step, RISING);
}
//========================================================
void Step()
{
detachInterrupt (digitalPinToInterrupt (interruptPin));
if (counts == 0)
{
startTime = millis(); // Start time of the first rising change.
}
if (counts < dataArraySize)
{
timeData[counts] = millis() - startTime ;
counts++;
attachInterrupt(digitalPinToInterrupt(interruptPin), Step, CHANGE);
}
else
{
detachInterrupt (digitalPinToInterrupt (interruptPin));
SendData(timeData, dataArraySize);
}
}
//===========================================================
void SendData(unsigned int data[] , unsigned int arraysize)
{
int f;
for (f = 0; f < arraysize ; f++)
{
Serial.print(f);
Serial.print(",") ;
Serial.println(data[f]);
}
}
答案 0 :(得分:0)
memset()调用处理字节,但是你给它计算了两个字节的整数。所以,它并没有清除整个缓冲区。通常我们会这样做:
memset(buf, 0, sizeof(buf));
我也害怕中断处理程序中的Serial.print()。也许在那里设置一个标志,然后从loop()调用Send()。