DCF77-Simulator
Wer
gelegentlich Funkuhren baut, die von dem Zeit- zeichensender DCF77 in
Mainflingen
angesteuert werden, kennt den Sachverhalt, dass nicht immer
über den ganzen Tag
hinweg ein Empfang des Senders gegeben ist. Auch hängen die
Empfangsbedingungen
oft von der eigenen Lokalität ab. Liegt der Laborplatz tief im
Keller oder
mitten im Haus kann man da schon einmal Pech haben. Will man gerade
dann die
Schaltung testen, muss man entweder den ganzen Krempel ans Fenster
schaffen
und/oder warten bis die Empfangsbedingungen besser sind. Hier schafft
der
DCF77-Simulator Abhilfe.
Um
es vorweg zu sagen. Es wird kein 77,5 kHz-Träger generiert,
sondern nur das
niederfrequente Zeittelegramm. Denn im Normalfall verwendet man wohl
ein
fertiges Empfangsmodul, wie man es z.B. von Conrad oder Reichelt
bekommt und
konzentriert sich darauf die Uhrenlogik selbst zu bauen. Wer jedoch
einen
leistungsfähigen Empfänger selbst entwickelt, der hat
wahrscheinlich auch einen
geeigneten Messsender zur Verfügung.
Die
Grundlagen habe ich bereits in dem Artikel " DCF77 Funkuhr mit dem
BASCOM" beschrieben. Ich bitte Sie ggf.
dort nachzulesen.
Die
Software
Im
Wesemtlichen laufen drei Prozesse ab:
*
ein komplettes Zeittelegramm erstellen (Unterprogramm Zeittelegramm),
*
das Zeittelegramm ausgeben (macht das Hauptprogramm),
und
*eine
interne Uhr (Interruptroutine Kurzzeit)
die im Folgenden näher
beschrieben werden:
Das
Hautprogramm
bildet
diese Prozesse ab. Zuvor werden den Variablen Stunde, Minute,
usw. Werte zugewiesen. Dann erfolgt
in
einer Do/Loop-Schleife ein Aufruf des Unterprogramms Zeittelegramm,
welches ein
komplettes Zeittelegramm in die Stringvariable Telegramm
übergibt. Diese wird in
der folgenden For/Next-Schleife Zeichen für Zeichen
abgearbeitet. Für jede „0“
wird Port PB.0 für 100 mS auf 0 gesetzt, für jede
„1“ wird Port PB.0 für 200 mS
auf 0 gesetzt. Die verbleibende Zeit bis zur nächsten Sekunde
bzw. dem nächsten
Zeichen wird Port PB.0 auf log. 1 gesetzt. Eine Ausnahme ist die 59.
Sekunde
mit dem Zeichen „ „(Space). Hier bleibt Port PB.0
auf log. 1. (Minutenmarke).
Port Pb.1 wird immer invertiert gesetzt
Die
interne Uhr Kurzzeit
Kurzzeit
ist eine Interruptroutine die vom Timer0 alle 100 mS aufgerufen wird.
Sie zählt
die Variablen Stunde, Minute, Sekunde, Tag, Wtag (Wochentag), Monat und
Jahr
hoch.
Erstellen
des Zeittelegramms mit Zeittelegramm
Zunächst
generiert das Unterprogramm Zeittelegramm
ein komplettes Zeittelegramm aus den
in Kurzzeit
generierten Variablen. Dieses Zeittelegramm ist in dem String
(Zeichenkettenvariable) Telegramm mit einer Länge von 60
Zeichen gespeichert.
Dabei symbolisieren die Zeichen „0“ und
„1“ die Zustände des später
auszugebenden Signals. Eine Ausnahme bildet die 59. Sekunde
entsprechend dem
59. Element im String. Da an dieser Stelle keine Absenkung des Signals
erfolgt,
findet sich hier das Zeichen Space „ „.
Das
folgende Beispiel zeigt ein typisches Zeittelegramm für
Dienstag den
5.3.13, 14:12:
0000000000000000000101001000001010010100001011000110010000
0
Das
Unterprogramm Zeittelegramm
benötigt seinerseits zwei Unterprogramme. Nämlich
das Unterprogramm Kodieren
und das Unterprogramm Parität.
Kodieren
bekommt
seine Eingangswerte wie Stunde, Minute,
ect. mit der Integervariablen Wert
übergeben. Kodieren
überprüft diese Variable auf das Vorhandensein der
Wertigkeiten
80, 40, 20, 10, 8, 4, 2 und 1.
Dies
macht es, indem es von Wert die entsprechende Wertigkeit abzieht. Ist das Ergebnis
dieser Subtraktion
kleiner als Null wird der Stringvariablen Teil
eine „0“
zugefügt, wenn nicht dann wird der Stringvariablen Teil eine
„1“ zugefügt.
Teil ist
nach Verlassen von Kodieren
also immer achtstellig und muss von der
aufrufenden Routine Zeittelegramm
auf die erforderliche Länge gestutzt werden
(und zwar von Links nach Rechts).
Parität
erzeugt,
wie sein Name vermuten lässt, ein Paritätsbit.
Eingangs- und Ausgangsvariable
ist die
Stringvariable Teil. Als
Eingangsvariable enthält sie den aus den zu prüfenden
Elementen „0“ oder „1“
zusammengesetzten String, als Ausgangsvariable das ermittelte
Paritätsbit.
Wieder mit „0“ oder „1“ als
Stringelement. Wie testet man ob eine Zahl gerade
oder ungerade ist? Nun, wenn man diese Zahl durch Zwei teilt und das
Ergebnis
keine Nachkommastellen hat, dann ist diese Zahl gerade. Eine ungerade Zahl hat, teilt man sie
durch Zwei, immer
Nachkommastellen. Genauso verfahren wir mit der Variablen Paritaet. Die Funktion Frac() unter
BASCOM gibt die
Nachkommastellen einer Zahl zurück. Hat die Zahl keine
Nachkommastellen gibt
Frac() den Wert Null zurück. Wir weisen der Singlevariablen
Paritaet das
Ergebnis von Frac()
zu und prüfen
anschließend ob Paritaet gleich Null ist. In diesem Fall wird
der Variablen
Teil der Wert Null zugewiesen, andernfalls weisen wir Teil eine Eins
zu. Damit
enthält jetzt Teil die Aussage, ob Paritaet eine gerade oder
ungerade Zahl
enthielt. Das aufrufende Unterprogramm Zeittelegramm
ergänzt den
Telegrammstring um Teil.
Die
Hardware
Die
Hardware ist ehr simpel. Ein ATMEL ATTiny45 mit entsprechender
Programmierung,
ein Widerstand, ein Quarz, vier Kondensatoren. Ggf. noch eine
Stromversorgung.
Das ist schon alles. Der Aufbau erfolgte auf einem Breadboard. Das
obige Bild
zeigt den Schaltplan. Der ATTiny45 verfügt über 4 KB
Flashspeicher. Eine ganze
Menge für den 8-Pin Winzling. Das Programm ist unter BASCOM-AVR entwickelt worden und
liegt sowohl im
Sourcecode als auch fertig kompiliert vor.
Der Sourcecode umfasst weniger als 4kB und
kann daher auch mit der
kostenfreien Demoversion des BASCOM kompiliert werden. An dem Port PB.1
wird
das Zeittelegramm und an Port PB.0 das invertierte Zeittelegramm
ausgegeben.
Wer keinen Wert auf einen genau gehenden Simulator legt, kann den Quarz
auch
weglassen. Die folgenden Bilder zeigen
Screenshoots des AVR Studio 4 für die einzustellenden Fuses.
Einmal für den
Betrieb mit dem internen Oszillator und einmal für die
Verwendung eines
8MHz-Quarzes.
Software Download
|