Ein kleines Beispiel einer DCF77 Uhr mit einer 7Segment-LED-Anzeige. Nach dem Einschalten und bei guten Empfangsbedingungen steht die exakte Uhrzeit nach ca. 2 Minuten bereit. Frühstmöglich nach 63 Sekunden bei diesem Programm-Code, da das Minutenende (2 Sekunden Pause) 2 mal erkannt werden muss. Theoretisch wären 40 Sekunden möglich. Bei Wegfall des DCF-Signals läuft die Uhr weiter, allerdeings nur mit Quarz-Genauigkeit. Nachdem das DCF-77 Protokoll erfolgreich empfangen wurde, wird der interne Timer auf das DCF-Signal synchronisiert. Das empfangene DCF-Protokoll wird an mehreren Punkten auf Plausibilität geprüft (z.B. Parität). Ein PIN stellt zusätzlich einen Sekundentakt zur Verfügung. Die Genauigkeit, bzw. die Phasenlage dieses Sekunden-Taktes ist von der Qualität des DCF-Empfängers abhängig, denn es muss ein 77,5kHz Pegelabfall des Senders vom Empfänger registriert werden. Ich habe versucht den Assembler-Programm-Code so gut wie möglich zu kommentieren. Bernhard
Von welchem Hersteller ist das DCF77-Modul, das Du verwendest? Nicht das von Reichelt, oder?
@ Jacek Jacek G. schrieb: > Von welchem Hersteller ist das DCF77-Modul, das Du verwendest? > Nicht das von Reichelt, oder? Die DCF-Empfängerplatine habe ich bei Conrad gekauft, bin ganz zufrieden damit. Bernhard
Bei der gelben Kurve (DCF Eingangssignal) ist der fehlende 59 Sekunden Impuls zu sehen (Ende einer jeden Minute). Die blaue Kurve zeigt den Sekundentakt der Uhr (Pin PC3), er ist mit dem DCF-Impuls syncronisiert. Bernhard
@ Bernhard S. (bernhard) >Dateianhang: IMG_6165.JPG (182,7 KB, 15 Downloads) Uhhhhhhh, das mit den Screenshot hast du wohl etwas zu wörtlich genommen. Da hat er nun schon ein schönes DSO mit FARB-TFT und was macht der Mensch? Ein verwackeltes Bild mit der Handycam :-( Kleiner Tip: Bildformate Kleiner Tip #2: RTFM (vom DSO). MFG Falk
Hallo Bernhard! Mir hat schon immer der recht hohe Schreibaufwand in deinen Programmen gefallen, die Lesbarkeit ist jedenfalls top. Weiter so Bernhard. Aber bitte lieber Bernhard beschäftige dich mit Zeigern. LDS / STS verbrauchen 2 Worte(4Byte) Programmspeicher! Die indirekten Speicherzugriffe wie LD / LDD nur 1 Wort. Bei dem nachstehenden Programmteil zähle ich 23 LDS, das sind 46 Byte verschenkter Speicher bzw. 44 Byte wenn der Zeiger erst in der Sub initialisiert wird. Das mag für das Beispiel, vom Platz her, ok sein, aber ein guter Programierstiel ist das nicht. <DCF_ZEIT_58: < ; Parität berechnen < clr temp2 < ; TAG < LDS temp,(adr_DCF_BEREICH+36) ; aus SRAM laden < add temp2,temp < ; addieren < LDS temp,(adr_DCF_BEREICH+37) ; aus SRAM laden < add temp2,temp < ; addieren < LDS temp,(adr_DCF_BEREICH+38) ; aus SRAM laden < add temp2,temp < ; addieren < LDS temp,(adr_DCF_BEREICH+39) ; aus SRAM laden < add temp2,temp < ; addieren < LDS temp,(adr_DCF_BEREICH+40) ; aus SRAM laden < add temp2,temp < ; addieren < LDS temp,(adr_DCF_BEREICH+41) ; aus SRAM laden < add temp2,temp < ; addieren < ; WOCHENTAG < LDS temp,(adr_DCF_BEREICH+42) ; aus SRAM laden < add temp2,temp < ; addieren < LDS temp,(adr_DCF_BEREICH+43) ; aus SRAM laden < add temp2,temp < ; addieren < LDS temp,(adr_DCF_BEREICH+44) ; aus SRAM laden < add temp2,temp < ; addieren < ; MONAT < LDS temp,(adr_DCF_BEREICH+45) ; aus SRAM laden < add temp2,temp < ; addieren < LDS temp,(adr_DCF_BEREICH+46) ; aus SRAM laden < add temp2,temp < ; addieren < LDS temp,(adr_DCF_BEREICH+47) ; aus SRAM laden < add temp2,temp < ; addieren < LDS temp,(adr_DCF_BEREICH+48) ; aus SRAM laden < add temp2,temp < ; addieren < LDS temp,(adr_DCF_BEREICH+49) ; aus SRAM laden < add temp2,temp < ; addieren < ; JAHR < LDS temp,(adr_DCF_BEREICH+50) ; aus SRAM laden < add temp2,temp < LDS temp,(adr_DCF_BEREICH+51) ; aus SRAM laden < add temp2,temp < LDS temp,(adr_DCF_BEREICH+52) ; aus SRAM laden < add temp2,temp < LDS temp,(adr_DCF_BEREICH+53) ; aus SRAM laden < add temp2,temp < LDS temp,(adr_DCF_BEREICH+54) ; aus SRAM laden < add temp2,temp < LDS temp,(adr_DCF_BEREICH+55) ; aus SRAM laden < add temp2,temp < LDS temp,(adr_DCF_BEREICH+56) ; aus SRAM laden < add temp2,temp < LDS temp,(adr_DCF_BEREICH+57) ; aus SRAM laden < add temp2,temp < < ; BIT-MUSTER (bei gerader Anzahl von HIGH = NULL) < andi temp2,0b00000001 < ; Parität laden < LDS temp,(adr_DCF_BEREICH+58) ; aus SRAM laden < ; Parität vergleichen < cp temp2,temp < breq DCF_ZEIT_58_OK < ret Ich hoffe du verstehst das als positive Kritik. Weiterhin viel Erfolg, Uwe
< LDS temp,(adr_DCF_BEREICH+50) ; aus SRAM laden < add temp2,temp < LDS temp,(adr_DCF_BEREICH+51) ; aus SRAM laden < add temp2,temp < LDS temp,(adr_DCF_BEREICH+52) ; aus SRAM laden < add temp2,temp < LDS temp,(adr_DCF_BEREICH+53) ; aus SRAM laden < add temp2,temp < LDS temp,(adr_DCF_BEREICH+54) ; aus SRAM laden < add temp2,temp < LDS temp,(adr_DCF_BEREICH+55) ; aus SRAM laden < add temp2,temp < LDS temp,(adr_DCF_BEREICH+56) ; aus SRAM laden < add temp2,temp < LDS temp,(adr_DCF_BEREICH+57) ; aus SRAM laden < add temp2,temp Joa, sowas sollte man auf gar keinen Fall mit ner Schleife machen. Da hätte man am Ende ja einen kompakten und sehr leicht verstehbaren Code.
@Falk ich wollte ursprünglch den "Screenshot" über den USB-Stick des DS1022 laden, aber leider dankte es mir der Oszi nur mit einem Totalabsturz :-( Nicht alle USB-Sticks vertragen sich mit dem DS1022, da muss wohl der Hersteller des Oszis noch etwas nachbessern ;-) @Uwe @"Gast" Ihr habt natürlich Recht, durch Schleifen könnte einiges optimiert werden. Danke für den Tipp. "LDS / STS verbrauchen 2 Worte(4Byte) Programmspeicher"? Das ist viel. Das wusste ich auch noch nicht. Danke. Bernhard
Bernhard S. schrieb: > Ihr habt natürlich Recht, durch Schleifen könnte einiges optimiert > werden. > Danke für den Tipp. Besonders kompakt wird es, wenn man die Dekodierung über eine Tabelle steuert (Byteadresse, Bitwertigkeit je Bitnummer). Hier ein schon älteres Beispiel: Beitrag "DCF77-Uhr mit ATTINY12" Der Code ist 330 Words groß. Peter
Dafür funktioniert der Code mit 330 Words auf einem Mega 8 nicht.
Tester schrieb: > Dafür funktioniert der Code mit 330 Words auf einem Mega 8 nicht. Wow, daß Du das auch schon gemerkt hast. AVRs sind generell nicht binärkompatibel! Es sind immer Anpassungen nötig, wenn man den Typ wechselt (Hardware-/Softwarestack, Portbelegung, Interruptvektoren, Timerfunktionen, ...). Sogar bei weitgehend ähnlichen Typen (ATmega8 / ATmega88) sind teilweise erhebliche Unterschiede. Anhand der Erläuterungen und Kommentare sollte das Anpassen aber kein Problem darstellen. Durchaus möglich, daß der ATmega8-Code sogar kürzer wird, da ja beim ATtiny12 einige Klimmzüge notwendig waren. Peter
@Peter > Besonders kompakt wird es, wenn man die Dekodierung über eine Tabelle > steuert (Byteadresse, Bitwertigkeit je Bitnummer). Gute Idee mit der Tabelle, so spart man Platz und Takte :-) @ALLE Habe mal ein paar Versuche gestartet und den DCF-Empfänger ungünstig positioniert, so dass er nur störbehaftete Signale empfing. Ergebnis: Uhrzeit und Jahr total falsch! Trotz Paritätsprüfung. Die Paritätsprüfung ist demzufolge keine 100 %-ige Sicherheit für die exakte Uhrzeit und Datum. Eine Lösungsmöglichkeit wäre, wenn die aktuelle empfangene DCF-Zeit-Datum mit der 1-Minute vorher empfangenen DCF-Zeit-Datum verglichen wird. Ich denke, somit erhöt sich die Sicherheit um ein mehrfaches, denn es ist sehr unwarscheinlich, dass total falsche Protokolle 2 mal hintereinander empfangen werden. Bernhard
Bernhard S. schrieb: > Habe mal ein paar Versuche gestartet und den DCF-Empfänger ungünstig > positioniert, so dass er nur störbehaftete Signale empfing. > > Ergebnis: Uhrzeit und Jahr total falsch! Trotz Paritätsprüfung. > > Die Paritätsprüfung ist demzufolge keine 100 %-ige Sicherheit für die > exakte Uhrzeit und Datum. Das stimmt. Füge mal, wie in meinem Code, eine Pulsabstandsprüfung hinzu. Ich setze das Fehlerbit, wenn die Pulse nicht in den Fenstern 0,9-1,1s bzw. 1,8-2,2s liegen. Man kann noch die 0/1-Erkennung nicht mit einer Schwelle, sondern auch mit 2 Fenstern machen (80-120ms, 180-220ms). Die Störungen sind nämlich nicht synchron zum DCF-77 Signal, sondern zufällig. Peter
Die Schaltung ist sehr interresant, meine Frage wäre wo muss ich was wie ändern damit die Schaltung mit 7 Segment Anzeigen mit gem, Kathode auch geht ?
@Thomas >wo muss ich was wie >ändern damit die Schaltung mit 7 Segment Anzeigen mit gem, Kathode auch >geht ? Man könnte die Schaltung exakt so übernehmen, also einfach die Displays tauschen, aber eine Kleinigkeit muss im Programmcode geändert werden. Das gleiche Ergebnis erhält man natürlich, wenn alle Pegel aller Display-Pins durch eine Hardware invertiert werden. Bernhard
Bernhard Danke, dachte mir, mich würde interresieren, wo und wie es im Code geändert werden muss...Verständnisfrage...
Thomas schrieb: > Bernhard > > Danke, dachte mir, mich würde interresieren, wo und wie es im Code > geändert werden muss...Verständnisfrage... Durchgefallen :-) Das wirst du schon selber machen müssen. Bernhard hat ja im Nachsatz schon den entsprechenden Hinweis gegeben, was prinzipiell gemacht werden müsste, als er sagte: "Das gleiche Ergebnis erhält man natürlich, wenn alle Pegel aller Display-Pins durch eine Hardware invertiert werden."
Hallo! Habe diese Uhr nachgebaut, doch leider funktioniert sie nicht so wie sie soll. Nach dem "Testbild" ist die Minuten-Einerstelle ausser Betrieb, ausserdem syncronisiert sich die Uhr nicht. Die DCF-Fehler LED ist ständig an, die Impuls-LED blinkt syncron zur DCF-Ausgang LED, und die Sekundenpuls LED blinkt alle Sekunde. Aufbau ist identisch mit dem Schaltplan, bis auf einen invertier Transistor für den DCF-Empfänger. Ich hoffe das da jemand helfen kann. Gruß Malte
@Malte >Aufbau ist identisch mit dem Schaltplan, bis auf einen invertier >Transistor für den DCF-Empfänger. Vielleicht drf das Signal nicht invertiert werden? Gruß Bernhard
Ich finde den Code auch sehr übersichtlich (da sollte ich mir eine Scheibe abschneiden). Du magst den Befehl tst anscheinend sehr. Dieser setzt SREG-Bits aufgrund der Variable. Alle Rechenbefehle machen das auch, d.h. vor nach einem add, or, andi kann man den Befehl weglassen (Z.10 Led_Dcf).
@Samuel >Ich finde den Code auch sehr übersichtlich danke :-) >Alle Rechenbefehle machen das auch, d.h. vor nach >einem add, or, andi kann man den Befehl weglassen Da gebe ich Dir Recht, auf "tst" kann man in diesen Fällen verzichten. Gruß Bernhard
@Bernhard S.
> Vielleicht drf das Signal nicht invertiert werden?
Laut Deinem Bild gibt der von Dir verwendete DCF-Empfänger "negative"
Pulse aus. Also im Ruhezustand High, Impulse Low.
Ich habe den Reichelt-DCF-Empfänger verbaut. Der gibt das genaue
gegenteil aus: Ruhezustand Low, Aktiv High.
Schliesse ich ihn direkt an den AtMega, reagiert dieser nur selten auf
die Signale.
Gruß
Malte
@Malte >Schliesse ich ihn direkt an den AtMega, reagiert dieser nur selten auf >die Signale. Auch bei "invertierten" Signalen muss die Impuls-LED im Sekundentakt kurz blinken. Vielleicht hilft ein R (ca. 10k) vom DCF-Ausgang gegen +5V bzw. Masse? Ich musste bei mir das DCF-Modul zusätzlich mit einem L in der Versorgungsleitung ausstatten. Die Betreibsspannung war zusehr verrauscht und gestört, brachte das DCF Modul permanent durcheinander. Es kann auch sein, das das 7-Segment-Display den Empfänger stört. Etwas Abstand könnte helfen. Benhard
Werde das mal testen. So sieht es aktuell aus: http://www.youtube.com/watch?v=PqcxHaWcYT0 Gruß Malte
@Malte das Video ist sehr aussagekräftig. Mir fallen mehrere Fehler auf. 1. Das DCF Modul empfängt starke Störsignale, im Sekundentakt muss es einen Imuls ausgeben, bei Dir flackert die Kontroll-LED nur. 2. Nach einem Reset erfolgt ein kurzer Segmenttest "88888888"=> OK Anschließend müsste die Uhrzeit "00.00.00" angezeigt werden und die Sekunden hochzählen. Und das erkenne ich nicht. Bernhard
Moin! Habe den Empfänger jetzt ca 30cm vom rest der Schaltung entfernt, und die Uhr läuft. Nur die Anzeigefehler der einzelnen Zahlen sind noch da. Werde das bei gelegenheit noch filmen. Gruß Malte
...falls mal kein Empfänger zur Verfügung steht: Beitrag "DCF77 Simulator Generator Encoder Atmega8 Assembler" Bernhard
Eine LCD-Variante... Und falls mal kein DCF77 Empfänger zur Verfügung steht: Beitrag "DCF77 Simulator Generator Encoder Atmega8 Assembler" Bernhard
Version 2012/09 - Ein Jumper aktiviert intern eine Invertierung des DCF-Eingangssignals, denn einige DCF-Module geben ihr Ausgangssignal invertiert wieder. (nicht invertiert = 77kHz Träger ON = HIGH am Ausgang) - Der interne PULL-UP des DCF-Eingangs-Pins lässt sich durch einen Jumper deaktivieren, denn manche DCF-Module besitzen einen sehr hochohmigen Ausgang, da stört ggf. ein R gegen +5V - Es kann auch vorkommen, dass ein DCF-Modul ein R gegen GND benötigt. - Die rote LED leuchtet, wenn ein gültiges DCF-Signal heute noch nicht empfangen wurde. - Die gelbe LES blinkt kurz im Sekundentakt (100/200ms DCF-Eingangssignal) - Die grüne LED leuchtet, wenn das DCF-Protokoll komplett und fehlerfrei empfangen wurde. - Eine LC-Kombination am DCF-Empfänger kann ggf. die Empfangseigenschaften verbessern. - kleiner Tipp: Die Empfangsantenne sollte sich nicht zu nah an den 7-Segment LEDs befinden (Störsignal) Bernhard
... die DCF-Uhr mit einem Samplingverfahren.... Beitrag "DCF / DCF77 UHR - LCD LED Samplingverfahren ATmega8 ASSEMBLER" Bernhard
Peter Dannegger schrieb: > Hier ein schon älteres Beispiel: > > Beitrag "DCF77-Uhr mit ATTINY12" > > Der Code ist 330 Words groß. Du meine Güte. Sind denn die knapp über 100 meines Beitrag "DCF77 AVR-Assemblerbaustein" noch immer nicht unterboten worden ? :-) Jan
Jan K. schrieb: > Peter Dannegger schrieb: >> Hier ein schon älteres Beispiel: >> >> Beitrag "DCF77-Uhr mit ATTINY12" >> >> Der Code ist 330 Words groß. > > Du meine Güte. Sind denn die knapp über 100 meines > Beitrag "DCF77 AVR-Assemblerbaustein" noch immer nicht > unterboten worden ? :-) > > Jan Meine Güte - geht es bei euch beiden auch ohne Eigenlob?
Habe bei Ihnen diese Uhr gefunden, Atmega 8 als prozessor, wäre es möglich wenn Sie mir einen offenen Atmega 8 zuschicken konnten, mit schaltplan, Bezahle ich Ihnen auch, Brauche dieses für Schulungszwecke bei de Firma BFNW.eV Chemnitz. Danke für Ihre Antwort Jörg Stange
Hallo Herr Stange, ich würde Ihnen diese Uhr empfehlen: Beitrag "DCF / DCF77 UHR - LCD LED Samplingverfahren ATmega8 ASSEMBLER" Sie ist weiterentwickelt worden und arbeitet nach einem etwas anderen Verfahren. Einen ATmega8 könnte ich Ihnen zusenden, meine e-mail Adresse finden Sie auf den Schaltplänen. Bernhard
Hallo Bernhard, hast du bitte eine genau Beschreibung: • Wie wird die Signaldaten von DCF77-Modul im Mikrocontroller verwarbeiten? • Wie werden die verarbeitete Daten auf einer Anzeige ausgegeben? Es wäre eine tolle Sache das Ganze zu verstehen? Ich danke dir im Voraus. wecrper
Bernhard S. schrieb: > Ich habe versucht den Assembler-Programm-Code so gut wie möglich zu > kommentieren. Und hier eine DCF-Uhr mit einem Sampling-Verfahren: Beitrag "DCF / DCF77 UHR - LCD LED Samplingverfahren ATmega8 ASSEMBLER"
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.