#pragma once
#include "dcf77.h"
// Dekoder für den DCF77-Zeitsender.
struct DCF77Data{
byte wl, // 0 MStart W1 W2 W3 W4 W5 W6 W7
wh, // 8 W8 W9 W10 W11 W12 W13 W14 -
inf, //16 Ant AnkZ MESZ MEZ AnkS TStart - -
min, //24 M1 M2 M4 M8 M10 M20 M40 MPar
hod, //32 H1 H2 H4 H8 H10 H20 HPar -
day, //40 DPar (0) D1 D2 D4 D8 D10 D20
wdm, //48 W1 W2 W4 M1 M2 M4 M8 M10
rok; //56 Y1 Y2 Y4 Y8 Y10 Y20 Y40 Y80
operator byte*() {return &wl;}
operator const byte*() const {return &wl;}
};
struct DateTime{ // BCD oder binär, das kommt auf das Dateninterface an!
byte Minute; // 0..59 DS3231: Alles BCD
byte Hour; // 0..23 DS3231: Bit 6 = 12h-Bit, wenn gesetzt dann 1..12 und Bit 5 = AM/PM
byte WDay; // 0..6, 0 = Sonntag DS3231: 1..7, 1 = Sonntag
byte Date; // 0..x-1 DS3231: 1..x
byte Month; // 0..11 DS3231: 1..12, Bit 7 = Jahresüberlauf
byte Year; // 0..99, 0 = 2000
void operator++();
byte operator=(const DateTime&); // Flash als Quelle möglich; liefert Bit7:3 für verändertes Byte
unsigned operator=(const DCF77Data&); // Flash als Quelle möglich, liefert Bit11:0 für Fehler
void print() const;
};
// Kein RAM-Vielfraß mehr: 18 Bytes
extern struct DCF77Dec{
byte Grade; // 0: Keine Minutenmarke empfangen, 1: Sekunden vielleicht, 2: Zeit gültig, 3+: Zeit aufeinanderfolgend gültig
byte Info; // Fünf Infobits
byte Second; // 0..59 DS3231: BCD
DateTime dt;
private:
byte recvbit;
public:
DCF77Data data;
void ProcessVal(byte twobit); // Bit 1 = Minutenbit, Bit 0 = Datenbit, 0 = Trägerabsenkung
}dcf77dec;
// - "Grade"
// Gibt die Anzahl von aufeinanderfolgend zueinander passenden
// (Prüfbit- und Konsistenzprüfung) Minutendatensätze an.
// Der Wert spiegelt die Fehlerwahrscheinlichkeit wider.
// - Gültigkeit der Werte in der DCF77Dec-Struktur
// Grade=0 : undefiniert
// Grade=1 : Sekunden stimmen, alle anderen Angaben 0
// Grade=2 : 1× fehlerfrei empfangen: akzeptabel
// Grade=3 : 2× hintereinanderweg: sicher
// Grade>4 : 3+× hintereinanderweg: äußerst sicher
// Einmal korrekt empfangen fällt „Grade“ nie auf 1 zurück.
// - Zeitdifferenz / exakter Zeitbezug (innerhalb einer Sekunde)
// Der nach Aufruf vom DCF77Dec_ProcessVal() in TDCF77Dec
// angegebene Zeitstempel gilt für die kommende Sekundenmarke.
// Empfänger stellen Bits 200ms nach der 59. Sekunde bereit.
// Die Dekoderzeit geht damit um etwa 800ms vor.
// - „Zone“: Zeitzonen gibt es in halben und Viertelstunden
// Das passt glücklicherweise in ein char mit ±24 × 4 = ±96 Einstellschritten
// Falls daraus mal eine Weltzeituhr werden soll …
Detected encoding: UTF-8 | 0
|