mikrocontroller.net

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


Autor: Andreas Ortner (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: voka (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wozu die Sekunden speichern, wenn du nur jede Minute schalten willst ?

Autor: Rahul Der trollige (rahul)
Datum:

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

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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".

...

Autor: The Daz (Gast)
Datum:

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

  Daz

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... nevermind. Habs kapiert was du meinst ;)

Autor: Rahul Der trollige (rahul)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Andreas Ortner (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.