Arduino - en Utilisant les interruptions de gels de traitement et de sortie en série?

Ainsi, les interruptions semblent fonctionner dans la mesure où "interrompre" lorsqu'un événement se produit. Mon seul problème est que je les interruptions se produisent 2 à 3 fois et tout essentiellement les arrêts (de Série, tout).

J'étais la programmation de la carte de sortie en série un calculées en fonction de la distance à la sortie de la HC-SR04 distance IC. Les distances sont calculées avec précision, mais, comme je l'ai dit plus tôt, tout semble se figer. Ci-dessous est à la fois le code et une image de la série du moniteur.

Arduino - en Utilisant les interruptions de gels de traitement et de sortie en série?

#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;
}
En fait je pensais juste. Ce qui se passe lorsqu'une interruption d'appel est interrompu?
EDIT: Donc, l'ajout de noInterrupts() dans la fonction appelée quand il y a une interruption de l'événement, getTime(), et ledWrite() n'aide pas.

OriginalL'auteur sherrellbc | 2013-08-01