Arduino - 使用中断冻结处理和串行输出?

she*_*lbc 5 arduino interrupt

因此,当事件发生时,中断似乎可以"中断".我唯一的问题是,中断将发生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;
}
Run Code Online (Sandbox Code Playgroud)

Eli*_*ias 12

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

Serial.Print()
Run Code Online (Sandbox Code Playgroud)

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

它记录在许多地方:link1,link2,link3

  • 谢谢这实际上解决了我的问题,而不是上面的答案. (3认同)

pra*_*411 6

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