Forum: Compiler & IDEs DCF77 Interrupt Problem


von Marcel (Gast)


Lesenswert?

Hallo,

ich versuche gerade das DCF77 Signal auszulesen und zu verarbeiten.

Meine Idee ist es zwischen steigende und fallender Flanke zu 
unterscheiden um eine Impulsdauermessung hunzubekommen.
Also wenn eine steigende Flanke erkannt wird, soll die Zeit gestoppt 
werden und wenn sie fällt wird die Zeit wieder angehalten, und je nach 
Impulslänge kann man dann ja sagen ob es eine 0 oder eine 1 ist. bzw. ob 
die Minute vorbei ist und eine neue beginnt.

Also ich will quasi auf steigende Flanke abfragen, falls erkannt: im 
interrupt umstellen das fallende flanken erkannt werden und das selbe 
umgedreht.

Letztendlich soll für den Zeitraum in der eine steigende Flanke erkannt 
wurde bis eine fallende Flanke erkannt wurde eine LED (an PORTC) 
leuchten.


Mein Code dazu:
1
#include <avr/interrupt.h>
2
3
4
int main()
5
{
6
7
  DDRC = 0xFF;
8
9
  DDRD &= ~(1<<2);  //PD2 als Eingang DCF77 Signal
10
  PORTD|= (1<<2);   //Pullup aktivieren
11
12
13
  GICR = 1<<INT0;                       // Enable INT0
14
  MCUCR = (1<<ISC00) | (1<<ISC01);      // steigende flanke
15
16
  sei();
17
18
    while(1){}
19
}
20
21
ISR(INT0_vect)
22
{
23
  cli();
24
25
  if((MCUCR & (1<<ISC00)) && (MCUCR & (1<<ISC01)))  // steigende Flanke erkannt
26
  {
27
    MCUCR = (1<<ISC01);
28
    PORTC = 0x00;
29
  }
30
  if((MCUCR & ~(1<<ISC00)) && (MCUCR & (1<<ISC01)))  // fallende Flanke erkannt
31
  {
32
    MCUCR = (1<<ISC00) | (1<<ISC01);
33
    PORTC = 0xFF;
34
  }
35
  
36
37
  sei();
38
}


leider klappt das ganz so nicht, die LED leuchtet durchgängig.

Was mache ich falsch?


Gruß Marcel

von Stefan E. (sternst)


Lesenswert?

Marcel schrieb:
> Was mache ich falsch?

Ein "else" vergessen.

Nachtrag:
Und "(MCUCR & ~(1<<ISC00))" macht auch nicht das, was du möchtest.


Davon abgesehen: Schmeiße das cli() und sei() aus der ISR, das hat dort 
nichts zu suchen (die Hardware macht das für dich).

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.