DCF 77 auf PIC18F8722

Gast #1714941
Lesenswert?

Hallo,
ich versuch schon seit mehrer Tagen das DCF 77 Signal auszuwerten.

mein Problem in folgendem Code ist, dass er bei einem highpegel 
nichtmehr den Interrupt verlässt, zu sehen an einer LED (LATDbits.LATD6 
= 1;).
Die if abfrage im main frägt ab, ob der Highpegel zwischen 80 und 120 
ms, oder zwischen 180 oder 220 ms lag, um somit zwischen einem high 
signal oder einem low signal zu unterscheiden.
Leider wird dieser zustand nie erreicht.

Ansich soll das Programm bisher nur unterscheiden zwischen einem 
highsignal oder einem Low Signal des DCF's.

programmiert hab ich das ganze auf einem development Tool von microchip.
http://ww1.microchip.com/downloads/en/DeviceDoc/51721b.pdf
1
/*********************************************************************
2
Projekt: 10016
3
Projekt von Simon Arndt
4
Projekt DCF77 Auswerten
5
*********************************************************************/
6

7

8
//********************************************************************
9
//*                       INCLUDES                                   *
10
//********************************************************************
11
#include<p18cxxx.h>
12

13

14
//********************************************************************
15
//*                  GLOBALE VARIABLEN                               *
16
//********************************************************************
17
char TMR0_high=0;
18
char TMR0_low=0;
19
unsigned int  TMR0_erg=0;
20

21

22
//********************************************************************
23
//*                  PORTB INITIALISIERUNG                           *
24
//********************************************************************
25

26
void PORTB_init(void)
27
{
28
  TRISB = 16;    //PORT-B-4 als Eingang Konfigurieren
29
  //INTCON2bits.RBPU = 0;
30
  LATB = 0;
31
}  
32

33
//********************************************************************
34
//*                  PORTD INITIALISIERUNG                           *
35
//********************************************************************
36

37
void PORTD_init(void)
38
{
39
  TRISD = 0;    //PORT D als Ausgang Konfigurieren
40
  LATD = 0;    //Gesamten PORTD auf 0 (LED aus)  
41
}
42

43
//********************************************************************
44
//*                    TIMER-0 INITIALISIERUNG                       *
45
//********************************************************************
46

47
void TMR0_init(void)
48
{
49
  T0CON = 0x87;
50
  TMR0H = 0x00;
51
  TMR0L = 0x00;
52
  
53
  T0CON = 0x97;
54

55
  
56
}
57

58
//********************************************************************
59
//*                    TIMER-0 REGISTER SETZEN                       *
60
//********************************************************************
61

62
void TMR0_set(void)
63
{
64
  TMR0H = 0x1B;  
65
  TMR0L = 0x1D;    
66
}
67

68
//********************************************************************
69
//*                   INTERRUPT   INITIALISIERUNG                    *
70
//********************************************************************
71

72
void Interrupt_init(void)
73
{
74
  INTCON = 0;
75
  INTCONbits.GIE = 1;
76
  INTCONbits.RBIE = 1;
77
}
78

79
//********************************************************************
80
//*                 INTERRUPT SERVICE ROUTINE                        *
81
//********************************************************************
82

83
#pragma /*interruptlow*/interrupthigh InterruptHandler
84
void InterruptHandler (void)
85
{
86
  INTCONbits.GIEH = 0;
87

88
  if (INTCONbits.RBIF == 1)
89
  {
90
    INTCONbits.RBIF = 0;  
91

92
     LATDbits.LATD6 = 1;
93
    
94
    T0CON = 0x87;
95

96
    TMR0_low  = TMR0L;
97
    TMR0_high = TMR0H;
98

99
    TMR0_set();      
100

101
    T0CON = 0x97;
102
  }  
103
  
104
  INTCONbits.GIEH = 1;
105

106
}
107

108
#pragma code _HIGH_INTERRUPT_VECTOR = 0x000008
109
void _high_ISR (void)
110
{
111
  _asm
112
    goto InterruptHandler       // Sprung zur Interruptroutine
113
  _endasm
114
}
115

116
#pragma code _LOW_INTERRUPT_VECTOR = 0x000018
117
void _low_ISR (void)
118
{
119
  _asm
120
    goto InterruptHandler       // Sprung zur Interruptroutine
121
  _endasm
122
}
123

124
//********************************************************************
125
//*                       MAIN                                       *
126
//********************************************************************
127

128
void main (void)
129
{
130
  PORTB_init();
131
  PORTD_init();
132
  TMR0_init();
133
  Interrupt_init();
134

135
  while(1)
136
  {
137
    LATDbits.LATD6 = 0;
138
    TMR0_erg = 0x00;
139

140
    INTCONbits.GIEH = 0;
141
    TMR0_erg = TMR0_high;
142
    TMR0_erg = (TMR0_erg<<8) | TMR0_low;
143
    INTCONbits.GIEH = 1;
144

145
    if(TMR0_erg >= 10066 && TMR0_erg <= 11629)
146
    {
147
      LATDbits.LATD0 = 1;
148
      LATDbits.LATD1 = 0;
149
    }
150

151
    else if(TMR0_erg >= 13972 && TMR0_erg <= 15535)
152
    {
153
      LATDbits.LATD1 = 1;
154
      LATDbits.LATD0 = 0;
155
    }
156

157
    else if(INTCONbits.TMR0IF == 1)
158
    {
159
      LATDbits.LATD7 = 1;
160
      INTCONbits.TMR0IF = 0;
161
    }
162

163
    else
164
    {
165
    //  LATD = 0;
166
    } 
167
  }
168

169
}

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