Arduino - Verwendung von interrupts friert Verarbeitung und serielle Ausgabe?
So, die interrupts zu arbeiten scheinen soweit "unterbrechen", wenn ein Ereignis geschieht. Mein problem ist nur, dass ich die interrupts auftreten 2-3 mal und alles im wesentlichen beendet (Serial out, alles).
Ich war die Programmierung des Vorstands zur Ausgabe nacheinander eine Entfernung berechnet auf der Grundlage der Ausgang des HC-SR04 Abstand IC. Die Entfernungen sind genau berechnet, aber, wie ich schon sagte, alles scheint zu frieren. Unten ist der code und ein Bild von den serial monitor.
#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;
}
Ich war eigentlich nur denken. Was passiert, wenn ein interrupt-Aufruf unterbrochen ist?
EDIT: Also, hinzufügen von noInterrupts() in der Funktion, die aufgerufen wird, wenn ein interrupt-Ereignis, getTime(), und ledWrite() hilft nicht.
EDIT: Also, hinzufügen von noInterrupts() in der Funktion, die aufgerufen wird, wenn ein interrupt-Ereignis, getTime(), und ledWrite() hilft nicht.
InformationsquelleAutor sherrellbc | 2013-08-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie sind immer unterbrechen, während Sie bereits die Verarbeitung zu unterbrechen. Sie sollten versuchen, deaktivieren Sie den interrupt so schnell wie Sie in der interrupt-Funktion und re-aktivieren Sie diese wieder, wenn Sie fertig sind die Verarbeitung nur vor der Rückkehr. Daher würde ich die Beratung nur eine Rendite, so dass Sie nicht haben, wiederholen Sie die code-Aktivierung unterbrechen. Auch stellen Sie sicher, dass die Funktion, die Sie aufrufen, in Ihrem interrupt-code nicht re-aktivieren des Interrupts. Es kann passieren, dass die Funktion micros() oder die Serielle Funktion erneut aktivieren, den interrupt.
Ich würde vorschlagen, statt der aufrufenden Funktion direkt in Sie interrupt-code, versuchen Sie es mit einigen Fahnen und set - /reset unterbrechen und verwenden Sie diese flags in der main-loop zu rufen, Ihre normale Funktion.
InformationsquelleAutor praks411
Ich weiß, dies ist ein Alter thread, aber ich kam gerade von ihm habe meine eigenen Probleme. Das problem hier ist, dass Sie nicht verwenden können:
Innerhalb einer interrupt service routine. Der Grund dafür, dass die
Serial.Print()
funktioniert nicht innerhalb einer ISR ist, dass es verwendet interrupts, ziehen Sie die Zeichen aus dem buffer der seriellen Schnittstelle, aber interrupts, die von einer bestimmten Ebene maskiert sind innerhalb der ISR. Was im Grunde passiert ist, dass der arduino wirft alle anderen interrupts, die sind von geringerer Priorität, die Serielle.Read() fällt.Dokumentiert sich in einer Reihe von Orten: link1, link2, link3
InformationsquelleAutor Elias