Go Down

Topic: millis()-Glaubensfrage (Read 1 time) previous topic - next topic

Chris72622

Hallo,

ist es lediglich eine Glaubensfrage, was "man" verwenden sollte?  :smiley-roll:

Code: [Select]
if(millis()-intervall>letzter_zeitpunkt)

if(millis()>letzter_zeitpunkt+intervall)


Gruß Chris
https://github.com/jeffThompson/DarkArduinoTheme

Udo Klein

Meiner Meinung nach ist das keine Glaubensfrage sondern eine Kenntnisfrage. Wenn Du Dich besser auskennst, dann ist die Antwort weder noch. Ich sag nur "msTimer2 und Freunde".
Check out my experiments http://blog.blinkenlight.net

jurs

#2
Oct 25, 2013, 04:13 pm Last Edit: Oct 25, 2013, 04:59 pm by jurs Reason: 1

ist es lediglich eine Glaubensfrage, was "man" verwenden sollte?  :smiley-roll:

Code: [Select]
if(millis()-intervall>letzter_zeitpunkt)

if(millis()>letzter_zeitpunkt+intervall)



Was sind denn das für Alternativen, wenn Du die Wahl zwischen Pest und Cholera anbietest?

Korrekt natürlich:
Code: [Select]
if(millis()-letzter_zeitpunkt>=intervall)


Chris72622

Ich sag nur "msTimer2 und Freunde".


Läuft laut Spezifikationen nicht auf dem Mega, oder? Worin bestehen denn die großen Vorteile?

http://playground.arduino.cc/Main/MsTimer2

Gruß Chris
https://github.com/jeffThompson/DarkArduinoTheme

Udo Klein

msTimer2 löst dann aus wenn der Interrupt kommt und nicht dann wen der Code drankommt.
Weiterhin trennt das Design dann sauberer zwischen der eigentlichen Arbeit und der Zeitbehandlung.

Nachteilig ist, daß man dazu zumindest rudimentär verstehen muß was es bedeutet nebenläufigen Code zu haben. Deshalb hatte ich ja gesagt, daß es eine Kenntnisfrage ist. Die msTimer2 auf einen anderen Controller zu portieren ist nicht schwierig.

Wenn Du die Vorteile nicht siehst, kannst Du auch die andere Lösung verwenden. Allerdings ist die Detailfrage auf welcher Seite des Vergleichs man rechnen soll von untergeordneter Bedeutung. Ich würde die Konstante auf eine Seite alleine sortieren. Im Zweifelsfall gibt das infinitesimal kompakteren und schnelleren Code. An dieser Stelle zu optimieren ist aber weniger wirkungsvoll als den Nummernschildhalter am Auto abzuschrauben um Sprit zu sparen.
Check out my experiments http://blog.blinkenlight.net

guntherb

Ich glaube, das ist kein Unterschied, würde das aber eher so machen:

Code: [Select]
if(millis()>naechster_zeitpunkt){
 naechster_zeitpunkt = millis()+intervall;
 // sonstige Befehle
}

dann muß die Summe nur einmal berechnet werden.
Grüße
Gunther

Chris72622

An dieser Stelle zu optimieren ist aber weniger wirkungsvoll als den Nummernschildhalter am Auto abzuschrauben um Sprit zu sparen.


Alles klar- werd dann mal den Schraubendreher rausholen.  :smiley-zipper:

Gruß Chris
https://github.com/jeffThompson/DarkArduinoTheme

Udo Klein

Wenn Du dabei bist kannst Du auch noch gleich die Fußmatten saugen. Das bringt nochmal zusätzliche Gewichtsersparnis ;)
Check out my experiments http://blog.blinkenlight.net

jurs


Ich glaube, das ist kein Unterschied, würde das aber eher so machen:


Es macht beim Timen von Intervallen mit Hilfe der millis() Funktion keinen Unterschied bei Programmen, die weniger als 25 oder 50 Tage am Stück laufen, bevor sie resettet werden.

Wenn man Programme schreibt, die korrekte Intervalle auch bei Sketch-Laufzeiten von mehr als 50 Tagen am Stück einhalten sollen, und zwar bei allen Intervallen, auch über den Überlauf des Timers hinweg, der muß sich an bestimmte Standards halten.

Schachmann


Wenn Du dabei bist kannst Du auch noch gleich die Fußmatten saugen. Das bringt nochmal zusätzliche Gewichtsersparnis ;)


Und Aschenbecher ausleeren  XD

Gruß,
Ralf
Es gibt 10 Arten von Menschen, die einen verstehen Binär, die anderen nicht...

uwefed


Ich glaube, das ist kein Unterschied, würde das aber eher so machen:

Code: [Select]
if(millis()>naechster_zeitpunkt){
 naechster_zeitpunkt = millis()+intervall;
 // sonstige Befehle
}

dann muß die Summe nur einmal berechnet werden.


Der Unterschid ist ob bei einem Überlauf der Intervall korrekt berechnet wird oder nicht.
Nehmen wir mal an daß der Überlauf bei 9 auftritt und nach 9  0 kommt.
Annahme millis() ist 7 und intervall ist 3 und naechster_zeitpunkt war am anfang 6
Daraus laut Deine Rechnung ergibt sich:
Code: [Select]
if(7>naechster_zeitpunkt){  // 7 ist > 6
  naechster_zeitpunkt = 7+3; = 0
  // sonstige Befehle
}

Nächster Durchlauf nach 1 Millisekunde:
Code: [Select]
if(7>0){   / bedingung ist wahr obwohl nur 1 Milliskunde vergangen ist und nicht 3 wie intervall.
  naechster_zeitpunkt = 7+3; = 0
  // sonstige Befehle
}


Der Überlauf wird falsch gehandhabt.
Grüße Uwe

uwefed



Wenn Du dabei bist kannst Du auch noch gleich die Fußmatten saugen. Das bringt nochmal zusätzliche Gewichtsersparnis ;)


Und Aschenbecher ausleeren  XD

Gruß,
Ralf

Dann muß mann auch doppelt fleißig die Insektenkadaver von der Windschutzscheibe kratzen (wegen Gewicht und Verschlechterung des cw-Wertes durch Unebenheit).  ;) ;)
Grüße Uwe

Chris72622

Wenn man Programme schreibt, die korrekte Intervalle auch bei Sketch-Laufzeiten von mehr als 50 Tagen am Stück einhalten sollen, und zwar bei allen Intervallen, auch über den Überlauf des Timers hinweg, der muß sich an bestimmte Standards halten.


Welche sind das?

Gruß Chris
https://github.com/jeffThompson/DarkArduinoTheme

uwefed


Wenn man Programme schreibt, die korrekte Intervalle auch bei Sketch-Laufzeiten von mehr als 50 Tagen am Stück einhalten sollen, und zwar bei allen Intervallen, auch über den Überlauf des Timers hinweg, der muß sich an bestimmte Standards halten.


Welche sind das?

Gruß Chris


Das hat ja jurs im Reply #2 schon beschrieben:
Quote
Korrekt natürlich:
Code: [Select]
if(millis()-letzter_zeitpunkt>=intervall)


Grüße Uwe

Chris72622

Na wenn das alles ist.  :*

Gruß Chris
https://github.com/jeffThompson/DarkArduinoTheme

Go Up