Forum: Mikrocontroller und Digitale Elektronik DCF-Empfang Probleme


von Peter (Gast)


Lesenswert?

Hallo,
ich hatte letztens schon einmal ein Beitrag geschrieben, wo ich probleme 
mit einem DCF77-Empfansmodul von Conrad hatte. Das Modul habe ich an 
einem Arduino (Also einem ATmega 328P) verbunden.
GND - GND
5V - 5V
DCF-Ausgang - PD2
Dort hatte ich die Signale über Interrupts auswerten wollen, was gar 
nicht funktioniert hat, da der Ausgang des Moduls keine ordentliche 
Signale von sich gegeben hat. Dort wurde mir empfohlen mit einem Timer 
den Pegel abzufragen. Das habe ich jetzt einmal umgesetzt, doch auch 
hierbei kommt es zu keiner auswertung
1
#include "defines.h"
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include "uart/uart.h"
5
#include "timer/timer.h"
6
#include <util/delay.h>
7
8
volatile uint8_t c = '\0';
9
volatile uint16_t dcfAnz = 0;
10
11
12
int main(void)
13
{
14
  DDRB |= (1<<PINB5);
15
  PORTB &= ~(1 << PINB5);
16
  
17
  // PORT D als Eingang fuer INT0
18
  DDRD &= ~(1<<DDD2);  // INT0 als Eingang
19
  DDRD |= (1<<DDD2);  // Interner Pull-up einschalten
20
  
21
  //EICRA = (1 << ISC00) | (1 << ISC01);   // steigende Flanke INT0
22
  //EIMSK = (1 << INT0);                    // IRQ an INT0 zulassen
23
  uart_init(MYUBRR);
24
  timer1_init();
25
  
26
  sei();
27
    while (1) 
28
    {
29
    if((dcfAnz >= 60) && (dcfAnz <= 140)) uart_sendString("0 ");
30
    else if((dcfAnz >= 150) && (dcfAnz <= 260)) uart_sendString("1 ");
31
    else if((dcfAnz >= 1700) && (dcfAnz <= 2200)) uart_sendString("SYNC \n\r");
32
    }
33
}
34
35
ISR (TIMER1_COMPA_vect)
36
{
37
  static uint16_t timer20Milliseconds = 0;
38
  static uint8_t timerInterruptTime = 20;
39
  static uint16_t dcfTime = 0;
40
  static uint8_t dcfFlag = 0;
41
  timer20Milliseconds++;
42
  
43
  if(timer20Milliseconds>=50)
44
  {
45
    //PORTB ^= (1<<PINB5);
46
    timer20Milliseconds = 0;
47
  }
48
  
49
  if(!(PIND & (1<<DDD2))) // LOW Pegel on INT0
50
  {
51
    PORTB &= ~(1<<PINB5);
52
    dcfTime++;
53
    dcfFlag = 1;
54
  }
55
  else
56
  {
57
    PORTB |= (1<<PINB5);
58
    if(dcfFlag == 1)
59
    {
60
      dcfAnz=dcfTime * timerInterruptTime;
61
      dcfTime = 0;
62
      dcfFlag = 0;
63
    }
64
    else
65
    {
66
      dcfAnz = 0;
67
    }
68
69
  }
70
}
71
72
//ISR(INT0_vect)
73
//{
74
//  // nothing to do
75
//}
76
77
ISR(USART_RX_vect)
78
{
79
  c = UDR0;
80
}

der Timer1 löst alle 20 Millisekunden aus. Dies funktioniert auch.
Im Timer überprüfe ich den Pegel vom DCF-Modul an PD2. Ist dieser Low, 
zähle ich den Zähler dcfTime hoch und setze das Flag dcfFlag. Ist der 
Pegel High, hat sich also der Zustand geändert. dcfAnz = dcfTime * 20ms 
(die ISR wird nur alle 20 ms aufgerufen). setze dcfTime wieder auf null 
und dcfFlag auch, damit beim nächsten aufruf nciht wieder dcfAnz gesetzt 
wird. In der whileschleife frage ich dann dcfAnz ab und möchte über uart 
eine 0, eine 1 oder ein SYNC und neue Zeile ausgeben (UART funktioniert 
auch).

Doch leider bekomme ich über UART gar keine Ausgabe und die LED bleibt 
aus.

Was für Module benutzt ihr? Vielleicht sollte ich es mit einem anderen 
Modul mal versuchen. Oder hat auch jemand das Modul von Conrad und 
bekommt es ausgewertet?

von Bauform B. (bauformb)


Lesenswert?

Peter schrieb:
> ich hatte letztens schon einmal ein Beitrag geschrieben,
vermutlich Beitrag "DCF-Empfänger löst kein Interrupt aus"

> wo ich probleme mit einem DCF77-Empfansmodul von Conrad hatte.
vermutlich das Modul mit der Bestellnr. 641138? Hat Conrad wirklich nur 
dieses eine?

> Was für Module benutzt ihr?
Genau dieses.
> Vielleicht sollte ich es mit einem anderen Modul mal versuchen.
Nein, außer, du nimmst einen richtigen Empfänger z.B. von Meinberg.
> Oder hat auch jemand das Modul von Conrad und
> bekommt es ausgewertet?
Wir haben über 200 von diesen Modulen im Einsatz. Auch nach meiner 
privaten Foren-Jammer-Beitrags-Statistik sind andere Module noch 
schlechter.

> Doch leider bekomme ich über UART gar keine Ausgabe und die LED bleibt
> aus.
Als erstes würde ich direkt am AVR-Pin messen. Wenn du keinen Oszi hast, 
geht zur Not auch ein Digitalvoltmeter. Dann würde ich die 
LED-Ansteuerung in main() machen, also so direkt wie möglich den Zustand 
vom Eingangs-Pin auf den LED-Pin kopieren.

von Stefan F. (Gast)


Lesenswert?

Schau Dir mal das Signal mit einem Oszilloskop oder Logic Analyzer an.

Ich hatte mal bei einem DCF Modul das Problem, dass die Flanken des 
Signals beim Wechsel von Low nach High (und zurück) geprellt haben. Mit 
bloßen Auge konnte ich das nicht sehen.

Dort konnte ich das Problem durch einen simplen Kondensator (zum 
Entprellen) beheben. Später habe ich das Entprellen dann in Software 
gemacht.

von Michael U. (amiga)


Lesenswert?

Hallo,

wenn meine zum Modul gefundenen Daten nstimmen hat es einen 
openCollektor-Ausgang, der maximal mit 1mA belastet werden darf.
Eine aktuelle LED mit 10k Vorwiderstand gegen 5V sollte also noch 
erkennbar leuchten bzw. blinken.
Dann erstmal eine Stelle suchen, wo die LED halbwegs stabil im 
Sekundentakt der Daten aufblinkt. Dann weiß man wenigstens erstmal, ob 
man Empfang hat...
Hier bei mir (Berlin. Altbau, 1.Stock) gibt es höchstens noch 2-3 
Stellen in der Wohnung, wo zu üblichen Zeiten mit den üblichen in 
Betrieb befindlichen Geräten noch halbwegs brauchbarer Empfang möglich 
ist.

Gruß aus Berlin
Michael

von LostInMusic (Gast)


Lesenswert?

Ich würde mal damit anfangen:
1
ISR (TIMER1_COMPA_vect)
2
{
3
  if(!(PIND & (1<<DDD2))) // LOW Pegel on INT0
4
  {
5
    uartSendString("0")
6
  }
7
  else
8
  {
9
    uartSendString("1")
10
  }
11
}

(Port + Timer + UART konfigurieren, "sei()", Main leer. Sonst nichts.)

20 Sekunden laufen lassen bringt eine Folge von 1000 Nullen und Einsen 
auf Deinen PC (bei Timertakt 20 ms). Dazu stellt sich Dir nur eine 
einzige Frage: Kannst Du in dieser Folge das DCF-Signal sauber erkennen? 
Solange das nicht sichergestellt ist, brauchst Du über irgendetwas 
anderes nicht nachzudenken.

von Stefan F. (Gast)


Lesenswert?

Guter Vorschlag, das würde dem selben Zweck dienen, wie mein Vorschlag 
mit dem Logic Analyzer, den ich gerade anbringen wollte.

von Georg G. (df2au)


Angehängte Dateien:

Lesenswert?

Eine Alternative wäre, mit einer erprobten Software zu testen. Dann kann 
man immer noch eigene Verbesserungen einfliessen lassen.
Ich hänge mal eine Jugendsünde hier dran.

von 900ss (900ss)


Lesenswert?

Benutze mal einen externen Pullup, 10kOhm für den Signaleingang. Oder 
messe mit dem Oszilloskop ob es gut aussieht.

Versorge nur das DCF-Modul aus einer Batterie. Die Module mögen 
Störungen garnicht. Sie hören da Flöte husten.

von LostInMusic (Gast)


Lesenswert?

>Sie hören da Flöte husten.

Du meintest wohl Flöße?

von S. Landolt (Gast)


Lesenswert?

>   DDRD |= (1<<DDD2);  // Interner Pull-up einschalten

?

von S. Landolt (Gast)


Lesenswert?

"sie hat ein' Floh - sie hat ein flórén-tí-nér-Hút: daradattá, daradattá 
..."

von Christian S. (roehrenvorheizer)


Lesenswert?

Vielleicht ist die Empfangsfrequenz verstimmt und es kommen deshalb nur 
ungünstige Signale heraus?

MfG

von S. Landolt (Gast)


Lesenswert?

> ungünstige Signale

Freilich, "ungünstige Signale": bei einem Eingang, der auf Ausgang 
geschaltet ist.

von Peter (Gast)


Lesenswert?

S. Landolt schrieb:
>>   DDRD |= (1<<DDD2);  // Interner Pull-up einschalten
>
> ?

Na hoppla.
Das ist natürlich nicht so gewollt.

Habe ich verbessert. Jetzt bekomme ich auch Signale. Damit kann ich erst 
einmal weitermachen.

von Manfred (Gast)


Lesenswert?

Ich bin immer wieder verwundert, dass kaum jemand eine einigermaßen 
logisch strukturierte Fehlersuche auf die Reihe bringt :-(

900ss D. schrieb:
> Oder messe mit dem Oszilloskop ob es gut aussieht.

Meine Eigenbau-Uhr hat eine akustsiche Anzeige, natürlich schaltbar: 
Einen Kleinlautsprecher mit Multivibrator dran bei etwa 2kHz. Gepiept 
wird, solange DCF-low ist.

Falls ich mein Pollin-Modul jemals in Betrieb nehmen werde, wird auch da 
zu allererst eine akustische Anzeige in Hardware dran kommen, das kann 
ich mit z.B. einem CD4093 und einem RC_Glied.

Akustisch kann ich kurze Störungen deutlich besser vernehmen als am 
Scope sehen. Wer als Bastler kein Scope hat, ist damit auch ganz vorne.

von Stefan F. (Gast)


Lesenswert?

Manfred schrieb:
> Ich bin immer wieder verwundert, dass kaum jemand eine einigermaßen
> logisch strukturierte Fehlersuche auf die Reihe bringt :-(

Das liegt an deiner Filterblase.

Leute, die das können, stellen hier nicht solche Fragen.

von Jacko (Gast)


Lesenswert?

Leute, die nicht alles wissen, könnten aber auch erst mal die HW testen:
U+, U- und Transistor-Puffer mit Anzeige-LED.

Wenn das nicht gleich geht, kann man fragen, bevor die ganze schöne
µC-Schaltung nicht das tut, was sie soll...

Besonders bei DCF-Modulen stellt sich dann schnell heraus, dass das
ganze Miesmachen der Produkte von CON..., POL... und REI... überflüssig
ist.
Bei mir zu Hause, in 500 km Entfernung habe ich die alle über einen
µC-Eingang mit PullUp zum Laufen bekommen: Man muss sie nur (mit wenig 
Aufwand) sachgemäß aufstellen, anschließen und auswerten, um gute
Ergebnisse zu bekommen.
Und natürlich auch mit HW-Interrupt!!!

von Wolle (Gast)


Lesenswert?

Jacko schrieb:
> Produkte von CON..., POL... und REI...

Du scheinst die Namen nicht zu wissen.
Sie lauten: Conrad, Pollin und Reichelt.
Nur damit du beim nächsten Mal nicht krampfhaft nach Abkürzungen suchen 
mußt, okay? :-)

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.