Forum: Mikrocontroller und Digitale Elektronik DCF 77 auf PIC18F8722


von Lego (Gast)


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
}

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.