Komprimiertes Zeitformat für die EEPROM-Ablage

Gast #256231
Lesenswert?

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!
Angehängte Dateien:
Gast #256232
Lesenswert?

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.
#256236
Lesenswert?

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".

...
#256240
Lesenswert?

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.

...
Gast #256241
Lesenswert?

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.
Angehängte Dateien:
Gast #256243
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren