因此,当事件发生时,中断似乎正在“中断”。我唯一的问题是,中断将发生2-3次,一切都基本停止(串行输出,一切)。
我正在对电路板进行编程,以便根据HC-SR04距离IC的输出连续输出计算出的距离。距离是精确计算的,但正如我之前所说,一切似乎都在冻结。下面是代码和串行监视器的图像。
#define TRIGPIN 4
#define ECHOPIN 3
#define RED 2
#define GREEN 13
#define INTNUM 1 //interrupt pin 1 is digital pin 3 on the duemilanove
#define PULSE 10 //microseconds
#define CYCLETIME 50 //milliseconds
void ledWrite(int), trigPulse(), getTime();
int millisNow, millisPrev = 0;
int microsPrev;
boolean isHigh = false;
void setup() {
Serial.begin (9600);
pinMode(TRIGPIN, OUTPUT);
pinMode(ECHOPIN, INPUT);
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
attachInterrupt(INTNUM, getTime, CHANGE);
}
void loop() {
trigPulse();
// some other code while waiting on HC-SR04 to interrupt us when echo goes HIGH
}
void trigPulse(){
if( (millisNow = millis()) - millisPrev >= CYCLETIME){ //sufficient cycle time
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(PULSE);
digitalWrite(TRIGPIN, LOW);
millisPrev = millisNow; //reset clock
}
return;
}
void ledWrite(int dTime){
int distance = dTime/58.2;
if (distance < 4) {
digitalWrite(RED,HIGH);
digitalWrite(GREEN,LOW);
}
else {
digitalWrite(RED,LOW);
digitalWrite(GREEN,HIGH);
}
if (distance >= 200 || distance <= 0){
Serial.println("Out of range");
}
else {
Serial.print(distance);
Serial.println(" cm");
}
}
void getTime(){
int timeNow = micros();
Serial.println("Interrupted");
if(isHigh == false){
microsPrev = timeNow; //get time now, pin LOW->HIGH
isHigh = true;
Serial.println("Returning ..");
return;
}
else { //pin HIGH->lOW
ledWrite(timeNow - microsPrev);
isHigh = false;
microsPrev = micros();
Serial.println("Returning ..");
return;
}
return;
}
答案 0 :(得分:12)
我知道这是一个老线程,但我只是遇到了自己的问题。这里的问题是你不能使用:
Serial.Print()
在中断服务程序中。 Serial.Print()
在ISR中不起作用的原因是它使用中断将字符拉出串行缓冲区,但是在ISR中屏蔽了某个级别的中断。基本上发生的是arduino抛出所有其他优先级较低的中断,Serial.Read()属于这些中断。
答案 1 :(得分:4)
我认为你在处理中断时会收到中断。您应该在处于中断功能时立即尝试禁用中断,并在返回之前完成处理后再次重新启用它。因此,我建议只返回一个,这样就不必重复启用中断的代码。还要确保在中断代码中调用的函数不会重新启用中断。可能会发生函数micros()或任何串行函数重新启用中断。 我建议不要直接调用函数中断代码尝试使用一些标志并在中断中设置/重置并在主循环中使用这些标志来调用常规函数。