Aktivieren der Led durch Interrupt aus der Schleife nehmen

Hey,
ich arbeite momentan an einem Projekt, bei dem ich zwei Interrupts nutze,

  1. Einen Encoder um den delay Wert zu ändern
  2. um die LED zu triggern.

Das Problem ist nun, dass der Interrupt, der die LED triggert, immer nur dann Funktioniert, wenn die Schleife von vorne starte... Somit funktioniert der Interrupt nicht wie gewollt.
Jetzt Frage ich mich wie ich das hin bekommen kann, dass die LED sofort an geht aber solange an bleibt wie ich es mit dem Encoder vorgebe? :o

LG Léon

volatile int encoderValue = 0;
volatile int sensorValue = 1;
int led = 5;

int count;
void setup() {
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode (7, INPUT); //Sensor output
  pinMode (5, OUTPUT); //Led Output

  attachInterrupt(1, encoderRead, FALLING);
  attachInterrupt(4, sensorRead, CHANGE);
  Serial.begin (9600);
}
void loop() {
Serial.print ("Encoder: ");
 Serial.println (encoderValue); //print the encoder output

 if ( sensorValue == 1){digitalWrite(led, LOW);}
 else {digitalWrite(led, HIGH);}

  
 delay (1000 + encoderValue); //wait a second
 
}

void encoderRead() {
  if (digitalRead(3) == HIGH) { encoderValue++; }
  else { encoderValue--; }
}

void sensorRead() {
  if (digitalRead(7) == LOW) { sensorValue = 0;} 
  else  { sensorValue = 1;}
}

Hallo,

LJLP:

  attachInterrupt(1, encoderRead, FALLING);

attachInterrupt(4, sensorRead, CHANGE);

Welchen Arduino verwendest Du?
schau dir mal: external-interrupts an.
Gruß
grillgemuese :slight_smile:

moin,
ich nutze ein arduino pro Micro.
Interrupt pin 1 ist dabei digital pin 2
und Interrupt pin 4 ist digital pin 7

Warum du den SensorValue in einem Interrupt einliest, versteh ich nicht.
Die LED wird nur in deinem verzögerten loop() Durchlauf verändert.

Das geht einfach mit
  digitalWrite(led, digitalRead(7) );

Hi

  1. delay() ist BÖSE
  2. delay() ist BÖSE
  3. .....

Wenn Du während Deinem delay() x Encoder-Wert wartest, kann Alles Mögliche passieren - so eben wohl auch die Ansteuerung der LED initiiert werden.
Ok, blöd, daß Du erst nach dem delay() darauf achtest, ob die LED an gehört oder nicht - aber ich schrieb schon: delay() ist BÖSE

Du müsstest Deinen Code so umschreiben, daß Dir Nichts mehr blockiert - der tollste Interrupt nutzt Dir Nichts, wenn das Hauptprogramm sinnlos in einem noch sinnloserem delay() fest hängt.

MfG

postmaster-ino:
Hi

  1. delay() ist BÖSE
  2. delay() ist BÖSE
  3. .....
  1. gehe zu 1.

Grüße Uwe

Blinkt an Pin 13 mit 1Hz
Trotz, oder gerade wegen, dem delay()

#include <TaskMacro.h>

const byte LED = 13;

void yield()
{
  taskBegin();
  while(1)
  {
    digitalWrite(LED,!digitalRead(LED));
    taskPause(500);
  }
  taskEnd();
}



void setup() 
{
  pinMode(LED,OUTPUT);  
}

void loop() 
{
  delay(2000000UL); // Wert  muss größer 0, ansonsten irrelevant
}

... dazu sollte man dem geneigtem Nachbauer aber mitgeben, daß die Funktion yield() von der Funktion delay() dauernd aufgerufen wird.

Wenn man also ein delay(2000000UL) einleitet, dieses delay() die nächsten 33,batsch Minuten NUR im Kreis rennt und bei jeder Runde die Funktion yield() aufruft - das restliche Programm macht weiterhin Nichts.

Wenn Das so gewollt ist - toll!

Wenn nicht: nicht ganz so toll :wink:

Und erneut der Hinweis auf 'blink_without_delay' und millis().
Nur, weil man, wenn man Es kann, auch aus einem delay() raus kommt (und combie dieses Wissen unabstreitbar hat) - muß man nicht jedem Neebe erzählen, daß delay gar nicht sooo schlimm ist.

Es ist wie immer und überall: man muß wissen, was man tut.
Und Das tut man als Neuling mit großer Sicherheit nicht.

MfG

PS: Und ich muß mir die Makros doch Mal zu Gemüte führen - sooo kompliziert können diese 1-zeiler ja nun auch nicht sein feix ... hatte Das die Tage mal kurz offen)

Ich kann dir in allen Punkten recht weit zustimmen.

Nur in einem Punkt nicht:
Du wirst mich nicht dazu bekommen, dass ich Wissen hinter dem Berg halte, und diesen Dogmatismus unterstütze.

:sunglasses: :sunglasses: :sunglasses:

Dann solltest du wenigstens erwähnen, was

#include <TaskMacro.h>

ist. Man kann ja raten, dass es vermutlich was mit den undefinierten Funktionen taskPause usw. zu tun hat.

Natürlich kannst du was zur Arduino - Umgebung dazu erfinden, und brauchst auch nicht die Arduino-Bordmittel (BlinkWithoutDelay) direkt zu verwenden.

Aber was du in Post 2018-06-10, 20:25:18 gemacht hast, war leider genau “Wissen hinterm Berg halten”.
Sorry.

Bis dahin: combietools oder ähnliches googeln, könnte schon helfen.

yield() als Einstieg in eine Pseudo-Multitasking-Krücke kann man auch gleich weglassen, und stattdessen das “Delay ist böse” Mantra rezitieren. Meine Meinung.