Berechnung DCF77 Signal

Gast #1596322
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
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
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.