mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Algorithmus für Zeit zw 2 Zeiten


Autor: ???? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich muss eine Messung durchführen, wenn die Zeit (die ich über einem RTC 
geschickt bekomme) zwischen 2 anderen Zeiten liegt.

Also z.b.

Start:
Sekunde, Minute, Stunde, Tag Monat, Jahr

Ende:
Sekunde, Minute, Stunde, Tag Monat, Jahr

Das einzige was mir da einfallen würde wäre, zuerst abzufragen, ob 
aktuelles Jahr zwischen Start und End-Jahr liegt. Wenn ja dann messen.
Wenn nicht, ist aktuelles Jahr = Start-Jahr, dann Frage Monat ab.... Das 
ganze zieht sich dann bis hin zu Sekunden.
Wenn aktuelles Jahr nicht gleich Start-Jahr ist, dann frage ab ob 
aktuelles Jahr gleich End-Jahr ist. Wenn ja, dann Frage Monat ab ob 
kleiner usw. bis Sekunden.

Der Algorithmus herfür wird mindestens 100 Codezeilen lang, gibt es 
dafür nicht irgendwie eine elegantere Lösung. Mir fällt dazu gerade aber 
gar keine andere Variante ein. Jemand eine Idee????

Autor: ???? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei den Monaten muss natürlich nicht nur geschaut werden ob kleiner oder 
größer, sondern ob Wert dazwischen liegt.

z.b. Startjahr 2000 und Startmonat 8
Endjahr 2000 und Endmonat 10

dann dürfte bei aktueller Zeit: Jahr 2000 und Monat 12 auch keine 
Messung stattfinden, was bedeutet, das der Code wieder extrem viel 
größer wird.

Ist es wirklich für so eine einfache Abfrage nötig, so viel Code zu 
schreiben?!

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beide Zeite ab einem bel. Jahr(2008) in Sekunden umwandenln
und schauen ob die Zeit dazwischen liegt?

Autor: Bernd M. (bernd_m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

wie wärs damit, die komplette Zeitinfo in ein 32Bit Integer zu 
umzurechnen und dann mit diesem Ergebnis weiter arbeiten (-> UNIX 
Zeitformat o.ä.)

Gruss
Bernd

Autor: ???? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Boa danke! Ihr seid meine Rettung.

Das ist wirklich extrem gescheit, einfach alles in Sekunden umwandeln 
und dann brauche ich nur einen Vergleich!

Habs mir ausgerechnet, mit meinen IF abfragen hätte ich ungefähr 400 IF 
Anweisungen gebraucht.

Danke Leute!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
???? wrote:

> Der Algorithmus herfür wird mindestens 100 Codezeilen lang

Also ich komme auf 14 Codezeilen:

#include <stdio.h>


struct time {
  uint8_t se;
  uint8_t mi;
  uint8_t ho;
  uint8_t da;
  uint8_t mo;
  uint8_t ye;
};


struct time start, end, now;


uint32_t get_sec( struct time t )
{
  return ((((t.ye * 12UL + t.mo) * 31 + t.da) * 24 + t.ho) * 60
         + t.mi) * 60 + t.se;
}


uint8_t dazwischen( void )
{
  uint32_t now_sec = get_sec(now);

  return now_sec > get_sec(start) && now_sec < get_sec(end);
}


Peter


P.S.:
Es reicht, wenn get_sec monoton ist, die Lücken stören also nicht.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bilde doch die Differenz aus dem gregorianischer Kalender.

mit (jeweils 1 und 2):
y als Jahr
m als monat
d als tag
dTage=(y1-y2)*365 + y1 DIV 4 - y2 DIV 4 - y1 DIV 100 + y2 DIV 100 + y1 DIV 400 - y2 DIV 400 
+ (m1*306+5)/10 - (m2*306+5)/10 + (d1-1) - (d2-1);

Damit solltest du die Differenz in Tage erhalten (inklusive 
Schaltjahre).
(keine Gewähr ;) )

Dann noch die Stunden (std), Minuten (min) und Sekunden (sec) 
hinzurechen:
dSekunden=dTage*86400 + (std1-std2)*3600 + (min1-min2)*60 + (sec1-sec2)

Das müsste funktionieren...

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ich muss eine Messung durchführen, wenn die Zeit (die ich über einem RTC
>geschickt bekomme) zwischen 2 anderen Zeiten liegt.

Liefert die RTC BCD Werte?
Dann kannst du die Zeit in z.B. zwei 32 Bit Variablen
schieben. Damit reduzieren sich die Vergleiche erheblich.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was "fauleres" hab ich schon lange nicht mehr gesehen. :)

>  uint8_t se;
>  uint8_t mi;
>  uint8_t ho;
>  uint8_t da;
>  uint8_t mo;
>  uint8_t ye;

Geiz ist Geil! :)

Autor: ???? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Öhm ich habe noch eine Frage dazu...
Wenn ich das Jahr in Sekunden umrechne, wären das 31 536 000 Sekunden. 
So jetzt gibt es aber Schaltjahre, das heißt ein Schaltjahr hätte 31 622 
400 Sekunden. Muss ich das irgendwie berücksichtigen?
Oder soll ich pro Jahr 31556926 Sekunden nehmen (was der Mittelwert 
wäre: 365 Tage + 5 Stunden + 48 Minuten + 46 Sekunden )

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.. alle 4 Jahre ist ein Schaltjahr
   Jahr Modulo 4
mit bekanntem Startjahr sollte Deide Frage geklärt haben.

Autor: ???? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also der Source von Peter Dannegger schaut sehr gut aus, ich glaube so 
werde ich es wirklich machen. Großes danke.

Allerdings hast du 31 * Monate geschrieben, damit gehst du davon aus, 
das jeder Monat 31 Tage hat... Geht das so einfach???

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... nein

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger wrote:
> Dann kannst du die Zeit in z.B. zwei 32 Bit Variablen
> schieben. Damit reduzieren sich die Vergleiche erheblich.

Stimmt, der Code wird deutlich kürzer:

uint32_t get_sec( struct time t )
{
  return ((((((((((uint32_t)t.ye<<4) + t.mo)<<5) + t.da)<<5) + t.ho)<<6)
         + t.mi)<<6) + t.se;
}

Es sind dann aber nur 64 Jahre Differenz möglich.


Peter

Autor: ???? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...

und wie wandle ich dann die Monate in Sekunden um????

Sollte ich direkt die Jahre in Sekunden umwandeln und dann den Monat mit 
select case einzeln in 12 abfragen in Sekunden umwandeln??? Sorry jungs, 
aber mir fällt dazu wieder keine bessere Idee ein....

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
überleg mal:

wieviele Monate gibt es mit 31, 30, 28(29) Tagen  ;gild für ein Jahr

Sekunden = Monate31 * 31 + Monate30 *30 + Monate2829 28  24 * 3600

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus wrote:
> ... nein

Für die vorliegende Aufgabenstellung: Ja, kann man so machen.
Wichtig ist nur, dass sich eine mit der Zeit aufsteigende Zahlenfolge 
ergibt. Ob da jetzt Lücken drinn sind oder nicht, spielt keine Rolle.
Peters Verfahren stellt sicher, dass für 00:00:01 am 1. März eine 
größere Zahl rauskommt als für den 28.Februar 23:59:59. Mehr braucht es 
auch nicht. Niemand verlangt, dass zwischen beiden Zeitpunkten in 
Zahlenform nur eine Differenz von 2 liegen muss. Größer reicht schon.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sekunden = Monate31 * 31 + Monate30 *30 + Monate2829 28  24 * 3600

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sekunden = Monate31 * 31 + Monate30 *30 + Monate2829  28  24 * 3600

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> dann den Monat mit
> select case einzeln in 12 abfragen in Sekunden umwandeln???

Der Februar hat nicht immer gleich viele Tage ;)

Ohne gregorianische Kalender wirst du hin und wieder kräftige Sprünge in 
deiner Zeitdifferenz bekommen.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter
>> Dann kannst du die Zeit in z.B. zwei 32 Bit Variablen
>> schieben. Damit reduzieren sich die Vergleiche erheblich.

>Es sind dann aber nur 64 Jahre Differenz möglich.

Ich meinte tatsächlich zwei 32 Bit Variablen pro Uhrzeit.
Wenn die RTC BCD Code liefert einfach alle Werte in ein
eigenes Byte schieben. Also nicht Bits sparen wie du es gemacht hast.
Oder ein long long mit 64 Bit wenn der Compiler das mag.
Das sollte bis 9999 reichen. Danach interessiert es wohl
keinen mehr ;)

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
such mal im I-Net nach "ewiger Kallender"

es sind Algos zu Dutzenden unterweges.

Autor: Rik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> alle 4 Jahre ist ein Schaltjahr

Das stimmt nicht.

Weiteres Problem: Schaltsekunden sind nicht vorhersagbar, weil die von 
den Leuten bei der PTB (?) festgelegt werden.

Autor: Ralli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Rik

Das macht der IERS in Paris!

(Der Internationale-Erd-Dreh-Dienst) ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.