Forum: Mikrocontroller und Digitale Elektronik Probleme mit Auswertung des DCF77-Signals


von Benjamin P. (bennip)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich versuche das DCF77-Signal mit einem Empfänger von Reichelt zu 
empfangen, mit dem Programm von Ulrich Radig zu dekodieren und mit Hilfe 
der Software von Peter Fleury auf ein LCD auszugeben. Das LCD 
funktioniert ohne Probleme, jedoch zählen nur die Sekunden langsam hoch. 
Das DCF-Signal empfange ich klar, die LED auf der DCF-Platine 
(Schaltplan im Anhang) blinkt im Sekundentakt. Das Signal ist durch den 
Transistor invertiert, also ist es insgesamt nichtinvertiert, da der 
Empfänger von Reichelt es invertiert ausgibt. Alle Programmteile sind 
ebenfalls im Anhang.
Vielen Dank schon mal für eure Hilfe!

von Oliver J. (skriptkiddy)


Lesenswert?

Lass dir mal den rx_bit_counter auf dem lcd ausgeben. Der sollte sich 
pro Sekunde um 1 erhöhen.

von Benjamin P. (bennip)


Lesenswert?

Danke für die schnelle Antwort. Wenn ich den rx_bit_counter auslese 
(anstatt der Sekunden) zählt er im Sekundentakt rauf (zuvor war das 
Raufzählen langsamer, ca alle 1,5 bis 2s), jedoch zählt er nicht nur bis 
60, sondern immer weiter nach oben. Heisst das das die Software das 
Signal nicht richtig verarbeitet? Das mit der Invertierung ist schon 
richtig oder? Am Pin INT0 liegen immer ca. 5V an, jede Sekunde fällt es 
dann auf ca. 0V ab (für 100/200ms)

von Uwe N. (ulegan)


Lesenswert?

Wo ist die Konstante SYSCLK definiert?
Entspricht die auch der wirklichen Taktfrequenz des Prozessors?
Sind die Fuses so gesetzt, dass der externe Quarz auch benutzt wird?
Was mich irritiert, ist die zu geringe Zählgeschwindigkeit.
Ohne Signal müsste nämlich genau einmal pro Sekunde hochgezählt werden.

Uwe

von Benjamin P. (bennip)


Lesenswert?

SYSCLK ist in uart.h definiert. Ich habe sie auf 4000000 geändert, also 
so wie auch die Frequenz in lcd.h ist. Muss diese Frequenz extern sein? 
Bei mir ist sie intern eingestellt, ich benutze das STK500. Nun zählt 
die Software im Sekundentakt nach oben, auch wenn der Empfänger gar 
nicht angeschlossen ist.
Hilfeeeee

von Karl H. (kbuchegg)


Lesenswert?

john dorian schrieb:
> SYSCLK ist in uart.h definiert. Ich habe sie auf 4000000 geändert, also
> so wie auch die Frequenz in lcd.h ist. Muss diese Frequenz extern sein?

Vor allen Dingen sollte der Wert mit der Freqeuenz übereinstimmen, mit 
der auch dein µC läuft. Dein µC schert sich einen feuchten Kehrricht 
darum, was in deiner uart.h steht. Der taktet so schnell oder so langsam 
wie er eingestellt ist.

> Nun zählt
> die Software im Sekundentakt nach oben, auch wenn der Empfänger gar
> nicht angeschlossen ist.
> Hilfeeeee

Ja, und?
Ist doch gut so. Ist keine Empfänger angeschlossen, dann läuft die Uhr. 
Ist ein Empfänger angeschlossen läuft die Uhr immer noch, stellt sich 
aber nach einiger Zeit von selbst auf die aktuelle Uhrzeit ein. Mehr 
kann man doch von einer DCF-77 gestützten Uhr nicht erwarten.

von Benjamin P. (bennip)


Lesenswert?

Ja schon...jedoch zählt er auch nur einfach rauf wenn das DCF-Signal 
angeschlossen ist. Ich verstehe es nicht, das kann doch eigentlich nicht 
so schwer sein? Ist die Software von Ulrich Radig schon für das 
nicht-invertierte Signal programmiert worden?

von Karl H. (kbuchegg)


Lesenswert?

john dorian schrieb:
> Ja schon...jedoch zählt er auch nur einfach rauf wenn das DCF-Signal
> angeschlossen ist. Ich verstehe es nicht, das kann doch eigentlich nicht
> so schwer sein? Ist die Software von Ulrich Radig schon für das
> nicht-invertierte Signal programmiert worden?

Hast du kontrolliert ob du vom DCF Empfänger überhaupt Impulse bekommst 
oder ob du einen gestörten Empfang hast?

Hast du kontrolliert ob dein Empfangscode eine Empfangsfehler meldet?

Es kann schon mal (in deinem Code) bis knapp an die 2 Minuten dauern, 
ehe du das erst vollständige gültige DCF-Paket empfangen hast. Hast du 
so lange gewartet?

von holger (Gast)


Lesenswert?

>Ist die Software von Ulrich Radig schon für das
>nicht-invertierte Signal programmiert worden?

Hat schon mal jemand den Transistor weggelassen?

von Benjamin P. (bennip)


Lesenswert?

john dorian schrieb:


> Das DCF-Signal empfange ich klar, die LED auf der DCF-Platine
> (Schaltplan im Anhang) blinkt im Sekundentakt. Das Signal ist durch den
> Transistor invertiert, also ist es insgesamt nichtinvertiert, da der
> Empfänger von Reichelt es invertiert ausgibt. Alle Programmteile sind
> ebenfalls im Anhang.
> Vielen Dank schon mal für eure Hilfe!

Wie gesagt Signal ist da. Am PIN INT0 (PD2) liegen also immer 5V an, die 
jede Sekunde einmal auf 0V gehen.

>Hast du kontrolliert ob dein Empfangscode eine Empfangsfehler meldet?

Wie geht das?

>Es kann schon mal (in deinem Code) bis knapp an die 2 Minuten dauern,
ehe du das erst vollständige gültige DCF-Paket empfangen hast. Hast du
so lange gewartet?

Läuft bereits seit geschlagenen 15 Minuten.

von Karl H. (kbuchegg)


Lesenswert?

john dorian schrieb:

>>Hast du kontrolliert ob dein Empfangscode eine Empfangsfehler meldet?
>
> Wie geht das?

Code lesen
Code studieren
Verstehen was da wie und warum programmiert wurde.

>
>>Es kann schon mal (in deinem Code) bis knapp an die 2 Minuten dauern,
> ehe du das erst vollständige gültige DCF-Paket empfangen hast. Hast du
> so lange gewartet?
>
> Läuft bereits seit geschlagenen 15 Minuten.

Das könnte darauf hindeuten, dass die Polarität verkehrt herum ist.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:
> john dorian schrieb:
>
>>>Hast du kontrolliert ob dein Empfangscode eine Empfangsfehler meldet?
>>
>> Wie geht das?
>
> Code lesen
> Code studieren
> Verstehen was da wie und warum programmiert wurde.

Wenn die Struktur des Empfangsinterrupts so ist
1
   if (INT0_CONTROL == INT0_RISING_EDGE)
2
   {
3
      mach was
4
5
      INT0_CONTROL = INT0_FALLING_EDGE;
6
   }
7
   else
8
   {
9
      // Auslesen der Pulsweite von ansteigender Flanke zu abfallender Flanke
10
      unsigned int pulse_wide = TCNT1;
11
12
      ....
13
14
      //Überprüfen ob eine 0 oder eine 1 empfangen wurde
15
      //0 = 100ms
16
      //1 = 200ms
17
      //Abfrage größer als 150ms (15% von 1Sekund also 150ms)   
18
      if (pulse_wide > (65535 - (SYSCLK / 1024)/100*85))
19
      {
20
          ...
21
      }
22
23
      INT0_CONTROL = INT0_RISING_EDGE;
24
   }

dann wird die Funktion wohl davon ausgehen, dass mit Sekundenbeginn eine 
steigende Flanke kommt und die Information in der Pulslänge bis zur 
fallenden Flanke steckt.
Mit anderen Worten Grundzustand ist 0, der Puls schaltet auf 1 und ist 
beendet, wenn das Signal wieder auf 0 zurückfällt.

Klingt genau nach dem Gegenteil von
> Wie gesagt Signal ist da. Am PIN INT0 (PD2) liegen also immer
> 5V an, die jede Sekunde einmal auf 0V gehen.


Code einfach übernehmen zu wollen ohne ihn wenigstens in den Grundzügen 
zu verstehen, geht nur dann gut, wenn man nix anpassen muss.

von Benjamin P. (bennip)


Lesenswert?

Das mit dem Verstehen ist ja das Problem. Blick bei dem Code nicht 
durch, Polarität habe ich auch schon getauscht. Bin noch ein ziemlicher 
Anfänger (wie man unschwer erkennen kann), brauche die DCF-Uhr für ein 
Projekt, das ich im kommenden Schuljahr machen muss. Kannst du mir nicht 
helfen?

von Karl H. (kbuchegg)


Lesenswert?

john dorian schrieb:
> Das mit dem Verstehen ist ja das Problem. Blick bei dem Code nicht
> durch, Polarität habe ich auch schon getauscht.

Wie hast du das gemacht?

> Bin noch ein ziemlicher
> Anfänger (wie man unschwer erkennen kann), brauche die DCF-Uhr für ein
> Projekt, das ich im kommenden Schuljahr machen muss. Kannst du mir nicht
> helfen?

Ich werden den Code nicht für dich schreiben. Du kriegst da eine Note 
drauf.

Aber: Ich habe nicht ohne Grund den Empfangsinterrupt in ein logisches 
Schema zerlegt. Man kann auch programmtechnisch die Polarität wechseln. 
Und das ist gar nicht so schwer. Warum wohl heisst es im einen Fall 
RAISING_EDGE und im anderen Fall FALLING_EDGE. Das kann man auch 
vertauschen, wenn sein eigenes Signal genau anders rum ist.

Und man kann zb in dem einen Zweig eine LED einschalten, die  man im 
anderen Zweig wieder ausschaltet und so nachsieht, ob die Interrupts 
überhaupt durchkommen.

Insbesonders letzters fällt unter die Devise: Lerne dir selbst zu helfen 
und im Code Hilfsmittel einzubauen, die dir eine Beurteilung der Lage 
erlauben.

von Benjamin P. (bennip)


Lesenswert?

Die Polarität habe ich hardwaretechnisch (mit anderer Beschaltung) 
getauscht.
Es geht nicht um die Note, ist nur so dass ich nächstes Jahr einen 
vollen Stundenplan habe und ich die Ferien nutzen wollte, mir das 
Programmieren von µCs selbst schon etwas beizubringen, um mein Projekt 
so weit wie möglich vorarbeiten zu können. Hat auf vielen anderen 
Gebieten schon gut funktioniert (Timer, AC, ADC...) aber hier komme ich 
einfach nicht weiter.


>Aber: Ich habe nicht ohne Grund den Empfangsinterrupt in ein logisches
>Schema zerlegt. Man kann auch programmtechnisch die Polarität wechseln.
>Und das ist gar nicht so schwer. Warum wohl heisst es im einen Fall
>RAISING_EDGE und im anderen Fall FALLING_EDGE.

Ja ich habe auch schon alles von FALLING_EDGE in RISING_EDGE und 
umgekehrt umgetauscht, das müsste dann die Software-Variante sein, die 
Polarität umzudrehen oder?

Habe gerade das erste mal die richtige Uhrzeit empfangen (erneut mit 
Software-Umpolung versucht), nach dem RESET hat er auch selbstständig 
nach ca. 2 Minuten das Signal wiedergefunden :). Ich weiss zwar leider 
echt nicht an was es gelegen hat, aber jetz funktioniert es. Danke an 
alle die geantwortet haben. Falls sich jemand die Mühe machen will mir 
den Code in seinen Grundzügen zu erklären bin ich ihm sehr dankbar

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.