Anwendungen von
AVR-Einchip-Prozessoren AT90S, ATtiny, ATmega und ATxmega DCF77 Anzeige der seriellen Signale
6 DCF77 Display mit ATtiny24
Dieses Teil
empfängt die seriellen Signale und zeigt sie auf einer LCD an,
ist mit der ATtiny24-Experimental-Schaltung mit LCD
aufgebaut, die einfach per sechspoligem Steckverbinder angekoppelt ist und eine vierzeilige
LCD antreibt,
verwendet die in LCD beschriebene Software lcd.inc, um die
LCD anzusteuern, und
empfängt serielle Signale vom
ATtiny45-Controller und stellt
sie in verschiedenen Formaten auf der LCD dar,
hat ferner eine Sekundenanzeige, die aber einfach nur von 0 bis 59 zählt.
Sie kann als Uhr mit einem der hier vorgestellten Empfängern betrieben werden und zeigt
Uhrzeit und Datum an sowie Statusinformationen des Empfängers.
6.1 Anschluss an den Empfänger
Mit einem sechsadrigen Flachbandkabel wird der Datenanschluss der
ATtiny24-Experimentalschaltung mit dem
Empfängercontroller verbunden:
Der Clockausgang SCM des ATtiny45-Controllers wird mit PA0 der ATtiny25-Schaltung
verbunden.
Der Datenausgang SDM wird mit PA1 verbunden.
Der VCC-Anschluss wird mit den +5V des Empfängers verbunden, so dass LCD-Modul und
Empfänger aus derselben Spannungsquelle versorgt werden.
Die beiden GND-Anschlüsse werden ebenfalls verbunden.
Beim Start und ohne serielle Eingangssignale startet das Programm mit dieser Anzeige.
In Zeile 2 werden hinter Raw data: die eingehenden Rohdaten dargestellt.
Das Format des ersten Zeichens (rRxH) ist ASCII, dann folgt rRxL
in hexadezimalem Format. Hinter F: gibt es den PWM-Wert der Frequenzeinstellung
in dreistelligem dezimalem Format.
Die eingehenden DCF77-Daten für die Zeit (Stunden und Minuten) folgen in Zeile 3.
Die Sekunden sind intern erzeugt und laufen auch ohne DCF77-Signal. Hinter S:
folgt der PWM-Wert der Signalabschwächung in 3-Digit-Dezimal-Format.
Zeile 4 bringt den Wochentag und das Datum sowie Signalfehlerkennzeichungen (hinter
E:).
Erst mit eingehenden Signalen vom ATtiny45-Controller kommt Leben in diese Bude.
Die Software kann als Assembler-Quellcode hier
heruntergeladen oder im Browser hier angezeigt
werden.
In den folgenden Kapiteln ist die Funktionsweise der Software näher dargestellt.
6.3.1 Empfang der seriellen Signale
Der serielle Empfang funktioniert folgendermaßen:
Bei jedem Pegelwechsel an PA0 (serielles Clock-Signal) wird der PCINT0-Interrupt
ausgelöst.
Ist der PA0-Eingang nach dem Pegelwechsel High, dann ist ein Bit am Dateneingang
abzuholen. Dieses wird in zwei Register (rSerialH:rSerialL) von Bit 0 her
eingerollt. Die Anzahl empfangener Bits wird im Register rSerialBits
abwärts gezählt. Erreicht der Zähler Null, werden die 16 Bits in
das Registerpaar rRxH:rRxL kopiert und die Flagge bRxIn gesetzt.
Außerdem wird der Time-Out-Zähler rSerialTO auf einen Anfangswert
gesetzt.
Außerhalb der PCINT-Routine erfolgt das Abwärtszählen des
Time-Out-Zählers. Erreicht dieser Zähler Null, wird die Anzahl empfangener
Bits auf den Anfangswert gesetzt, schon empfangene Bits werden damit verworfen.
Die weitere Verarbeitung der empfangenen 16 Bits in rRxH:rRxL erfolgt
außerhalb der Interrupt-Service-Routine. Je nachdem welches ASCII-Zeichen in
rRxH enthalten ist, werden die unteren Bits in rRxL unterschiedlich
behandelt. Alle dazu nötigen Informationen stehen in der Tabelle PosTable::
Jede Zeile der Tabelle beginnt mit dem betreffenden ASCII-Zeichen.
Die beiden folgenden Bytes bezeichnen die Zeile und die Spalte auf der LCD, an
der die nachfolgenden Operationen erfolgen sollen (0-basiert).
Handelt es sich bei dem betreffenden Parameter um eine DCF77-Information, wird
deren Position im SRAM-Puffer für Datum/Zeit als Versatzbyte angefügt.
Handelt es sich nicht um DCF77-Informationen, wird der Wert 255 angefügt.
Die Art der Anzeige kodiert das nächste Byte. Eine 0 gibt rRxL als
ASCII-Zeichen aus, eine 1 als zweistellige Dezimalzahl, eine 2 als dreistellige
Dezimalzahl, eine 3 als Wochentag (0 = Montag) und eine 4
schiebt die empfangene Null oder Eins in einen Registerpuffer, und
gibt die letzten vier empfangenen Bits binär aus.
Die abschließende Null in jeder Zeile sorgt für eine geradzahlige
Anzahl an Bytes.
Die Tabelle endet mit zwei Nullen.
Erweiterungen der Tiny45-Controller-Software mit weiteren Parametern können in
diese Struktur leicht eingearbeitet werden. Die Struktur kann auch 1:1 in andere
Anzeige-Controller übernommen werden.
6.3.2 Sekundentakt und Schnittstellen-Time-Out
Als Sekundentakt wird der Timer TC0 verwendet. Er teilt das mit dem Prescaler durch
8 geteilte Clock-Signal von 1 MHz im CTC-Modus durch 125. Der Interrupt erfolgt
daher nach 8 * 125 / 1.000.000 = 1 ms. Der Interrupt vermindert den Inhalt des
Doppelregisters rSecH:rSecL um Eins. Erreicht dieses Null, wird die Flagge
bSec gesetzt und das Doppelregister wieder mit 1.000 gestartet.
Bei gesetzter Flagge werden die Sekunden im SRAM erhöht (bei 60 wird wieder bei
Null begonnen) und diese als 2-stellige Dezimalzahl an der Sekundenposition der LCD
ausgegeben.
Gleichzeitig mit dem Millisekunden-Interrupt wird auch der Time-Out-Wert der seriellen
Empfangsmaschinerie um Eins erniedrigt. Erreicht dieser nach 8 Millisekunden Null,
ohne dass ein Bit eingegangen ist, wird die Anzahl empfangener Bits neu begonnen.
6.3.3 Debugging-Option
Um die Auswertung eingegangener serieller Signale im Simulator zu testen, gibt es
zu Beginn noch den Debug-Schalter Debug_display. Steht dieser auf Yes
wird die Bit-Kombination in cDebug_displayH und cDebug_displayL
getestet. Der Debug-Schalter muss für die endgültige Version wieder auf
No gestellt werden.