DCF77 Empfang in C

Gast #2025968
Lesenswert?
• ▲
▼
Moin,

ich versuche mit folgendem Programm das DCF77 Signal meines
Conrad Empfängers auszuwerten. Der Code wird mit einem 100 HZ
Interrupt aufgerufen. Dummerweise funktioniert er nicht, er
erzeugt immer falsche Werte die mit der aktuellen Uhrzeit genau
nichts zutun haben. Ob das Bit 0,1 oder Sync ist erkennt der Code
richtig. So langsam gehen mir die Ideen aus, ich hoffe ihr könnt
mir helfen.
1
  static unsigned char counter,counter_threshold,reset_counter,lastreset_counter,level_threshold,sync_threshold,bit_counter,synced;
2
  static unsigned char minute_temp, hour_temp,bit,parity_counter;
3
  counter_threshold=14;
4
  level_threshold=20;
5
  sync_threshold=210;
6
    
7
  if (bit_is_clear(dcf77d_pin,dcf77d_bit) && counter>0) counter--;
8
  if (bit_is_set(dcf77d_pin,dcf77d_bit)) counter++;
9
  
10
  if (counter>=counter_threshold) {
11
    counter=0;
12
    reset_counter++;
13
    lastreset_counter=0;
14
  } else {
15
    lastreset_counter++;
16
  }
17
    
18
  if (lastreset_counter==level_threshold) {   
19
    if (reset_counter==1){
20
      bit=0;
21
    } else if (reset_counter==2) {
22
      bit=1;
23
    }
24
    reset_counter=0;
25
    parity_counter+=bit;
26
  }
27
  if (lastreset_counter>=sync_threshold) {
28
    synced=1;
29
    bit_counter=0;
30
    
31
    lastreset_counter = 0;
32
  }
33
  if (synced==1) {
34
    if (bit_counter==21) { 
35
      parity_counter=bit;
36
      minute_temp=bit;
37
    }
38
    if (bit_counter==22) minute_temp+=bit*2;
39
    if (bit_counter==23) minute_temp+=bit*4;
40
    if (bit_counter==24) minute_temp+=bit*8;
41
    if (bit_counter==25) minute_temp+=bit*10;
42
    if (bit_counter==26) minute_temp+=bit*20;
43
    if (bit_counter==27) minute_temp+=bit*40;
44
    if (bit_counter==28) {
45
      if (parity_counter %2!=0 && bit==1) minute=minute_temp;
46
    }
47
    if (bit_counter==29) { 
48
      parity_counter=bit;
49
      hour_temp=bit;
50
    }
51
    if (bit_counter==30) hour_temp+=bit*2;
52
    if (bit_counter==31) hour_temp+=bit*4;
53
    if (bit_counter==32) hour_temp+=bit*8;
54
    if (bit_counter==33) hour_temp+=bit*10;
55
    if (bit_counter==34) hour_temp+=bit*20;
56
    if (bit_counter==35) {
57
      if (parity_counter %2!=0 && bit==1)  hour=hour_temp;
58
    }
59
    if (bit_counter==58) {
60
      synced=0;
61
    }
62
    bit_counter++;
63
  }
Gast #2027480
Lesenswert?
• ▲
▼
Hallo Bernd,

Du hälst dich genau an diesen berühmten Ausspruch:
Real Programmers Don't Document - If it was hard to write, it should be 
hard to understand.

Kann es sein, dass der bitcounterstand gegenüber der tatsächlichen 
Sekunde um eine Stelle voraus ist?

Gruß
Joachim

Antwort schreiben

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.

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.