Forum: Projekte & Code DCF77 Uhr 7 Segment LED ATmega8 Assembler


von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

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 Jacek G. (tfc)


Lesenswert?

Von welchem Hersteller ist das DCF77-Modul, das Du verwendest?
Nicht das von Reichelt, oder?

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

@ 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

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  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

von Uwe (Gast)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

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

von Bernhard S. (bernhard)


Lesenswert?

@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

von Peter D. (peda)


Lesenswert?

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

von Tester (Gast)


Lesenswert?

Dafür funktioniert der Code mit 330 Words auf einem Mega 8 nicht.

von Peter D. (peda)


Lesenswert?

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

von Bernhard S. (bernhard)


Lesenswert?

@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

von Peter D. (peda)


Lesenswert?

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

von Thomas Kiss (Gast)


Lesenswert?

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 ?

von Bernhard S. (bernhard)


Lesenswert?

@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

von Thomas (Gast)


Lesenswert?

Bernhard

Danke, dachte mir, mich würde interresieren, wo und wie es im Code 
geändert werden muss...Verständnisfrage...

von Karl H. (kbuchegg)


Lesenswert?

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

von Malte (Gast)


Lesenswert?

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

von Bernhard S. (bernhard)


Lesenswert?

@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

von Sam .. (sam1994)


Lesenswert?

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

von Bernhard S. (bernhard)


Lesenswert?

@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

von Malte M. (seamen)


Lesenswert?

@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

von Bernhard S. (bernhard)


Lesenswert?

@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

von Bernhard S. (bernhard)


Lesenswert?


von Malte M. (seamen)


Lesenswert?

Werde das mal testen.
So sieht es aktuell aus:
http://www.youtube.com/watch?v=PqcxHaWcYT0

Gruß
Malte

von Bernhard S. (bernhard)


Lesenswert?

@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

von Malte M. (seamen)


Lesenswert?

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

von Bernhard S. (bernhard)


Lesenswert?

...falls mal kein Empfänger zur Verfügung steht:

Beitrag "DCF77 Simulator Generator Encoder Atmega8 Assembler"

Bernhard

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Eine LCD-Variante...


Und falls mal kein DCF77 Empfänger zur Verfügung steht:

Beitrag "DCF77 Simulator Generator Encoder Atmega8 Assembler"


Bernhard

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

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

von Bernhard S. (bernhard)


Lesenswert?

... die DCF-Uhr mit einem Samplingverfahren....

Beitrag "DCF / DCF77 UHR - LCD LED Samplingverfahren ATmega8 ASSEMBLER"

Bernhard

von Jan K. (pit1)


Lesenswert?

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

von Jürgen (Gast)


Lesenswert?

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?

von Stange (Gast)


Lesenswert?

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

von Bernhard S. (bernhard)


Lesenswert?

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

von Walter C. (walter_c)


Lesenswert?

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

von Bernhard S. (bernhard)


Lesenswert?

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
Noch kein Account? Hier anmelden.