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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.