Hallo zusammen,
ich hab ein Problem mit meinem DCF77 Code.
Die Auswertung klappt nicht so richtig.
Stimmt die Bestimmung der Pulsebreite?
Kann mir jemand einen Tipp geben.
Ich verwende einen ATmega16 mit 8 MHz.
...
1 | volatile uint16_t ZeitDiff = 0; // Wie breit ist das Bit, Zeit zwischen steigender und fallender Flanke
|
2 | volatile uint16_t rise=0; // Steigende Flanke!
|
3 | volatile uint16_t riseOLD=0; // Vorhergehende1 Steigende Flanken
|
4 | volatile uint16_t riseDIFF=0; // Abstand zwischen 2 Steigenden Flanken
|
5 | volatile uint16_t fall=0; // Fallende Flanke!
|
6 | .....
|
7 | ISR(TIMER1_CAPT_vect)
|
8 | {
|
9 | if(TCCR1B & (1<<ICES1))
|
10 | {
|
11 | rise = ICR1;
|
12 | ZeitDiff = 0;
|
13 | riseDIFF = rise - riseOLD;
|
14 | }
|
15 | else
|
16 | {
|
17 | fall = ICR1;
|
18 | ZeitDiff=fall - rise;
|
19 | riseOLD = rise;
|
20 | if(ZeitBit.M == 1)
|
21 | {
|
22 | ZeitBit.M = 0;
|
23 | ZeitBit.Nr = 0;
|
24 | }
|
25 | }
|
26 | /* Wechsele die Flanke */
|
27 | TCCR1B ^=(1<<ICES1);
|
28 |
|
29 | //Ist die Zeit >= 40 ms (0x04E2) und <= 130 ms (0x0FDF)
|
30 |
|
31 | if((ZeitDiff >= 0x04E2) && (ZeitDiff <= 0x0FDF))
|
32 | {
|
33 | if(ZeitBit.Nr >=58) // Bit 59 wird nicht gesendet!
|
34 | {
|
35 | ZeitBit.Nr=0;
|
36 | }
|
37 | else
|
38 | {
|
39 | ZeitBit.Nr++;
|
40 | }
|
41 | ZeitBit.Wert = 0;
|
42 | }
|
43 |
|
44 | //Ist die Zeit <= 230ms (0x1C14) und >= 140 ms (0x1117) => "1"
|
45 |
|
46 | else if((ZeitDiff >= 0x1117) && (ZeitDiff <= 0x1C14))
|
47 | {
|
48 | if(ZeitBit.Nr >=58) // Bit 59 wird nicht gesendet!
|
49 | {
|
50 | ZeitBit.Nr=0;
|
51 | }
|
52 | else
|
53 | {
|
54 | ZeitBit.Nr++;
|
55 | }
|
56 | ZeitBit.Wert = 1;
|
57 | }
|
58 |
|
59 | //Wurde eine Bit kleiner als 40 ms entdeckt?
|
60 |
|
61 | else if(ZeitDiff < 0x04E2)
|
62 | {
|
63 | /* Fehler beim Empfang*/
|
64 | }
|
65 |
|
66 | // Abstand zwischen 2 steigenden flanken zwischen 1990 und 2010 ms ?
|
67 |
|
68 | if((riseDIFF > 0xE7EF) && (riseDIFF <= 0xFFFF))
|
69 | {
|
70 | /* !Zeitmarke! */
|
71 | ZeitBit.M = 1;
|
72 | }
|
73 | }
|
74 |
|
75 | main()
|
76 | {
|
77 | .....
|
78 | TCCR1B &= ~((1<<CS11)|(1<<CS10)); // Prescaler auf 256 => 0b 100
|
79 | TCCR1B |= ((1<<ICNC1) | (1<<ICES1) | (1<<CS12));
|
80 | // Noise Canceler Ein / Input Capture Ein / Prescaler auf 256
|
81 |
|
82 | TIMSK |= (1<<TICIE1);
|
83 | TCNT1 = 0x0000; //Counterwert auf 0
|
84 | ...}
|
Grüße,
thomast