Go Down

Topic: [Projekt] INTERVAL Ersatzstoff (Read 2232 times) previous topic - next topic

RIN67630

#30
Dec 19, 2017, 11:43 am Last Edit: Dec 19, 2017, 11:45 am by RIN67630
delay verwende ich prinzipiell nicht, ausser ich weiss genau was ich tue oder eben bei quick and dirty.
Ich genauso.
Meine Timings erledige ich meistens so:

Code: [Select]

    if (millis() / 1000 % 600 == 0)        // every 10 Minutes
    {

    }
    if (millis() / 1000 % 600 == 1)        // every 10 minutes, one second later
    {

    }

   if (millis() / 100 % 10 == 0)        // every second
    {

    }
    if (millis() / 100 % 10 == 1)        // every second, 100ms later
    {

    }


oder auch

Code: [Select]
switch (millis() / 100 % 10)
{
  case 0:
   // every second
  break:
  case 1:
   // every second 100mS later
  break:
  case 2:
  // every second 200mS later
  break:
  // and so on...
}



Das ganze noch mit "done" Semaphoren, die im Interrupt zurückgesetzt werden wenn die Aufgabe pro Zyklus nur einmal erfolgen darf....

Somit kann man unkompliziert und intuitiv die gesamte Last fein säuberlich verteilen.

Aber: est natürlich immer noch "collaborative" die jew. Aufgabe darf nicht über den Takt sabbern.

michael_x

#31
Dec 19, 2017, 01:05 pm Last Edit: Dec 19, 2017, 01:09 pm by michael_x Reason: Nachtrag
Quote
if (millis() / 1000 % 600 == 0)        // every 10 Minutes
ist leider falsch, wenn man möchte, dass es alle 10 Minuten einmal drankommt.


Nachtrag:
Und wenn man das gemerkt hat, und deswegen mit done Semaphoren oder ähnlichem hantiert, kann man es auch gleich "richtig" nach dem BlinkWithoutDelay-Schema machen.

RIN67630

ist leider falsch, wenn man möchte, dass es alle 10 Minuten einmal drankommt.


Nachtrag:
Und wenn man das gemerkt hat, und deswegen mit done Semaphoren oder ähnlichem hantiert, kann man es auch gleich "richtig" nach dem BlinkWithoutDelay-Schema machen.
Manchmal juckt es keiner, wenn es mehrmals passiert. Zum Blinken z.B. wäre es völlig wurscht.

Der BlinkWithoutDelay-Schema wird, wenn man eine Staffelung wie "// every 10 minutes, one second later" benötigt, komplett unübersichtlich.

Doc_Arduino

#33
Dec 19, 2017, 05:10 pm Last Edit: Dec 19, 2017, 06:58 pm by Doc_Arduino
Hallo,

seltsame Herangehensweise. Entweder es funktioniert richtig oder gar nicht. Halbe Sachen gibts bei mir nicht. Übersicht behalte ich, wenn ich die zeitliche Bedingung in die Funktion schreibe. Das sind 4 Zeilen. Dann erhalte ich eine aufgeräumte loop. Mehr Übersicht geht nicht. Meine Meinung.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

ElEspanol

wenn ich die zeitliche Bedingung in die Funktion schreibe. Das sind 4 Zeilen. Dann erhalte eine aufgeräumte loop. Mehr Übersicht geht nicht.
Ich schreibe die sogar teilweise mit in die Funktion, wenn die Funktion nur in diesem Zusammenhang benutzt wird. Ausgelagert in ein Tab und ich habe in der loop nur den Funktionsaufruf.

michael_x

Quote
Der BlinkWithoutDelay-Schema wird, wenn man eine Staffelung wie "// every 10 minutes, one second later" benötigt, komplett unübersichtlich.
Du kannst innerhalb des Zyklus jederzeit abfragen, wo du gerade stehst, und z.B. die ersten Sekunde lang die LED anschalten, und sie danach ausmachen. Oder so...

Stimmt, es gibt Fälle wo es egal ist, wie oft eine "Aktion" wiederholt wird. Aber wenn du etwas absichtlich (warum?) erst später ausführen willst...  ?

Code: [Select]
const unsigned long INTERVALL=600*1000L; // 10 Minuten
static unsigned long last;
if (millis() - last > INTERVALL) {
   last = millis();
   // Einmal-Aktion
}

digitalWrite(LED,  millis() - last < 2000 ); // Im Intervall 2 sec HIGH, danach LOW

static bool OneSecond;
if (millis() - last > 1000 ) {
   if (! OneSecond)  { /* Einmal die verzögerte Aktion. */ }
   OneSecond = true;
} else OneSecond = false;
   



Ob das nach loop() oder in eine separate Funktion gehört, ist natürlich zu überlegen...
Stimme ich auch zu.

ElEspanol

Aber wenn du etwas absichtlich (warum?) erst später ausführen willst...  ?
Z.B. Sensor.request und dann 2 Sekunden danach die Temperaturabfrage bei einem DS18B20, etc.

RIN67630

...Aber wenn du etwas absichtlich (warum?) erst später ausführen willst...  ?...

Warum? um die Last zeitlich zu verteilen.
Wenn man schnelle und langsamen Aufgaben erledigen will, ist es vorteilhaft, wenn die langsame auch nicht anfangen wenn die schnelle gerade dran sind...


ElEspanol

#38
Dec 19, 2017, 08:21 pm Last Edit: Dec 19, 2017, 08:22 pm by ElEspanol
Jetzt hast du aber glaube ich einen Denkfehler. Der Arduino macht nur alles nacheinander. Und langsamere Aufgaben gibt es nicht, der macht immer gleich schnell. Du meinst wahrscheinlich umfangreichere, länger dauernde Aufgaben. Und wenn diese eben zu lange Dauern, musst du sie aufteilen und im loop immer nur einen Teil davon machen. Stichwort: endlicher Automat, Etc.

Will sagen, wenn du eine „langsame" Aufgabe hast, die dir wegen ihrer Ausführungsdauer Probleme macht, ist der Sketch nicht optimal designed.

RIN67630

...und wenn diese eben zu lange dauern, musst du sie aufteilen und im loop immer nur einen Teil davon machen...
Genau das erfolgt mit dem "// every 10 minutes, one second later"

Das ist kein Denkfehler, das ist das Konzept.

ElEspanol

Oder alle 100 loops in den nächsten Teil gehen, oder, ....

Da gibt es mehrere Möglichkeiten.

combie

@RIN67630
Tut mir leid dir das sagen zu müssen, aber dein Verfahren habe ich vor Jahren schon abgelehnt. Selbst nach erneutem Nachdenken wird es nicht besser.

Erstens:
Dein Verfahren tut nicht das, was in den Kommentaren steht.

Zweitens:
Die Division ist die teuerste Grundrechenart. Und gerade die rudelt sich bei dir.

Was das alles mit "Kollaboration" zu tun hat, weißt wohl nur du, nehme ich mal an.
Ich halte dein Verfahren für einen Irrweg!


Leitsatz:
> Irren ist menschlich!
> Im Irrtum verharren, ist Dummheit.

PS:
Wenn das jetzt irgendwie nützlich wäre, dann würde es mich ja nur wenig stören, dass du meinen Thread entführst.
Der Pessimist sieht die Wolke vor der Sonne.
Der Optimist sieht die Sonne hinter der Wolke.

Mantra: Die Sonne scheint immer!

RIN67630

#42
Dec 20, 2017, 10:19 am Last Edit: Dec 20, 2017, 10:20 am by RIN67630
@RIN67630
[..]
Leitsatz:
> Irren ist menschlich!
> Im Irrtum verharren, ist Dummheit.

PS:
Wenn das jetzt irgendwie nützlich wäre, dann würde es mich ja nur wenig stören, dass du meinen Thread entführst.
Du darfst von der Arbeit Anderen halten, was Du willst.
Du darfst alles ablehnen, was Du willst.
Du darfst dich über die 35μS echauffieren, die eine Long-Integerdivision am Nano verbraucht

Beleidigungen widersprechen jedoch die Netiquette.
Noch etwas: wem gehört "mein Thread" ?

Schuppeste

#43
Dec 20, 2017, 10:45 am Last Edit: Dec 20, 2017, 10:45 am by Schuppeste
Ich habe vor eingien Wochen an eine ähnliche Library gedacht.. allerdings scheiterte es an Zeit und tieferem einarbeiten.

Meine Idee war..

myDelay mydelaythread =new myDelay(Funktionsname, Datenarray,Typ)// Typ=intervall,oneshot,count,etc

Delaycode(){auszuführen}


loop(){
mydelaythread.start(time);
mydelaythread.stop();
mydelaythread.reset();
mydelaythread.stopfortime();
}

Go Up