Forum: Compiler & IDEs DCF77 Empfang in C


von bernd (Gast)


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
  }

von Karl H. (kbuchegg)


Lesenswert?

Lass dir doch einfach mal die Einzelbits ausgeben und sieh sie dir an, 
was sich in der nächsten Minute verändert.

von Joachim (Gast)


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

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.