www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Berechnung DCF77 Signal


Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hiho ich habe nun meine DCF Uhr am laufen, momentan berechne ich meine 
Zeit so:

volatile int dcf_Stunde;
....

....
void dcf_calc(void)
{    
     // Calc Stunde
     dcf_Stunde = 0;
     if(dcf_bitmask[29] == 1) dcf_Stunde = dcf_Stunde + 1;
     if(dcf_bitmask[30] == 1) dcf_Stunde = dcf_Stunde + 2;
     if(dcf_bitmask[31] == 1) dcf_Stunde = dcf_Stunde + 4;
     if(dcf_bitmask[32] == 1) dcf_Stunde = dcf_Stunde + 8;
     if(dcf_bitmask[33] == 1) dcf_Stunde = dcf_Stunde + 10;
     if(dcf_bitmask[34] == 1) dcf_Stunde = dcf_Stunde + 20;

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

     // Calc Datum Tag
     dcf_Tag = 0;
     if(dcf_bitmask[36] == 1) dcf_Tag = dcf_Tag + 1;
     if(dcf_bitmask[37] == 1) dcf_Tag = dcf_Tag + 2;
     if(dcf_bitmask[38] == 1) dcf_Tag = dcf_Tag + 4;
     if(dcf_bitmask[39] == 1) dcf_Tag = dcf_Tag + 8;
     if(dcf_bitmask[40] == 1) dcf_Tag = dcf_Tag + 10;
     if(dcf_bitmask[41] == 1) dcf_Tag = dcf_Tag + 20;

     // Calc Datum Monat
     dcf_Monat = 0;
     if(dcf_bitmask[45] == 1) dcf_Monat = dcf_Monat + 1;
     if(dcf_bitmask[46] == 1) dcf_Monat = dcf_Monat + 2;
     if(dcf_bitmask[47] == 1) dcf_Monat = dcf_Monat + 4;
     if(dcf_bitmask[48] == 1) dcf_Monat = dcf_Monat + 8;
     if(dcf_bitmask[49] == 1) dcf_Monat = dcf_Monat + 10;

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

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Marius S. (lupin) Benutzerseite
Datum:

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

Autor: wuff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum macht man überhaupt noch irgendwas selbst, es gibt doch schon 
alles?

Autor: Marius S. (lupin) Benutzerseite
Datum:

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

Autor: Draco (Gast)
Datum:

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

Autor: Pez G. (pgivy)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

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.