Zurück   KNX-User-Forum > Supportforen > eibPC
knx-user-forum - International KNX Award Winner 2010


Links
Kalender
Spende

Antwort
 
Themen-Optionen Ansicht
  #11  
Alt 08.01.2013, 12:59
Benutzerbild von wetronic
Benutzer
 
Registriert seit: 08.07.2010
Ort: Leinburg
Beiträge: 46
wetronic ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo,

danke nochmals fuer das rege Interesse. Ich bin nun so weit, dass ich
den Ostertag stabil berechnen kann und einen Satz Funktionen habe
mit denen ich ein Tagesdatum auf eine relative Tageszahl umrechnen kann
( und wieder zurueck ). Damit kann ich dann gut die restlichen Tage bestimmen ( angelehnt an das Makro mit unixtime aus dem CodingWettbewerb ).
Anschliessend werde ich die Feiertage im Flash ablegen und diese
kurz nach Mitternacht ueber eine Schleife mit dem Tagesdatum vergleichen => Flag FEIERTAG.

Sobald alles stabil, melde ich mich wieder ...

Gruss

Wolfgang
__________________
WolfgangFB_Addon_TelNo{ height:15px !important; white-space: nowrap !important; background-color: #0ff0ff;}
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #12  
Alt 08.01.2013, 13:21
Benutzerbild von enertegus
Erfahrener Benutzer
 
Registriert seit: 25.04.2009
Ort: Forchheim
Beiträge: 4.451
enertegus sorgt für eine eindrucksvolle Atmosphäreenertegus sorgt für eine eindrucksvolle Atmosphäreenertegus sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat von Kahler Beitrag anzeigen
Danke für die rasche Antwort, ich hatte schon sowas geahnt. Diese Version funzt nun (ohne if/then hat der Compiler gemeckert):
Gut,
ich würde das Rücksetzen wie beim Beispiel mit dem Geburstagskalender im Handbuch folgt machen:
epc Code:
  1. if dayofweek()==SONNTAG then  Feiertag=EIN endif
  2. if month(1,1) then  Feiertag=EIN endif
  3. if month(6,1) then  Feiertag=EIN endif
  4. // ... usw
  5. if htime(23,59,59) or systemstart() then Feiertag=AUS endif
Dann würde für jeden Feiertag auch immer ein Impuls in der Variable generiert werden.
__________________
offizielles Supportforum für den Enertex® EibPC: http://knx-user-forum.de/eibpc/
Webshop für Produkte rund um Enertex® : http://shop.enertex.de

Geändert von enertegus (08.01.2013 um 17:18 Uhr) Grund: Beim Einschalten ein EIN verhindern
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #13  
Alt 08.01.2013, 13:22
Benutzerbild von enertegus
Erfahrener Benutzer
 
Registriert seit: 25.04.2009
Ort: Forchheim
Beiträge: 4.451
enertegus sorgt für eine eindrucksvolle Atmosphäreenertegus sorgt für eine eindrucksvolle Atmosphäreenertegus sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat von wetronic Beitrag anzeigen
.
Anschliessend werde ich die Feiertage im Flash ablegen und diese
kurz nach Mitternacht ueber eine Schleife mit dem Tagesdatum vergleichen => Flag FEIERTAG.
hm, wieso die im Flash ablegen?
__________________
offizielles Supportforum für den Enertex® EibPC: http://knx-user-forum.de/eibpc/
Webshop für Produkte rund um Enertex® : http://shop.enertex.de
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #14  
Alt 08.01.2013, 14:19
Benutzerbild von wetronic
Benutzer
 
Registriert seit: 08.07.2010
Ort: Leinburg
Beiträge: 46
wetronic ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo Michael,

im Flash, da diese Werte statisch sind und nur zum Jahreswechsel
bestimmt werden. Weiterhin kann ich auf den Flash indexiert mit einer
Schleife zugreifen - gefaellt mir besser als ein PseudoArray mittels c1400
String zu bauen:
Im Flash lege ich jeweils einen String wie folgt ab: "xDD.MM" und "x" kennzeichnet G = gesetzlich, B = Geburtstag, F = allg. Feiertag ...

Nach Mitternacht wird dann das neue Tageadatum gegen den Flash
geprueft und ich habe dann ein Flag: Art des Feiertags ...

( oder kann man inzwischen Arrays klassisch abbilden ? )

Gruss

Wolfgang
__________________
WolfgangFB_Addon_TelNo{ height:15px !important; white-space: nowrap !important; background-color: #0ff0ff;}
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #15  
Alt 08.01.2013, 15:27
Benutzerbild von enertegus
Erfahrener Benutzer
 
Registriert seit: 25.04.2009
Ort: Forchheim
Beiträge: 4.451
enertegus sorgt für eine eindrucksvolle Atmosphäreenertegus sorgt für eine eindrucksvolle Atmosphäreenertegus sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat von wetronic Beitrag anzeigen
Im Flash lege ich jeweils einen String wie folgt ab: "xDD.MM" und "x" kennzeichnet G = gesetzlich, B = Geburtstag, F = allg. Feiertag ...
Wieso denn dann im Flash abspeichern? Der String hat es dann doch schon. Da bringt das Abspeichern nicht viel. Oder was versteh ich nicht?
__________________
offizielles Supportforum für den Enertex® EibPC: http://knx-user-forum.de/eibpc/
Webshop für Produkte rund um Enertex® : http://shop.enertex.de
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #16  
Alt 08.01.2013, 17:49
Erfahrener Benutzer
 
Registriert seit: 18.12.2008
Ort: Landkreis Ludwigsburg
Beiträge: 998
Tessi befindet sich auf einem aufstrebenden Ast
Standard

Zitat von enertegus Beitrag anzeigen
Wieso denn dann im Flash abspeichern?
Weil viele Strings abgelegt und danach per Index gelesen werden sollen. Das geht sonst so nicht da der EibPC ja keine echten Arrays kennt.
Ich würde ein c1400 Pseudoarray verwenden, aber Wolfgang mag das so nun einmal nicht.


Aber was ich mich hier schon die ganze Zeit frage:

Den Spieltrieb in allen Ehren, macht es wirklich Sinn Ostern und einige andere bewegliche Basistage wie z.B. 1.Advent im EibPC zu berechnen?

Mal nachgedacht, um ein Datum zu speichern brauche ich 1 Byte für den Tag, 1 Byte für den Monat und wenn ich 2000 als Offset verwende kann ich mit 1 Byte beim Jahr bis 2255 gehen. Somit benötigt ein Datum 3 Byte. In einen String passen dann 466 Tage (= 1398 Byte).

Die meisten Feiertage sind fix, viele bewegliche hängen von Ostern ab, einige bewegliche vom 1.Advent. Sommerzeit, Winterzeit und Muttertag haben ihre eigenen Regeln. Da kommen wir auf 5 bewegliche Tage im Jahr, die nicht durch einen fixen Offset von anderen abhängen.

Da passen dann also 93 Jahre (= 465 Tage = 1395 Byte) in einen String. Wer noch 10 weitere Tage hat, kann immer noch 31 Jahre vorberechnen. Ich wage zu behaupten, das keiner hier so lange einen EibPC in Betrieb haben wird.

Also sollte das mehr als genug sein. Warum also Zeit fürs Entwickeln und Debuggen und Rechenleistung dafür verbraten? Bis der Code fehlerfrei läuft hat man die Tabelle schon für Jahrhunderte vom PC berechnen lassen.

Eine elegante Lösung ist halt nicht unbedingt immer auch die vernünftigste...
__________________
Tessi
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #17  
Alt 09.01.2013, 00:00
Benutzerbild von wetronic
Benutzer
 
Registriert seit: 08.07.2010
Ort: Leinburg
Beiträge: 46
wetronic ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo Tessi,

hast generell Recht - wegen den paar Werten sollte man sich den Aufwand schon ueberlegen ...
Hinsichtlich dem Array ist es genau so - ich wollte indexiert zugreifen.
Habe aber inzwischen eingesehen, dass es wenig sinnvoll ist und einfache
Strukturen auch ihren Vorteil haben.
Daher habe ich jetzt meine Struktur wie folgt umgesetzt:
+ ich bestimmer ueber ein Makro ( Ostertag() ) den Ostertag
+ mit einer Abwandlung von "UnixTime" kann ich Tage addieren
und daraus wieder ein Datum berechnen ( ist mir hilfreich fuer weitere
Datumsoperationen ): damit habe ich eine handvoll Variablen mit den
Feiertagen
+ ueber diese Feiertage bilde ich mir ueber eine Funktion IsFeiertag()
ein Flag zur Steuerung: z.B. Jalousie etc.

Ich werde nun die nächsten Tage testen ;-)

Gruss

Wolfgang
FB_Addon_TelNo{ height:15px !important; white-space: nowrap !important; background-color: #0ff0ff;}
__________________
WolfgangFB_Addon_TelNo{ height:15px !important; white-space: nowrap !important; background-color: #0ff0ff;}
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #18  
Alt 09.01.2013, 15:20
Erfahrener Benutzer
 
Registriert seit: 18.12.2008
Ort: Landkreis Ludwigsburg
Beiträge: 998
Tessi befindet sich auf einem aufstrebenden Ast
Standard

Was übrigens auch ginge:
Für jeden Tag im Jahr gibt es ein Bit im String das anzeigt, ob es ein Feiertag ist, oder nicht.
Pro Monat würde ich einfach 4 Byte = 32 Bit nehmen (auch wenn nur 28 bis 31 Bit davon gebraucht werden und so 18 bis 19 Bits pro Jahr ungenutzt bleiben), ein Jahr belegt so 48 Byte. Damit passen in einen c1400 String 29 Jahre und 8 Byte bleiben frei. In 2 dieser 8 Byte sollte das Jahr und in einem der Monat stehen, mit dem diese Tabelle beginnt. Wer also ab Januar 2013 berechnet, schreibt dort 2013 und 1 hinein.
Der u32 Wert eines Monats hat dann den Index (Jahr-2013)*12+(Monat-1).
Den Tag ermittle ich mit
Es gibt keine Bit-shift-Befehle!!! Rotation ist auch nicht möglich!!!

Wie generiere ich aus einer Zahl n eine 32 Bit Maske, bei der nur das n. Bit gesetzt ist? Muss ich etwa eine Schleife bauen, die 1 n mal mit 2 multipliziert? Oder ein Pseudo-Array mit 32 32 Bit Masken?
Wieso gibt es ausgerechnet die einfachsten Bitmanipulationen nicht, die jeder Controller bereits als atomare Maschinenbefehle hat?

Und kommt mir jetzt nicht mit pow(2,n), der funktioniert nur mit f32 und ob da nach convert() in ein u32 dann noch genau nur das n. Bit gesetzt ist, wäre angesichts der geringen Genauigkeit von f32 erst einmal zu beweisen. Abgesehen davon ist die Berechnung von 2^n als f32 erheblich aufwendiger als ein simples shift left n Bit bei einem u32.
__________________
Tessi
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #19  
Alt 09.01.2013, 19:36
Benutzerbild von enertegus
Erfahrener Benutzer
 
Registriert seit: 25.04.2009
Ort: Forchheim
Beiträge: 4.451
enertegus sorgt für eine eindrucksvolle Atmosphäreenertegus sorgt für eine eindrucksvolle Atmosphäreenertegus sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat von Tessi Beitrag anzeigen
Es gibt keine Bit-shift-Befehle!!! Rotation ist auch nicht möglich!!!

Wie generiere ich aus einer Zahl n eine 32 Bit Maske, bei der nur das n. Bit gesetzt ist? Muss ich etwa eine Schleife bauen, die 1 n mal mit 2 multipliziert? Oder ein Pseudo-Array mit 32 32 Bit Masken?
Und kommt mir jetzt nicht mit pow(2,n), der funktioniert nur mit f32 und ob da nach convert()

epc Code:
  1. // Maske
  2. u=0xFF0u32 and 0x100u32
  3. // Shiften nach rechts
  4. s1=u/0x10u32
  5. // Shiften nach links
  6. s2=s1*0x10u32
__________________
offizielles Supportforum für den Enertex® EibPC: http://knx-user-forum.de/eibpc/
Webshop für Produkte rund um Enertex® : http://shop.enertex.de
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #20  
Alt 10.01.2013, 10:38
Erfahrener Benutzer
 
Registriert seit: 18.12.2008
Ort: Landkreis Ludwigsburg
Beiträge: 998
Tessi befindet sich auf einem aufstrebenden Ast
Standard

Ein grimmiges ??
Das ist jetzt ein Missverständnis!

Das ich mit "and" eine Maske anwenden kann ist klar (und ist sicherlich nur der Vollständigkeit halber erwähnt worden)

Das eine Multiplikation oder Division mit speziellen Werten im Resultat wie eine Verschiebung wirkt ist auch nicht neu - hilft mir aber noch nicht, denn:

Wenn ich so "schieben" wollte, hätte ich aber immer noch einen ungelösten Punkt:
Ich habe nicht den passenden Multiplikator/Divisor sonder die Anzahl an Bits um die geschoben werden soll.

Also wie komme ich im vorliegenden Beispiel von der Anzahl 4 auf den Multiplikator 0x10?
Und wie käme ich bei einem 63 Bit Shift (um z.B. aus 1u64 8000000000000000u64 zu machen) vom Wert 63 auf den notwendigen Multiplikator 8000000000000000u64?

Aber bevor man hier mathematische Ungetüme aufbaut, wäre ein simpler Shift-Befehl nicht nur einfacher in der Anwendung sondern auch unschlagbar schnell in der Ausführung.

Das darf jetzt durchaus als Feature-Wunsch betrachtet werden
__________________
Tessi
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus



Alle Zeitangaben in WEZ +2. Es ist jetzt 11:20 Uhr.



SEO by vBSEO