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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren