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.
#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.
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
Vous devez vous connecter pour publier un commentaire.
Je pense que vous êtes l'obtention d'interruption pendant que vous êtes déjà en traitement d'interruption. Vous devriez essayer de désactiver l'interruption dès que vous êtes dans la fonction d'interruption et de le ré-activer de nouveau lorsque vous avez terminé le traitement juste avant le retour. Donc je voudrais des conseils pour avoir juste un retour de sorte que vous n'avez pas à répéter le code de l'activation de l'interruption. Assurez-vous également de la fonction que vous appelez à l'intérieur de votre code interruption de ne pas ré-activer l'interruption. Il peut arriver que la fonction micros() ou toute la Série de la fonction de ré-activation de l'interruption.
Je dirais plutôt que d'appeler la fonction directement dans vous code interruption essayez d'utiliser un certain nombre de drapeaux et set/reset dans l'interruption et l'utilisation de ces indicateurs dans la boucle principale pour appeler votre fonction régulière.
OriginalL'auteur praks411
Je sais que c'est un vieux thread, mais je viens par ce qu'ayant mes propres problèmes. Le problème ici est que vous ne pouvez pas utiliser:
À l'intérieur d'une routine de service d'interruption. La raison pour laquelle la
Serial.Print()
ne fonctionne pas dans un rapport de recherche internationale, c'est qu'il utilise des interruptions de tirer les personnages de la série de la mémoire tampon, mais interrompt d'un certain niveau sont masqués dans le rapport de recherche internationale. Ce qui est généralement ce qui arrive, c'est que l'arduino débarrasse de tous les autres interruptions qui sont d'un degré de priorité moindre, Série.Read() tombe dans.Elle est documentée dans un nombre de places: link1, link2, link3
OriginalL'auteur Elias