attachInterrupt in while schleife...

Kurze frage: Unterbricht ein Interrupt (attachInterrupt) eine While-schleife oder muss diese erst durchlaufen?

Bei Interrupts musst du eher auf Assembler-Ebene denken. Nicht in C. Falls Interrupts aktiviert sind (man kann sie global abschalten was auch automatisch beim Eintritt in eine ISR geschieht), kann an jeder Stelle unterbrochen werden.

attachInterrupt() schaltet Interrupts scharf. Wann irgendein Ereignis einen Interrupt aufruft, hängt vom Ereingis der diesen Interrupt aufruft ab.

Grüße Uwe

Schonmal danke für die schnellen Antworten. Das die Interrups abgeschaltet werden, war mir bei Assembler bekannt. Ich glaube das war (sei) und (cli). Es ist nur komisch das eine while Schleife nicht durch einen Interrupt unterbrochen wird oder etwa doch?

Funktioniert nicht →

#include <IRremote.h>
#include <LiquidCrystal.h> 

LiquidCrystal lcd(8 , 3, 4, 5, 6, 7);
const int IRpin = 2; 
IRrecv irrecv(IRpin);
decode_results ir_results;
boolean irrecv_fin = false;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // IR Empfänger starten
  lcd.begin(20, 4);
  lcd.clear();
  lcd.home();
  lcd.print("Taste:");
  attachInterrupt(digitalPinToInterrupt(IRpin), IR_DATEN_RX, FALLING); 
}

void loop() {
  while (true) {
    if (irrecv_fin) {
      lcd.setCursor(0,1);
      lcd.print(ir_results.value,HEX);
      irrecv_fin = false;
    }
  }
}
void IR_DATEN_RX () {
  if (irrecv.decode(&ir_results))  { 
      irrecv.resume(); 
      irrecv_fin = true;    
  }
}

Funktioniert →

void loop() {
    if (irrecv_fin) {
      lcd.setCursor(0,1);
      lcd.print(ir_results.value,HEX);
      irrecv_fin = false;
    }

Es ist nur komisch das eine while Schleife nicht durch einen Interrupt unterbrochen wird oder etwa doch?

Doch!

Funktioniert nicht -> Funktioniert ->

Wenn man jetzt wissen würde, was es denn tun soll.....

Timex90: Es ist nur komisch das eine while Schleife nicht durch einen Interrupt unterbrochen wird oder etwa doch?

Eine while-Schleife wird unterbrochen wie alle anderen Funktionen des Sketches. Grüße Uwe

so, ich hab jetzt einfach mal einen Test gemacht. Funktioniert… nach einen Interrupt “kommt auch die 4”

boolean dievierkommtauch = false;

void setup() {
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(2), wasweisich, CHANGE);
}
void loop() {
  while (true) {
    Serial.println("Das ist die 1");
    delay(1000);
    Serial.println("Das ist die 2");
    delay(1000);
    Serial.println("Das ist die 3");
    delay(1000);
    if (dievierkommtauch) {
      Serial.println("Das ist die 4");
      dievierkommtauch = false;
      }
    delay(1000);
  } 
}
void wasweisich () {
  dievierkommtauch = true;
}

Hier nochmal im alles.
In diesem Teil habe ich eine While schleife… normal sollte auf dem Display die Empfangen Daten der FB in HEX Format anzeigen. Macht es aber nicht. Es passiert gar nichts.

#include <IRremote.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(8 , 3, 4, 5, 6, 7);
const int IRpin = 2;
IRrecv irrecv(IRpin);
decode_results ir_results;
boolean irrecv_fin = false;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // IR Empfänger starten
  lcd.begin(20, 4);
  lcd.clear();
  lcd.home();
  lcd.print("Taste:");
  attachInterrupt(digitalPinToInterrupt(2), IR_DATEN_RX, FALLING);
}

void loop() {
  while (true) {
    if (irrecv_fin) {
      lcd.setCursor(0,1);
      lcd.print(ir_results.value,HEX);
      irrecv_fin = false;
    }
  }
}
void IR_DATEN_RX () {
  if (irrecv.decode(&ir_results))  {
      irrecv.resume();
      irrecv_fin = true;   
  }
}

Hier das gleiche nur ohne While schleife. Drücke ich jetzt eine Taste der FB kann ich die Empfangen Daten als HEX sehen.

#include <IRremote.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(8 , 3, 4, 5, 6, 7);
const int IRpin = 2;
IRrecv irrecv(IRpin);
decode_results ir_results;
boolean irrecv_fin = false;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // IR Empfänger starten
  lcd.begin(20, 4);
  lcd.clear();
  lcd.home();
  lcd.print("Taste:");
  attachInterrupt(digitalPinToInterrupt(2), IR_DATEN_RX, FALLING);
}

void loop() {
    if (irrecv_fin) {
      lcd.setCursor(0,1);
      lcd.print(ir_results.value,HEX);
      irrecv_fin = false;
  }
}
void IR_DATEN_RX () {
  if (irrecv.decode(&ir_results))  {
      irrecv.resume();
      irrecv_fin = true;   
  }
}

Timex90: Funktioniert nicht ->

void loop() {
  while (true) {
    if (irrecv_fin) {
      lcd.setCursor(0,1);
      lcd.print(ir_results.value,HEX);
      irrecv_fin = false;
    }
  }
}
void IR_DATEN_RX () {
  if (irrecv.decode(&ir_results))  { 
      irrecv.resume(); 
      irrecv_fin = true;    
  }
}
Kleiner entscheidender Fehler im Code. while (true) läuft ewig,
versuche es mal mit while (!irrecv_fin) {}

Grüßle Harry

Ich sehe da mehrere Probleme: 1. Globale Variablen, welche in ISRs verändert werden, müssen als volatile deklariert werden. 2. Der Zugriff darauf, von anderen Programmteilen, muss ATOMIC erfolgen. 3. Man kann in ISRs keinen Code nutzen, welcher selber Interruptfunktionalität nutzt.

Nein, ich habe das Problem gelöst. Es scheint ein Timing Problem zu sein. Wenn ich direkt nach der While-schleife ein If habe geht es nicht. Setze ich jedoch z.B. erst den Cursor von dem Display geht es ohne Probleme...

void loop() {
  while (true) {
    lcd.setCursor(0,1);
    if (irrecv_fin) {
      lcd.print(ir_results.value,HEX);
      irrecv_fin = false;
    }
  }
}

ps HarryR: Das die While-schleife ewig läuft ist absicht.

Würde nur gerne mal wissen warum es so geht. Oder hängt es damit zusammen das in der while-schleife nichts passiert, bis auf das If?

Nein, ich habe das Problem gelöst.

Nein, hast du nicht.

Würde nur gerne mal wissen warum es so geht. Oder hängt es damit zusammen das in der while-schleife nichts passiert, bis auf das If?

Schlecht geraten…

Timex90: ps HarryR: Das die While-schleife ewig läuft ist absicht.

Warum soll das Absicht sein? Die While-Schleife ist dort unnötig und bringt nichts. Die Funktion loop ist bereits eine While(1)/ for(;;) -Schleife, die nie unterbrochen wird. Code denn du vor oder nach der while Schleife setzt bringt dir garnichts, ausser du arbeitest mit unsauberen Abbruchmethoden.

Also Erstmal danke für alle die sich ein paar Minuten zeit genommen haben.

Ich finde Kommentare ohne Begründung sind unangebracht und füllen solche Foren zu mit Müll "combie"!

Das mit der endlos While macht man gerne um die loop etwas zu beschleunigen. Spart ein paar Takte am Ende.

Definiere mal "irrecv_fin" als volatile, was passiert dann ?

rudirabbit: Das mit der endlos While macht man gerne um die loop etwas zu beschleunigen. Spart ein paar Takte am Ende.

Genau. Das braucht man hier nicht, aber es ist auch nicht falsch wie das hier manchmal gerne behauptet wird.

Es ist sehr seltsam, dass es ohne das geht, aber das kann auch nur Zufall sein.

sschultewolter: Warum soll das Absicht sein? Die While-Schleife ist dort unnötig und bringt nichts. Die Funktion loop ist bereits eine While(1)/ for(;;) -Schleife, die nie unterbrochen wird. Code denn du vor oder nach der while Schleife setzt bringt dir garnichts, ausser du arbeitest mit unsauberen Abbruchmethoden.

Das ist mir klar. Das ist auch nicht das Programm an dem ich arbeite. Es handelt sich hier um einen reinen Test.

rudirabbit: Das mit der endlos While macht man gerne um die loop etwas zu beschleunigen. Spart ein paar Takte am Ende.

Definiere mal "irrecv_fin" als volatile, was passiert dann ?

Okay, das hatte ich vergessen. Kleiner Fehler große Wirkung. Das war denke ich das Einzige Problem. Vielen dank rudirabbit! :D

Das hatte aber "combie" in #8 indirekt auch schon angesprochen ;)

Also nicht gleich den verbalen Holzhammer auspacken, das hier ist ein freundliches Forum.