Hallo µC-Freaks, ich hab mir eine Platine neu entwickelt und möchte mit der eine Wochenzeitschltuhr realisieren. Die Uhr funktioniert schon. Die kann ich auch schon mit 4-zu-3-Tastenfeld einstellen. Jetzt suche ich nach einem speicherreduzierenden Format um die Zeiten im EEPROM abzuspeichern. Die Zeit sieht mir so aus: struct sct_time {unsigned char month; unsigned char day; unsigned char week_day; unsigned char hour; unsigned char minute; unsigned char second;}; Für die EEPROM-Ablage wird das allerdings zu volumenoes und muss komprimiert werden. Hat jemand eine Idee? Die Zeiten wollte ich einfach nacheinander ins EEPROM ablegen. Wann die am nächsten liegende Schaltzeit liegt wollte ich mit einer for-next Schleife ermitteln und dann jede Minute auf Schaltereignis prüfen. Mit der Library time.h kann ich nicht umgehen. Ist das dann nicht zu Rechnenintensiv? Das Bild von der Box ist dem Anhang beigefügt. Chip type : ATMega32 Clock frequency : 8 MHz Danke!
Nimm ein Bitfeld : typedef union { struct { int month : 4; int day : 5; int weekday : 3; int hour : 5; int minute : 6; int second : 6; int unused : 3; } bits; unsigned long flat; } Compressed; Ergibt 32 bit pro Eintrag. 3 Byte weniger als alles mit chars zu speichern.
Wozu die Sekunden speichern, wenn du nur jede Minute schalten willst ?
man könnte auch die Differenz (in Minuten) zu einem Datum speichern. Übrigens hast du den Wochentag vergessen...
das könnte man mit 3 Bytes erledigen... für ein paar Jahre... Das wäre eine 24Bit-breite Zahl. Also 2^24 = 16.777.216 Minuten bzw. 279620,27 Stunden bzw. 11650,84 Tage bzw 31,92 Jahre. Nur die Berechnung der Zahl erfordert etwas Mathematik...
Willst du eine "Uhr mit Kalender" oder eine Schaltuhr, die Wochentage berücksichtigt? Bei einer Auflösung von 2 Sekunden passt die Uhrzeit in zwei Bytes. Reicht eine Auflösung von 6 Minuten, dann genügt ein Byte. Zusätzlich würde ich aber noch ein Byte als "Wochentagsmaske" nutzen. In diesem sind 7 Bits den 7 Wochentagen zugeordnet. In jedem "Zeitstempel" werden dann die Bits gesetzt, die den Wochentagen entsprechen, an denen die Aktion ausgeführt werden soll. Damit lassen sich dann Gruppenfunktionen realisieren. Z.B. Schalte Mo-Fr 6:00 oder schalte Sa+So 9:00. Die "Uhrzeit" ist dann in einer einzigen Variable codiert, der Wochentag in einer anderen. Das vereinfacht die Auswertung (Vergleich) kollossal. Dafür wird die Anzeigeroutine für das LCD etwas aufwendiger, aber keinesfalls komplizierter als die Umwandlung einer 16-Bit-Zahl in ASCII-Ziffern. Mit 4 Bytes (im EEP) pro "Datensatz" - 2 Bytes Uhrzeit im 2s-Raster - 1 Byte Wochentagsmaske - 1 Byte Kanalnummer und Aktion (128 Kanäle ein/aus) kann man schon eine Menge "schalten und walten". Da wirst du einige Schieberegister anschließen können um die dazu nötigen Schaltausgänge zu schaffen. Sieh es als Denkanstoß, nicht als "Bauanleitung". ...
@Hannes, wie bringst du in einem byte 128 Kanaele und die Aktion dazu unter ? Daz
2^7 = 128. + 1 Bit für den Schaltzustand ==> 8 Bit.
Nunja, ist ja schon geklärt... Ein "Zeitstempel" im EEP kümmert sich um 1 Ereignis, ohne dabei die anderen "Kanäle" zu berücksichtigen. Man kann aber auch "Gruppen" definieren, soll heißen, dass bei einer reservierten Kanalnummer alle Kanäle (oder eben eine Gruppe) angesprochen werden. Auch ist denkbar, dass es weniger Kanäle sind, dafür aber mehrere Aktionen pro Kanal. Z.B. für Rolladen: - sofort schließen - schließen wenn es dunkel wird - schließen wenn es zu hell/warm wird - sofort öffnen - öffnen wenn es hell wird - ... Das erfordert natürlich, dass es für jeden Kanal eine Zustandsvariable gibt und dass bei jeder Auswertung auch die Zustandsvariablen (und die Sensoren) überprüft werden, ob es etwas zu tun gibt. Ist es dann "getan" (also z.B. das Rollo geschlossen weil es dunkel wurde), dann wird die Zustandsvariable gelöscht bzw. auf den tatsächlichen Wert ("Rollo ist zu") gesetzt, damit die Aktion nicht nochmal ausgeführt wird. ...
Ich komme nach Hause uns sehe eine Menge Antworten. Vielen Dank. mikrocontroller.net ist mein Lieblingsforum für µC. Wenn ich reif werde in dem Gebiet werde ich auch gerne anderen helfen. Für eine Wochenzeitschaltuhr ist der Vorschlag von Hannes super und völlig ausreichend. Die Lösung von Rahul ist super falls mein einen Kalender Braucht. Ich habe in Erinnerung dass es einen Algorithmus auch zur Berechnung von Wochentagen anhand des Kalendertages gibt. Kennt jemand den link dazu? Hier im Anhang noch Bilder von meiner Platine mit vielen SPS-Features. RTC, Lautsprecher, Frequenzzähler, Analog Inputs usw. - Damit wird ein Gewächshaus und die Gießvorgänge automatisiert. Als Weiteres Ziel würde ich noch die Aktoren über einen Eindrahtbus (ähnlich LIN) miteinander verbinden. Es steigert Flexibilität der Anlage.
Früher waren in Taschenkalendern oft "ewige Kalender" (google!)enthalten. Das waren einfach Tabellen, die mithilfe der "Doomsday-Methode" berechnet waren. Der TI-58 ti59 (einer der ersten programmiebaren Taschen-Tipper) hatte eine SW-Library dabei, mithilfe der man den Wochentag und die Anzahl der Tage zwischen zwei Daten berechnen konnte. Die habe ich mal analysiert und in C umgeschrieben: http://www.mikrocontroller.net/forum/read-1-116742.html
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.