Forum: Mikrocontroller und Digitale Elektronik Probleme um das DCF77-Signal zu lesen


von Luca B. (lucabert)


Lesenswert?

Hallo, Leute!

Nachdem ich mit dem Display klar gekommen bin, habe ich das nächste 
Problem auf dem Tisch, und zwar: die Zeit von einem DCF77-Modul 
(Reichelt) zu lesen.

Ich habe die PIN "Signal" an PB1 und VDD an PB0 eines ATMega32 
verbunden.

Nun schalte ich das Ding ein:
1
#define DCF77_SIGNAL_PORT     PORTB
2
#define DCF77_SIGNAL_DDR      DDRB
3
#define DCF77_SIGNAL_PIN      PINB
4
#define DCF77_SIGNAL          1
5
6
#define DCF77_UB_PORT         PORTB
7
#define DCF77_UB_DDR          DDRB
8
#define DCF77_UB_PIN          PINB
9
#define DCF77_UB              0
10
11
  DCF77_UB_DDR |= _BV(DCF77_UB);
12
  DCF77_SIGNAL_DDR &= ~_BV(DCF77_SIGNAL);
13
  DCF77_UB_PORT |= _BV(DCF77_UB);

Und in einer Schleife werde ich die Daten lesen...
Laut Doku wenn ein Signal 100ms lang ist, ist eine 0, wenn 200ms lang 
ist, eine 1.
Hier meine Schleife:
1
  while(1)
2
  {
3
    lcdGotoXY(2, 2);
4
    if (PORTB & (1<<PB1))
5
    {
6
      PORTB = ~(1<<PB1) & ~(1<<PB0);
7
      len = getUptime() - start;
8
      if(len > 100)
9
        c = '1';
10
      else
11
        c = '0';
12
    }
13
    else
14
    {
15
      PORTB = (1<<PB1) | (1<<PB0);
16
      start = getUptime();
17
    }
18
    sprintf(str, "%ld - %c - %ld", (getUptime() / 1000), c, len);
19
    lcdPuts(str);
20
  }

Leider ist c immer 0... len ist gerade 97 (immer! Es ändert sich NICHT).

Was mache ich denn jetzt falsches?

Danke euch!
Luca Bertoncello

von Ich (Gast)


Lesenswert?

Versuch mal das DCF-Signal ungeändert auf einer LED auszugeben. Du 
müsstest lange und kurze Impulse sehen. Schreib eine Minute mit und 
berechne die Zeit daraus.

von Luca B. (lucabert)


Lesenswert?

Ich schrieb:
> Versuch mal das DCF-Signal ungeändert auf einer LED auszugeben. Du
> müsstest lange und kurze Impulse sehen. Schreib eine Minute mit und
> berechne die Zeit daraus.

Ich habe kein LED...

Ich habe schon probiert die Hintergrundbeleuchtung des Displays an- und 
auszuschalten, aber flackert SO schnell, daß man nur beim sehr 
aufmerksam gucken verstehen kann, daß es doch flackert...

Das war mein Code:
1
  while(1)
2
  {
3
    lcdGotoXY(2, 2);
4
    if (PORTB & (1<<PB1))
5
    {
6
      PORTB = ~(1<<PB1) & ~(1<<PB0);
7
      lcdBacklightOff();
8
    }
9
    else
10
    {
11
      PORTB = (1<<PB1) | (1<<PB0);
12
      lcdBacklightOn();
13
    }
14
  }

Ideen?

Grüße
Luca Bertoncello

von Ich (Gast)


Lesenswert?

ge du wirst doch wohl ne led haben.

von Luca B. (lucabert)


Lesenswert?

Ich schrieb:
> Versuch mal das DCF-Signal ungeändert auf einer LED auszugeben. Du
> müsstest lange und kurze Impulse sehen. Schreib eine Minute mit und
> berechne die Zeit daraus.

Korrektur: jetzt blinkt, aber immer sind die Impulse gleich lang...

Kaputtes Ding oder was?

Grüße
Luca Bertoncello

von Ich (Gast)


Lesenswert?

Irgendeine 5mm 20mA 2V rote LED (mit Vorwiderstand natürlich).
Es sollte genau einmal pro Sekunde blinken,
entweder 100ms (Binäre 0) oder 200ms (Binäre 1).
Den Unterschied sieht man (kurz oder lang).

von Ich (Gast)


Lesenswert?

Einmal pro Minute (Sekunde 59, mit gekaufter Funkuhr vergleichen) sollte 
es nicht blinken.

von Luca B. (lucabert)


Lesenswert?

Ich schrieb:
> Irgendeine 5mm 20mA 2V rote LED (mit Vorwiderstand natürlich).
> Es sollte genau einmal pro Sekunde blinken,
> entweder 100ms (Binäre 0) oder 200ms (Binäre 1).
> Den Unterschied sieht man (kurz oder lang).

Na gut, die Hintergrundbeleuchtung des Displays ist nix anderes als ein 
LED.

Aber eine Sache (sehr komisch!) was ich gerade gesehen habe...

Wenn ich den DCF77 AUSSchalte, geht alles weiter wie vorher... Ist es 
normal?

Ich denke, das Ding kriegt sein Strom über ein PIN des ATMegas, aber 
sieht nicht so aus...

Einschalten tue ich mit:
1
DCF77_UB_PORT |= _BV(DCF77_UB);

Ausschalten mit:
1
DCF77_UB_PORT |= _BV(DCF77_UB);

In beide Fälle passiert das gleiche (LED flackert immer gleich lang). 
Warum denn?

Danke
Luca Bertoncello

von Ich (Gast)


Lesenswert?

Lass das Ganze mal 10 Minuten laufen, vielleicht empfängt es dann erst 
das Signal. Das mit dem Ausschalten kann ich nicht erklären, schalt VCC 
über einen Schalter und nicht über den AVR.

von Andreas K. (derandi)


Lesenswert?

Wie ist denn das Modul von Reichelt angeschlossen? Wenn ich mich recht 
entsinne konnten die nur 5 µA am Ausgang treiben...

Ausserdem reagieren DCF-77-Empfänger, egal welcher Lieferant, 
empfindlich auf Störquellen, kann also sein das du einfach keinen 
Empfang hast. Nachts ist besserer Empfang als Tagsüber.

von Luca B. (lucabert)


Lesenswert?

Andreas K. schrieb:
> Wie ist denn das Modul von Reichelt angeschlossen? Wenn ich mich recht
> entsinne konnten die nur 5 µA am Ausgang treiben...

PIN Signal an PB1, PIN UB an PB0 (mit einem Widerstand 1K), die andere 
zwei an GND.
Ein Kerko 100n zwischen GND und UB.

Was ich noch nicht verstanden habe ist: was ist UB?!? Ist es ein 
Eingang? Oder Ausgang? Bekomme ich Daten von dort? Oder muß ich was 
geben?

> Ausserdem reagieren DCF-77-Empfänger, egal welcher Lieferant,
> empfindlich auf Störquellen, kann also sein das du einfach keinen
> Empfang hast. Nachts ist besserer Empfang als Tagsüber.

Naja, 1 und 0 empfange ich jetzt, aber die lange Pause nach dem 59. 
Sekunde immer nicht...

Ideen?
Wie kann ich prüfen, ob das Problem bei meinem Programm ist, und nicht 
bei dem Modul?

Danke
Luca Bertoncello

von Rainer Unsinn (Gast)


Lesenswert?

Bei dem Modul von Reichelt oder Pollin gibt es häufiger 
Empfangsprobleme. Suche am besten mal hier im Forum. Die besten 
Ergebnisse habe ich selbst mit dem Modul von Conrad gemacht. Allerdings 
ist auch das empfindlich gegenüber einer unsauberen Versorgungsspannung. 
Also ordentlich filtern.

von Ich (Gast)


Lesenswert?

Also wenn du kurze und lange Impulse siehst, dann muss es auch eine 
Pause in der 59. Sekunde geben. Es ist keine lange Pause, es fehlt eben 
nur ein Impuls. Versuch mal die Impulse aufzuschreiben (ja ich weiß, das 
ist schwierig, am besten mit 2 Personen -> einer schaut, einer schreibt) 
und dann herauszufinden, ob du daraus Datum und Uhrzeit lesen kannst.

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.