Forum: Mikrocontroller und Digitale Elektronik Berechnung DCF77 Signal


von Draco (Gast)


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?

von Peter D. (peda)


Lesenswert?

Ja, die verschenkten 60 Bytes könntest Du irgendwann besser gebrauchen.

Ich werte die Bits direkt in "harter" Echtzeit aus:

Beitrag "DCF77 Uhr in C mit ATtiny26"


Peter

von Marius S. (lupin) Benutzerseite


Lesenswert?

Warum codet man überhaupt noch selbst, wenn es schon ne Lösung vom 
Dannegger gibt?

von wuff (Gast)


Lesenswert?

warum macht man überhaupt noch irgendwas selbst, es gibt doch schon 
alles?

von Marius S. (lupin) Benutzerseite


Lesenswert?

Ja, aber bei manchen sachen kann man es besser machen als bereits 
vorhandene Lösungen. Bei Peter Danneggers code nicht. Ich hab mir den 
Code zwar noch nie angeschaut, aber so oft wie Peter seinen Code 
empfiehlt muss der echt gut sein.

von Draco (Gast)


Lesenswert?

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

von Pez G. (pgivy)


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

von Peter D. (peda)


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

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.