Go Down

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

ElEspanol

Quote
Combie::Pulsator puls(1000); // liefert alle 1000 ms einmal true sonst false
Kann aber dann nicht stimmen.

Das würde ja puls==!millis()%1000 entsprechen, müsste also genau treffen. Tatsächlich funktioniert es aber wie ich gedacht habe.

Code: [Select]
#include "CombieTimer.h"

Combie::Pulsator puls(1);

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

void loop()
{
  if(puls)
  {
    digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));
    puls.setInterval(digitalRead(LED_BUILTIN) ? 1000 : 500);
  }

  delay(157);  //soll den Rest des Programmablaufs simulieren. 100 bzw. 500 werden nie genau getroffen
}

ElEspanol

und das geht auch (noch?) nicht:
Code: [Select]
Combie::Pulsator puls[2](1);

void setup()
{
  pinMode(LED_BUILTIN,OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(8, OUTPUT);
}

void loop()
{
  if(puls[0])
  {
    digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));
    puls[0].setInterval(!digitalRead(LED_BUILTIN) ? 1000 : 100);
  }

  if(puls[1])
  {
    digitalWrite(12,!digitalRead(12));
    puls[1].setInterval(!digitalRead(12) ? 1000 : 100);
  }

}

combie

Kann aber dann nicht stimmen.

Das würde ja puls==!millis()%1000 entsprechen, müsste also genau treffen. Tatsächlich funktioniert es aber wie ich gedacht habe.

Code: [Select]
#include "CombieTimer.h"

Combie::Pulsator puls(1);

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

void loop()
{
  if(puls)
  {
    digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));
    puls.setInterval(digitalRead(LED_BUILTIN) ? 1000 : 500);
  }

  delay(157);  //soll den Rest des Programmablaufs simulieren. 100 bzw. 500 werden nie genau getroffen
}


Testprogram:
Code: [Select]
#include "CombieTimer.h"
using Combie::Pulsator;

Pulsator puls(1000);

void setup(void)
{
  Serial.begin(9600);
  Serial.println();Serial.println("Start");Serial.println();

}

void loop(void)
{
  if(puls) Serial.println(millis());
}


Resultat:
Code: [Select]

Start

0
1000
2000
3000
4000
5000
6000
7000
8000
9000
10000
11000
12000
13000
14000
15000
16000
17000


Kommt also exakt auf dem Punkt.
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

ElEspanol

#18
Dec 10, 2017, 05:47 pm Last Edit: Dec 10, 2017, 05:53 pm by ElEspanol
Das mein ich nicht. Muss ja auch so sein, weil die loop ja sonst nix zu tun hat.

wenn es nur bei ==1000 gehen würde, würde ja folgendes nicht funzen:
Code: [Select]
#include "CombieTimer.h"
using Combie::Pulsator;

Pulsator puls(1000);

void setup(void)
{
  Serial.begin(9600);
  Serial.println();Serial.println("Start");Serial.println();

}

void loop(void)
{
  if(puls) Serial.println(millis());

delay(137);
}

Quote
Ausgabe:
Start

0
1095
2192
3288
4384
5480
6577
7672
8769
9866
10961
12058
13154
14251
15347
16443
17540
18636
19732
Ich finde es so gut, wie es ist-

Ist ja entsprechend >=1000, bei millis prüft man ja auch auf <=, nicht auf ==

Die Aussage "Combie::Pulsator puls(1000); // liefert alle 1000 ms einmal true sonst false" müsste eher heissen. liefert einmal true nach frühestens 1000ms, eben wenn es im loop wieder dran ist.
Dummerweise nullt es den Zeitzähler bei der Ausführung, auch wenn die nach den 1000ms gewesen ist, und berücksichtigt nicht die tatsächliche "Fälligkeit".

combie

#19
Dec 10, 2017, 05:49 pm Last Edit: Dec 10, 2017, 05:50 pm by combie
Ein Array mit Pulsatoren:
Code: [Select]
#include "CombieTimer.h"
using Combie::Pulsator;


Combie::Pulsator puls[2] = {1000,1000};

const byte led1 = 3;
const byte led2 = 4;


void setup()
{
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop()
{
  if(puls[0])
  {
    digitalWrite(led1,!digitalRead(led1));
    puls[0].setInterval(!digitalRead(led1) ? 1000 : 100);
  }

  if(puls[1])
  {
    digitalWrite(led2,!digitalRead(led2));
    puls[1].setInterval(!digitalRead(led2) ? 1000 : 100);
  }

}
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

combie

#20
Dec 10, 2017, 05:57 pm Last Edit: Dec 10, 2017, 06:29 pm by combie
Quote
Das mein ich nicht. Muss ja auch so sein, weil die loop ja sonst nix zu tun hat.
Ja, jetzt sehe ich was du meinst...

Da ist ein Verzug drin.

Aber das ist doch beim INTERVAL ganz genau so!
Oder?

Ja, mal schauen, ob das da noch rein passt......

Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

ElEspanol


combie

#22
Dec 10, 2017, 06:45 pm Last Edit: Dec 10, 2017, 06:54 pm by combie
Mal angenommen, das Problem wäre, dass du unbedingt delay() einsetzen möchtest:
Code: [Select]

#include "CombieTimer.h"
using Combie::Pulsator;

Pulsator puls(1000);

void setup(void)
{
  Serial.begin(9600);
  Serial.println();Serial.println("Start");Serial.println();

}

void yield(void)
{
  if(puls) Serial.println(millis());
}

void loop(void)
{
 delay(4711);
}



Das ist aber nicht in deinem Sinn!
(nehme ich mal an)

Hätte aber den Vorteil, dass du in deine langlaufenden Dinge nur ein paar yield(); Aufrufe einstreuen müsstest, damit sich das Timing verbessert.

Vorsicht mit yield()!
Man hat sich da ganz schnell eine indirekte Rekursion gebaut.


Jetzt ist es so, dass die Zeiten evtl. mal länger sind, aber nie kürzer.

Würde ich jetzt SimpleTimer modifizieren, dann wäre es so:
Manchmal sind die Zeiten kürzer, dann wenn aufgeholt wird, und manchmal länger, wenn andere lang laufende Dinge im Weg stehen. Im Mittel, würde es dann passen.

Ich denke, das ist eine Aufgabe für einen eigenen "AufholPulsator"

In SimpleTimer oder den Pulsator möchte ich es nicht aufnehmen.
Denn in SimpleTimer hat es nichts zu suchen, da es für die anderen Timer nicht gebraucht wird.
Und der Pulsator zeigt jetzt (noch) das gewohnte INTERVAL Verhalten.

Ein Problem für Morgen....
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

ElEspanol

delay verwende ich prinzipiell nicht, ausser ich weiss genau was ich tue oder eben bei quick and dirty.

In dem Beispiel habe ich delay genommen, um zu zeigen, was passiert, wenn eine loop mal länger dauert. Bei thinkspeak z.b. warte ich auf die Antwort, anstatt es mit einem endlichen Automaten zu machen. Sollte ich vielleicht auch mal umschreiben.
eine loop sieht z.B. so aus:
Code: [Select]
  seriell_lesen();
  EingaengeAbfragen();
  TasterAbfragen();
  SR04auslesen();
  lcdaktualisieren(0);
  lcduntenaktualisieren();
  Serverroutine();
  DS1820auslesen();
  schalterfunktionen();
  WasserhochpumpenSR04();
  uhrAbfragen();
  filterSpuelen();
  alarme();
  Automat();
  AusgaengeSchreiben();
  checkUDP();
  intervalle();

nichts von alledem ist wirklich blockierend, aber doch können schonmal über 100ms zusammenkommen, wenns dumm läuft. Innerhalb Funktionen nehm ich dann INTERVAL
Aber wirklich gestört hat der Verzug bei INTERVAL ja auch nicht.

noiasca

Überfrage: soll ein .h File (header) nicht nur Deklarationen enthalten und frei von Definitionen sein?
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

combie

#25
Dec 10, 2017, 07:44 pm Last Edit: Dec 10, 2017, 07:53 pm by combie
Nöö, das ist schon alles ganz ok so.

Was du meinst, dreht sich eher um Übersetzungseinheiten.
Wenn einen statische Eigenschaften zu sowas zwingen.

Wenn man Libraries bauen möchte, die nicht jedes mal übersetzt werden sollen.
Dann beschleunigt es den Übersetzungsvorgang des gesamt Projektes.

Anderes Beispiel:
Es bietet eine Gelegenheit den Quellcode nicht mit ausliefern zu müssen, sonder nur die *.h und die *.a  Datei
Aber so geheim ist mein Zeugs nicht.



Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

combie

#26
Dec 12, 2017, 12:58 pm Last Edit: Dec 12, 2017, 02:32 pm by combie
ja, da ist es genauso.
Ich habe einige Zeit über das Problem nachgedacht...

Auf folgendes bin ich gekommen:
Code: [Select]
class AufholPulsator
{
      private:
      unsigned long timeStamp = 0;
      unsigned long interval;

      public:
      AufholPulsator(unsigned long interval):interval(interval){}

      void start()
      {
        timeStamp = millis();
      }

      void setInterval(const unsigned long _interval)
      {
         interval = _interval;
      }

      operator bool()
      {
        bool abgelaufen = millis() - timeStamp >= interval;
        if(abgelaufen) timeStamp += interval;
        return abgelaufen;
      }
};


AufholPulsator puls(1000);


void setup(void)
{
  Serial.begin(9600);
}

void loop(void)
{
   if(puls) Serial.println(millis());
   delay(137);
}



So holt es den Verzug wieder auf.

Zumindest akkumuliert sich der Verzug sich nicht mehr, von Puls zu Puls.
Solange der Verzug kürzer, als das Intervall ist, gelingt das auch.

Naja....


Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

skorpi080

Das ganze als Github wär nett.
playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

combie

#28
Dec 19, 2017, 10:23 am Last Edit: Dec 19, 2017, 10:47 am by combie
Da sprichst du was an.....

Hilfst du mir beim striegeln, und bürsten?
Doku schreiben, usw...
Beim Seite bauen, im Arduino Playground?

Etwas Fleißarbeit ist auch noch nötig, damit das in den Librarymanagern aller Arduinoinstallationen weltweit automatisch auftaucht.

Kein Scherz!
Die Arbeit steht an, wenn man das tun möchte.
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

skorpi080

#29
Dec 19, 2017, 11:33 am Last Edit: Dec 19, 2017, 11:38 am by skorpi080
Ich kann nur sehen was Jomelo da hat:
https://github.com/Jomelo/LCDMenuLib

So viel ist es ja nicht und im ersten Post hast du schon deine Doku :)
Seite bauen und Playground ist doch nicht nötig, aufs Github drauf wie Jomelo und gut is.
Dann kann Jomelo auch den Hinweis ändern:

Quote
Attention:

when you change from v2.3.4 to 3.0.0 ** the backend system is removed from this lib use this when you need a task system: https://playground.arduino.cc/Code/TaskScheduler

so ähnlich könnts ausschauen:

Quote
Attention:

when you change from v2.3.4 to 3.0.0 ** the backend system is removed from this lib use this when you need a task system: https://github.com/Combie/CombieLib


playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

Go Up