Pfad: Home => AVR-DE => Anwendungen => DCF77-Empfänger => Uhr mit Sync m48   This page in English: Flag EN
DCF77 receiver logo Anwendungen von
AVR-Einchip-Mikrocontrollern AT90S, ATtiny, ATmega und ATxmega
Uhr/Anzeige DCF77 mit ATmega48
Logo
Dieses Projekt ist experimentell. Ich bin nicht sicher, ob und wie es funktioniert. Die Software dafür ist noch in Arbeit. Nachbau auf eigene Gefahr!

9 DCF-Anzeigen und Uhren

9.5 DCF77-Anzeige für Sync-Signale mit LCD und ATmega48

Der DCF77-Geradeausempfänger mit dem tn25-Controller gibt an den Pins 3 und 7 auf Wunsch ein synchrones serielles Signal ab. In diesem Teilprojekt werden diese synchronen Signale empfangen, ausgewertet und auf einer LCD angezeigt. Damit kann eine Anzeige von Datum und Uhrzeit auf einer beliebigen LCD erfolgen und bei einer genügend großen LCD können Statusmeldungen des DCF77-Empfängers dargestellt werden.

Diese Schaltung kann aber noch mehr: es ist eine eigenständige Uhr, die mit einem Quarz angetrieben ist, mit zwei Tasten und einem Potenziometer gestellt werden kann und mit einem Fototransistor sogar die Umgebungshelligkeit misst und die Hintergrundbeleuchtung der LCD entsprechend einstellt.

9.5.1 Benötigte Hardware

Synchrone DCF77-LCD-Anzeige mit ATmega48 Diese eigenständige Uhr mit einem ATmega48 tickt mit einem Quarz. Sie kann mit zwei Tasten (Vorwärts, PB0, und Rückwärts, PB2) und einem Potentiometer an ADC0 manuell eingestellt werden. Zusätzlich empfängt eine serielle Schnittstelle Synchron-Signale, die die Zeitinformationen von DCF77 bereitstellt und synchronisiert die Uhrzeit und das Datum mit diesen.

Die seriellen synchronen Signale werden am PCINT13-Pin (Clock) und an PC4 (Data) mittels PCINT-Interrupt aufgesammelt und im SRAM gespeichert. Trifft ein Linefeed ein, werden die Zeitdaten (T) und gegebenenfalls auch Empfangsmeldungen (E) sowie Statusmeldungen (S) vom DCF77-Empfänger ausgewertet und auf der angeschlossenen LCD dargestellt.

Die LCD ist im Acht-Bit-Modus an den Port PD angeschlossen, die Pins PC3 (E), PC2 (R/W) und PB5 (RS) steuern die Kommunikation mit der LCD im Schreib/Lese- Verfahren mit Auswertung des Busy-Bits. Angeschlossen werden kann jede beliebige LCD, deren Anzahl Zeilen und Spalten bestimmen dann über die verfügbaren Darstellungsarten. Diese Einstellung wird im Quellcode vorgenommen.

Die Hintergrundbeleuchtung der LCD wird mit einem PWM-Signal von OC1A (PB1) angetrieben. Der Prozessor misst die Umgebungshelligkeit mit dem Fototransistor am ADC1-Pin.

Die Taktung des ATmega48 erfolgt mit dem 2,4576-MHz-Quarz. Die Uhr ist daher auch ohne DCF77-Synchronisierung genau genug.

Berechnungsgrundlagen für das Projekt sind in der Libre-Office-Calc-Datei hier angegeben.

9.5.2 Aufbau

Aufbau der Uhr Ich habe die Uhr auf einem Lochraster-Abschnitt aufgebaut. Die Komponenten (rot: Widerstände, blau: Kondensoren, grün: Spule) wurden optimal platziert, die 16-polige LCD-Fassung befindet sich am linken Rand. Die Größe der LCD überdeckt die gesamte Platine, die von unten her an die LCD angedockt wird.

Damit alle externen Bauteile bequem angeschlossen und auch wieder entfernt werden können, habe ich alle externen Anschlüsse an einen 20-poligen Wannenstecker geführt.

Der sechspolige Wannenstecker erlaubt das Programmieren des ATmega48 in der fertigen Schaltung.

Platine von oben Platine von unten Das ist die fertige Platine von oben und von unten. Die Verdrahtung ist etwas fitzelig, funktioniert aber wunderbar.

Die Steckverbinder Die LCD zeigt an Auf dem linken Bild sind die Steckverbinder mit den gewinkelten Wannensteckern zu sehen, ganz links die Buchsenreihe für das Aufstecken der LCD.

Auf der rechten Seite ist die Uhr bei der Arbeit zu sehen.

9.5.3 Software

9.5.3.1 Download

9.5.3.2 Funktionsweise der Software

9.5.3.5 Umwandlung von Datum nach Wochentag

Wochentagsberechnung aus Datum Wenn man das Datum manuell mit den Tasten und dem Potentiometer einstellt, müsste man auch den Wochentag dazu korrekt einstellen. Damit das automatisch geht und nicht erst langwierige manuelle Einstellung erfordert, gibt es in dieser Software eine Berechnung des Wochentags aus dem Datum. Das Flussdiagramm dazu ist rechts zu sehen. Es gibt es auch als LibreOffice- Draw-Datei hier.

Bezugspunkt ist der 31.12.1999, was ein Donnerstag war. Entsprechend beginnt die Berechnung mit vier (die Wochentage sind mit 0 für Montag bis 6 für Sonntag in der Tabelle zu abgebildet). Da sowohl die angelsächsische als auch die deutsche Notation verarbeitet werden soll, sind die Tabellen unterschiedlich, die Konstante fEn schaltet mit Eins die englische Notation ein. Die Notation wirkt sich sowohl auf die Wochentagsabkürzungen als auch auf die Reihenfolge im Datum.

Zuerst werden die Tage des Datums zum Basispunkt addiert. Dazu werden die Tages-Einer dDayO und -Zehner dDayT als ASCII-Zeichen aus dem SRAM mit dem Datum gelesen und die ASCII-Nullen abgezogen. Sind die Zehner nicht Null, werden im Register ZL jeweils zehn dazu addiert, bis die Tage binär in ZL stehen. Diese Zahl wird in der Unterroutine AddWd zu der Basis-Zahl vier hinzuaddiert. Ist das Ergebnis größer als 6, werden jeweils sieben angezogen und die Prüfung wiederholt. Diese Unterroutine wird mehrfach verwendet, daher ist sie eingenständige Routine formuliert.

In gleicher Weise wird der Monat eingelesen. Da dieser nur einen Zehner haben kann, ist das Lesen entsprechend vereinfacht. Die Verschiebungen durch die Monate sind in der Tabelle MoTab abgelegt. Sie akkumulieren jeweils um wieviel Tage die Wochentage zu verschieben sind. Im Januar sind das Null, im Februar 3, etc. Sind diese Tagesverschiebungen addiert, wird noch überprüft, ob der Monat größer als zwei ist und, falls ja, ob es sich um ein Schaltjahr handelt. Ist dies der Fall, wird noch ein Tag addiert.

Dann werden die Jahre behandelt. Da diese mehrfach benötigt werden, ist deren Ermittlung als Unterroutine ReadYr formuliert. Zuerst werden die Jahre addiert, denn in jedem Jahr verschiebt sich der Wochentagum einen Tag. Ist das Jahr nicht Null, wird zu den Jahren eins addiert.

Zuletzt werden die Schaltjahre addiert. Dazu werden die Jahre durch vier geteilt und diese addiert.

Der Wochentag befindet sich nun als Binärzahl im Register rmp. Durch Multiplikation mit zwei und Addieren zum Beginn der Wochentagstabelle in Weekdays2 werden die beiden Buchstaben des Wochentags ermittelt und in das SRAM geschrieben.

©2021 by http://www.avr-asm-tutorial.net