Forum: Mikrocontroller und Digitale Elektronik DCF77 Auswertung


von Thomas T. (thomast)


Lesenswert?

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

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.