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!
Lass dir mal den rx_bit_counter auf dem lcd ausgeben. Der sollte sich pro Sekunde um 1 erhöhen.
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)
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
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
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.
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?
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?
>Ist die Software von Ulrich Radig schon für das >nicht-invertierte Signal programmiert worden? Hat schon mal jemand den Transistor weggelassen?
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.
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.
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.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.