【问题标题】:Arduino - Using interrupts freezes processing and serial output?Arduino - 使用中断会冻结处理和串行输出?
【发布时间】:2013-08-01 05:26:35
【问题描述】:

因此,当事件发生时,中断似乎起到“中断”的作用。我唯一的问题是我的中断会发生 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;
}

【问题讨论】:

  • 其实我只是在想。当中断调用被中断时会发生什么?
  • 编辑:因此,在发生中断事件时调用的函数 getTime() 和 ledWrite() 中添加 noInterrupts() 并没有帮助。

标签: arduino interrupt


【解决方案1】:

我知道这是一个旧线程,但我只是遇到了自己的问题。这里的问题是你不能使用:

Serial.Print()

在中断服务程序中。 Serial.Print() 在 ISR 中不起作用的原因是它使用中断将字符拉出串行缓冲区,但在 ISR 中屏蔽了一定级别的中断。基本上发生的是,arduino 会抛出所有其他优先级较低的中断,这些中断属于 Serial.Read() 。

它记录在多个地方:link1link2link3

【讨论】:

  • 谢谢,这实际上解决了我的问题,而不是上面的答案。
【解决方案2】:

我认为您已经在处理中断时遇到了中断。您应该尝试在中断功能中立即禁用中断,并在返回前完成处理后再次重新启用它。因此,我建议只返回一个,这样您就不必重复启用中断的代码。还要确保您在中断代码中调用的函数不会重新启用中断。函数 micros() 或任何串行函数可能会重新启用中断。 我建议不要直接在您的中断代码中调用函数,而是尝试在中断中使用一些标志并设置/重置,并在主循环中使用这些标志来调用您的常规函数​​。

【讨论】:

  • 感谢您的回答!在我提出这个问题后不久,我在 OP 下发表了类似的评论。这种方法不起作用,尽管我没有检查任何时间函数的来源以查看它们是否启用中断。我无法验证代码现在是否可以工作,但显然你不能在中断函数中进行串行连接。 (即我“打断了!”的地方)。我也在 Arduino 论坛上发布了这个问题。 forum.arduino.cc/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多