Forum: Mikrocontroller und Digitale Elektronik DCF-Empfänger keine Auswertung möglich


von Johannes (Gast)


Angehängte Dateien:

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?

von Johannes (Gast)


Lesenswert?

Johannes schrieb:
> low verändert sich zwischen 72 und 93.

habe sogar gesehen, dass low auch manchmal (öfters) 99 ist und high dann 
0. Aber diese sind nicht 60 logs dahinter. Das wäre dann ja eine neue 
Minute. Sondern überall zwischendurch

von Stefan F. (Gast)


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.

von S. Landolt (Gast)


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

von Stefan F. (Gast)


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.

von Patrick (Gast)


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.

von Alex D. (allu)


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.

von Johannes (Gast)


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

von W. Darsst (Gast)


Lesenswert?

@To

Bin gespannt, wie lange es dauert bis dir die willigen User die Würmer 
aus der Nase gezogen haben.

von LostInMusic (Gast)


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.)

von Alex D. (allu)


Lesenswert?

Johannes schrieb:
> Da habe ich nichts dran. Habe das Modul direkt mit dem Controller
> verbunden

Und der Pullup ist abgeschaltet? Wenn ja, dann passt alles.

von Michael M. (michaelm)


Angehängte Dateien:

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... ^^

von Johannes (Gast)


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

von Alex D. (allu)


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.

von Michael M. (michaelm)


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.

: Bearbeitet durch User
von Alex D. (allu)


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.

von Michael M. (michaelm)


Lesenswert?

Also doch besser Serien-R als garnüscht... :-)))

von Stefan F. (Gast)


Lesenswert?

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. Einem nachgeschalteten NPN Transistor ist das 
allerdings egal.

von Michael M. (michaelm)


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.

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.