Forum: Mikrocontroller und Digitale Elektronik Komprimiertes Zeitformat für die EEPROM-Ablage


von Andreas Ortner (Gast)


Angehängte Dateien:

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!

von The Daz (Gast)


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.

von voka (Gast)


Lesenswert?

Wozu die Sekunden speichern, wenn du nur jede Minute schalten willst ?

von Rahul D. (rahul)


Lesenswert?

man könnte auch die Differenz (in Minuten) zu einem Datum speichern.
Übrigens hast du den Wochentag vergessen...

von Rahul D. (rahul)


Lesenswert?

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

von Hannes L. (hannes)


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

...

von The Daz (Gast)


Lesenswert?

@Hannes,
wie bringst du in einem byte 128 Kanaele und die Aktion dazu unter ?

  Daz

von The Daz (Gast)


Lesenswert?

... nevermind. Habs kapiert was du meinst ;)

von Rahul D. (rahul)


Lesenswert?

2^7 = 128.
+ 1 Bit für den Schaltzustand ==> 8 Bit.

von Hannes L. (hannes)


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.

...

von Andreas Ortner (Gast)


Angehängte Dateien:

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.

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?


von Profi (Gast)


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

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
Noch kein Account? Hier anmelden.