Berechnung DCF77 Signal

Gast #1596322
Lesenswert?

Hiho ich habe nun meine DCF Uhr am laufen, momentan berechne ich meine 
Zeit so:
1
volatile int dcf_Stunde;
2
....
3

4
....
5
void dcf_calc(void)
6
{    
7
     // Calc Stunde
8
     dcf_Stunde = 0;
9
     if(dcf_bitmask[29] == 1) dcf_Stunde = dcf_Stunde + 1;
10
     if(dcf_bitmask[30] == 1) dcf_Stunde = dcf_Stunde + 2;
11
     if(dcf_bitmask[31] == 1) dcf_Stunde = dcf_Stunde + 4;
12
     if(dcf_bitmask[32] == 1) dcf_Stunde = dcf_Stunde + 8;
13
     if(dcf_bitmask[33] == 1) dcf_Stunde = dcf_Stunde + 10;
14
     if(dcf_bitmask[34] == 1) dcf_Stunde = dcf_Stunde + 20;
15

16
     // Calc Minuten
17
     dcf_Minuten = 0;
18
     if(dcf_bitmask[21] == 1) dcf_Minuten = dcf_minuten + 1;
19
     if(dcf_bitmask[22] == 1) dcf_Minuten = dcf_minuten + 2;
20
     if(dcf_bitmask[23] == 1) dcf_Minuten = dcf_minuten + 4;
21
     if(dcf_bitmask[24] == 1) dcf_Minuten = dcf_minuten + 8;
22
     if(dcf_bitmask[25] == 1) dcf_Minuten = dcf_minuten + 10;
23
     if(dcf_bitmask[26] == 1) dcf_Minuten = dcf_minuten + 20;
24
     if(dcf_bitmask[27] == 1) dcf_Minuten = dcf_minuten + 40;
25

26
     // Calc Datum Tag
27
     dcf_Tag = 0;
28
     if(dcf_bitmask[36] == 1) dcf_Tag = dcf_Tag + 1;
29
     if(dcf_bitmask[37] == 1) dcf_Tag = dcf_Tag + 2;
30
     if(dcf_bitmask[38] == 1) dcf_Tag = dcf_Tag + 4;
31
     if(dcf_bitmask[39] == 1) dcf_Tag = dcf_Tag + 8;
32
     if(dcf_bitmask[40] == 1) dcf_Tag = dcf_Tag + 10;
33
     if(dcf_bitmask[41] == 1) dcf_Tag = dcf_Tag + 20;
34

35
     // Calc Datum Monat
36
     dcf_Monat = 0;
37
     if(dcf_bitmask[45] == 1) dcf_Monat = dcf_Monat + 1;
38
     if(dcf_bitmask[46] == 1) dcf_Monat = dcf_Monat + 2;
39
     if(dcf_bitmask[47] == 1) dcf_Monat = dcf_Monat + 4;
40
     if(dcf_bitmask[48] == 1) dcf_Monat = dcf_Monat + 8;
41
     if(dcf_bitmask[49] == 1) dcf_Monat = dcf_Monat + 10;
42

43
     // Calc Datum Jahr
44
     dcf_Jahr = 0;
45
     if(dcf_bitmask[50] == 1) dcf_Jahr = dcf_Jahr + 1;
46
     if(dcf_bitmask[51] == 1) dcf_Jahr = dcf_Jahr + 2;
47
     if(dcf_bitmask[52] == 1) dcf_Jahr = dcf_Jahr + 4;
48
     if(dcf_bitmask[53] == 1) dcf_Jahr = dcf_Jahr + 8;
49
     if(dcf_bitmask[54] == 1) dcf_Jahr = dcf_Jahr + 10;
50
     if(dcf_bitmask[55] == 1) dcf_Jahr = dcf_Jahr + 20;
51
     if(dcf_bitmask[56] == 1) dcf_Jahr = dcf_Jahr + 40;
52
     if(dcf_bitmask[57] == 1) dcf_Jahr = dcf_Jahr + 80;
53
}

Das scheint mir jedoch sehr umständlich zu sein, gibt es da eine bessere 
Möglichkeit?
#1600335
Lesenswert?

Wie wäre's mit sowas:

#define HOUR_BITS       6
#define HOUR_START      29

uint8_t sum[] = { 1, 2, 4, 8, 10, 20, 40, 80 };

...

uint8_t i, hour = 0;

for(i=0;i<HOUR_BITS;++i)
         if(dcf_bitmask[HOUR_START+i] == '1')
               hour += sum[i];
...

Das Gute an sum[] ist, dass Du es für die Berechnung der anderen Werte 
(Jahr, Monat, etc) auch verwenden kannst.

Viele Grüße
#1600369
Lesenswert?

Draco schrieb:
> Also ich blicke bei Peters Code einfach nicht durch :/ Wo genau wird
> denn dort das DCF Signal dekodiert?!

Der Timerinterrupt mißt Puls und Periodendauer.
scan_dcf77() wertet dann diese Längen aus und ruft decode_dcf77() auf.
Und das addiert dann die Bitwertigkeiten zu den einzelnen Variablen in 
der Struct time.
Dazu wird eine Tabelle benutzt.
Das erste Nibble (0..5) ist die Byteadresse in der Struct time.
Und das zweite Nibble (0..7) ist der Zeiger auf die Tabelle mit den 
Wertigkeiten (1..80).


Peter

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