DCF-Empfänger keine Auswertung möglich

Gast #6216997
Lesenswert?

Hallo,

ich  versuche schon seit längerem einen DCF-Empfänger in Betrieb zu 
nehmen.
Komme aber leider absolut nicht weiter. Das Empfangen/Auswerten bereitet 
mir doch große schwieriegkeiten. Da ich auch kein Oszilloskop hier habe, 
kann ich mir das Signal auch nicht wirklich ansehen. Habe meine 
Funktionen jetzt mal vereinfacht
1
    while (1) 
2
    {
3
    if(true == secondOver)
4
    {
5
      itoa(lowPegelAnz, tempChar, 10);
6
      uart_sendString("low:"); uart_sendString(tempChar); uart_transmit(' ');
7
      itoa(highPegelAnz, tempChar, 10);
8
      uart_sendString("high:"); uart_sendString(tempChar); uart_transmit(' ');
9
      uart_sendString("\r\n"); 
10
      lowPegelAnz = 0;
11
      highPegelAnz = 0;  
12
      secondOver = false;    
13
    }
14
    }
1
ISR (TIMER1_COMPA_vect)
2
{
3
  static uint16_t timerInterruptTicks = 0;  // Anzahl der Aufrufe der ISR
4
  static uint8_t timerInterruptTime = 10;    // Alle 10 ms wird der Interrupt ausgelöst
5
  timerInterruptTicks++;
6
    
7
  if(!(PIND & (1<<PIND4))) /* low-Pegel an PD4 */
8
  {
9
    lowPegelAnz++;
10
  }
11
  else /*high-Pegel on PD4 */
12
  {
13
    highPegelAnz++;
14
  }
15
  if(timerInterruptTicks * timerInterruptTime >= 1000)
16
  {
17
    timerInterruptTicks = 0;
18
    secondOver = true;    
19
  }
20
}

Die ISR wird alle 10 ms gepollt und ich frage den Status vom Pin ab.
Die Anzahl vom lowPegelanz und highPegelanz lasse ich mir sekündlich 
über uart ausgeben.
erwarten würde ich sowas wie
low: 10 high: 90 (im Idealfall für eine 0) und
low: 20 high: 80 (im Idealfall für eine 1)

Habe es jetzt fast ne Stunde laufen lassen.
low verändert sich zwischen 72 und 93.
Zum einem würde ich die Pin-Abfrage tauschen (also low und high 
abfrage).
Aber welche Werte wären jetzt eine 1 und eine 0? Wie groß kann die 
Toleranz sein?
Angehängte Dateien:
Gast #6217062
Lesenswert?

Du brauchst ein zuverlässiges Signal. Exakt jede Sekunde (außer zu 
Beginn der Minute) muss ein Impuls empfangen werden. Das kannst du mit 
bloßem Auge (LED) und einer ticken Uhr am Ohr überprüfen.

Die Impulse sind im Idealfall 100 und 200ms lang. Der Unterschied ist so 
deutlich, dass man es mit bloßem Auge sehen kann. Was du das ermittelt 
hast, passt gar nicht.

Dein Programm sollte 6 Zeiten unterscheiden können:

a) <50ms = zu kurz -> abbrechen und auf Beginn der nächsten Minute 
warten
b) 50-150ms = Low
c) 150 - 250ms = High
d) 250 - 1500ms = zu Lang -> abbrechen und auf Beginn der nächsten 
Minute warten
e) 1500-2500ms = Nächste Minute / Empfang beginnt
f) > 2500ms = zu Lang -> abbrechen und auf Beginn der nächsten Minute 
warten

Schreibe Dir einen Zustandsautomaten, der am Ende jedes Impulses 
zwischen diesen 6 Fällen unterscheidet und weiter verzweigt.

Du müsstest imstande sein, das Protokoll manuell mit zu schreiben und zu 
decodieren. Die ersten 35 Sekunden reichen schon aus, um die Uhrzeit zu 
erhalten. Mach das mal. Wenn das nicht klappt, hast du schlechten 
Empfang.

Schlechter Empfang wird meistens durch gestörte Stromversorgung oder 
andere elektrische Geräte in der Nähe ausgelöst. Zur Gegenprobe kannst 
du den Empfänger mit Batterie betreiben und von allen anderen Geräten 
weit weg aufstellen.

Stelle erst einmal zuverlässigen Empfang her her, dann sehen wir weiter.
Gast #6217074
Lesenswert?

> Aber welche Werte wären jetzt eine 1 und eine 0? Wie
> groß kann die Toleranz sein?

Aus dem Datenblatt eines DCF-Moduls von Reichelt:

Impulsbreite log. "0"   40...130 ms
Impulsbreite log. "1"  140...230 ms
Gast #6217089
Lesenswert?

Stefan ⛄ F. schrieb:
> Dein Programm sollte 6 Zeiten unterscheiden können:

Ich habe das nochmal überarbeitet:

Dein Programm sollte 4 Impuls-Zeiten unterscheiden können:

a) <50ms = zu kurz
b) 50-150ms = Low
c) 150 - 250ms = High
d) 250 - 1500ms = zu Lang

Außerdem sollte es die Pausenzeit zwischen den Impulsen messen:

1) <700ms = zu kurz
2) 700-1000ms = Ok
3) 1001-1700ms = ungültig
4) 1701-2000ms = Neue Minute beginnt
5) >2000ms = zu lang

Danach wertest du diese beiden Infos kombiniert aus:

Zuerst wartest du auf b4, das kennzeichnet den Beginn einer Minute. Von 
da an wartest du auf 35 Bits (wenn du nur die Uhrzeit brauchst) oder 58 
Bits wenn du auch das Datum brauchst.

Jedes Bit muss entweder b2 oder c2 haben. Solltest du irgendeine andere 
Kombination empfangen, brichst du ab und wartest wieder auf die nächste 
Minute, also b4.
Gast #6217090
Lesenswert?

Bei meiner Nixieuhr habe ich die Pausenzeit erfasst. Als Toleranz habe 
ich (10ms Schritte) jeweils +- 2 bis 3 genutzt. Zur Visuellen 
Darstellung des Signals würd ich in der ISR noch einen Ausgang mit ner 
LED dran ansteuern - da siehst du kleine "Wackler".
Zus. Noch eine Fehler-LED, dann siehst du bei welcher Sekunde er 
rausfliegt.
Spiele mal mit Drehung und Position des Empfängers. Die Dinger sind sehr 
empfindlich, auch was die Versorgungsspannung angeht. Versorgung aus den 
selben 5 Volt wie der uC ohne Siebung kann schon problematisch sein.
#6217095
Lesenswert?

Johannes schrieb:
> Habe es jetzt fast ne Stunde laufen lassen.
> low verändert sich zwischen 72 und 93.

Wenn es ein Pollin-Modul ist und es sich so verhält wie meins, darf der 
Ausgang des Moduls nicht belastet werden. Auch nicht mit 100 kOhm. 
Scheinbar gibt es eine Rückwirkung auf die innere Schaltung und die 
Impulse verändern sich unkontrollierbar in der Länge. Ich habe folgende 
Anschaltung gebaut:
Beitrag "[Bascom/AVR] Uhr und DCF"

Damit läuft mein Modul. Der Pullup im Mikroconntroller ist 
eingeschaltet.
Gast #6217161
Lesenswert?

Stefan ⛄ F. schrieb:
> Was du das ermittelt
> hast, passt gar nicht.

Ist aber so aufgenommen.

Daher ja auch die Frage, woran man es erkennen kann. Wenn die Signale 
ideal kämen, würde ich die Auswertung schon machen. Aber damit brauche 
ich noch nicht anfangen, wenn das Signal noch nichtmals stimmt.

Ich wollte das Signal erstmal roh darstellen, indem ich zähle wie viele 
Ticks low und dann high waren. Aus denen kann ich mir dann ja die 
pulslänge bererchnen.

Alex D. schrieb:
> Wenn es ein Pollin-Modul ist und es sich so verhält wie meins, darf der
> Ausgang des Moduls nicht belastet werden. Auch nicht mit 100 kOhm.

Da habe ich nichts dran. Habe das Modul direkt mit dem Controller 
verbunden
Gast #6217186
Lesenswert?

>Ich wollte das Signal erstmal roh darstellen,

Ja meine Güte, dann mach das doch!
1
if (!(PIND & (1<<PIND4))) uart_sendString("0") else uart_sendString("1")

Lass das Ding z. B. drei Minuten laufen und logg das, was über den UART 
auf Deinen PC reinkommt, in eine Datei. Die wird am Schluss um die 20000 
Zeilen lang sein (6000 pro Minute), alle entweder "0" oder "1". Ersetze 
alle "1"-Zeilen durch "##############". Danach kannst Du das Signal wie 
auf einem Oszilloskop sehen. Nur die Zeitachse ist vertikal statt 
horizontal - daran muss man sich aber nicht stören.

(PS: Keine Angst wegen 20000 Zeilen: Die sind weder für Dich noch für 
Deinen PC noch für einen ordentlichen Editor wie Notepad++ ein Problem.)
#6217213
Lesenswert?

Johannes schrieb:
> Alex D. schrieb:
>> Wenn es ein Pollin-Modul ist und es sich so verhält wie meins, darf der
>> Ausgang des Moduls nicht belastet werden. Auch nicht mit 100 kOhm.
>
> Da habe ich nichts dran. Habe das Modul direkt mit dem Controller
> verbunden

Wohl die schlechteste aller Ideen.

Hier ist ein Interface: http://www.grother.de/dcf-modul-01.html und 
siehe Anhang

Er hier hatte ähnliche Probleme: 
Beitrag "DCF77-Modul - Timing stimmt nicht"

Erst den Empfang sicherstellen, dann mit dem uC rumspielen, besonders, 
wenn keine Messmittel zur Verfügung sind.
Wenn schit-in dann shit-out. Ist eben so... ^^
Angehängte Dateien:
Gast #6217243
Lesenswert?

Michael M. schrieb:
> Erst den Empfang sicherstellen, dann mit dem uC rumspielen, besonders,
> wenn keine Messmittel zur Verfügung sind.

naja, dazu brauche ich ja den uC um mir wenigstens etwas anzeigen lassen 
zu können.

Michael M. schrieb:
> Wenn schit-in dann shit-out. Ist eben so... ^^

Deswegen wollte ich auch noch nicht mit der Auswertung Anfangen, sondern 
erst sehen was wirklich rein kommt



Werde jetzt mal wie LostInMusic gesagt hat ausgeben und schauen, ob ich 
damit was anfangen kann
#6217263
Lesenswert?

Michael M. schrieb:
>> Alex D. schrieb:
>>> Wenn es ein Pollin-Modul ist und es sich so verhält wie meins, darf der
>>> Ausgang des Moduls nicht belastet werden. Auch nicht mit 100 kOhm.
>>
>> Da habe ich nichts dran. Habe das Modul direkt mit dem Controller
>> verbunden
>
> Wohl die schlechteste aller Ideen.

Sicher nicht, immer noch besser als den Ausgang mit fast 100 kOhm wie in 
der gezeigten Schaltung zu belasten.
#6217287
Lesenswert?

Alex D. schrieb:
>>> Da habe ich nichts dran. Habe das Modul direkt mit dem Controller
>>> verbunden
>>
>> Wohl die schlechteste aller Ideen.
>
> Sicher nicht, immer noch besser als den Ausgang mit fast 100 kOhm wie in
> der gezeigten Schaltung zu belasten.

Sorry, 100k sind doch keine "Last", Alex. mit dem Serien-R wird doch nur 
der Strom aus dem Ausgang begrenzt, der in die Basis eines als Interface 
geschalteten Transistors fließen kann.
Das sind im äußersten Fall dann ca. 25uA !!
Weißt du, welchen Eingangs-R der uC besitzt? Könnte der u.U. nicht noch 
viel geringer sein?
_______________

Johannes schrieb:
> naja, dazu brauche ich ja den uC um mir wenigstens etwas anzeigen lassen
> zu können.

Das (ordentlicher Empfang) siehst du dann schon an der munter blinkenden 
LED. Also ERST interface, dann uC.
#6217361
Lesenswert?

Michael M. schrieb:
> Sorry, 100k sind doch keine "Last", Alex. mit dem Serien-R wird doch nur
> der Strom aus dem Ausgang begrenzt, der in die Basis eines als Interface
> geschalteten Transistors fließen kann.
> Das sind im äußersten Fall dann ca. 25uA !!

Ebenfalls sorry Michael, ich habe nur die Erfahrungen mit meinen Modul 
beschrieben. Mein uraltes Modul war mit max. 5uA angegeben.

Michael M. schrieb:
> Weißt du, welchen Eingangs-R der uC besitzt? Könnte der u.U. nicht noch
> viel geringer sein?

Nein, weiss ich nicht, ich hatte auf CMOS getippt.
#6217903
Lesenswert?

Stefan ⛄ F. schrieb:
> Michael M. schrieb:
>> Sorry, 100k sind doch keine "Last",
>
> Doch, für das Pollin DCF Modul durchaus. Mit 50kΩ liefert es schon keine
> sauberen Logikpegel mehr.

Legt Pollin beim Kauf denn wenigstens 10 EU als Dank dabei, dafür dass 
man diesen Schrott bestellt hat?
Wahrscheinlich China-Sch....ß !
Zum Glück  bin ich nicht auf so'n Müll angewiesen.

Trotz allem sind die 100k in Serie erst mal besser als nix.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren