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 | }
|