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????
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?!
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
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!
Damit solltest du die Differenz in Tage erhalten (inklusive
Schaltjahre).
(keine Gewähr ;) )
Dann noch die Stunden (std), Minuten (min) und Sekunden (sec)
hinzurechen:
>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.
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! :)
Ö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 )
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???
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:
...
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....
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.
> 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.
@ 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 ;)
> 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.