Pfad: Home => AVR-DE => Anwendungen => DCF77-Empfänger => Controller tn25   This page in English: Flag EN
DCF77 receiver logo Anwendungen von
AVR-Einchip-Mikrocontrollern AT90S, ATtiny, ATmega und ATxmega
DCF77 Controller mit ATtiny25
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!

6 DCF77-Controller mit ATtiny25

Die 77,5kHz-HF (bei Geradeausverstärkern) oder die 32,768kHz-ZF (beim Superhet) müssen gleichgerichtet werden, um daraus die Amplitudeninformation gewinnen zu können. Ursprünglich hatte ich dafür den AM-Gleichrichter mit einem ATtiny25 entwickelt (siehe hier). Dieser misst die Amplitude mit einem AD-Wandler, richtet die Wechselspannung gleich und stellt die Signalhöhe als Linearspannung extern zur Verfügung.

Der ATtiny25 ist damit aber bei Weitem noch gar nicht ausgelastet. Er kann auch gleichzeitig noch folgendes miterledigen:
  1. er kann eine AGC-Regelspannung erzeugen, die den Maximalwert der Signalhöhe, gemessen über zwei Sekunden lang, auswertet und eine Regelspannung entweder erhöht oder erniedrigt, je nachdem wofür die AGC benötigt wird, entweder
    1. als lineare Spannung aus einem PWM-Ausgang mit einem angeschlossenen RC-Netzwerk (analog), oder
    2. als ein- oder ausgeschalteter Oszillator zur externen Erzeugung einer negativen Spannung (Negativregler).
  2. in einem Durchlauf zu Beginn kann er die Spannung an einem AFC-Ausgang variieren und in jeder Stellung über zwei Sekunden lang beobachten, wie groß die Differenz zwischen dem Maximum und dem Mittelwert der Amplitude ist. Darüber lässt sich der Eingangskreis auf DCF77 einstellen und während des laufenden Betriebs nachjustieren.
  3. er kann die Dauer von niedrigen und hohen Amplituden feststellen und die gesendeten Bits ermitteln, auf Korrektheit hin überprüfen und zu einer kompletten Zeit- und Datumsinformation zusammensetzen (DCF-Dekoder).
  4. er kann schließlich die Zeit- und Datumsinformationen sowie DCF77-Fehlermeldungen und Informationen zu seinem Status an einer seriellen Schnittstelle mit programmierbarer Baudrate entweder synchron oder asynchron ausgeben und an diverse Empfangsgerätschaften senden.
Endlich mal ein Projekt, das die im ATtiny25 vorhandenen Flash-Resourcen und die vielen Interruptvektoren mal weidlich ausnutzt. Nicht immer diese halbleeren Speicher und die vielen RETIs. Daher auch hier die Warnung: versuchen Sie das nicht mit C und anderen Krücken, sie kriegen es nicht in den ATtiny25.

6.0 Index

  1. Hardware des ATtiny25 Controllers
    1. Messung des DCF77-Empfangssignals
    2. Erzeugung und Filterung der AFC-Spannung
    3. Erzeugung und Filterung der Verstärkungs-Regelspannung
    4. Ausgabe der Ergebnisse
  2. Software
    1. Software Download
    2. Software-Überblick
    3. Die AD-Wandlung des Eingangssignals
    4. Die Verstärkungsregelung mit der OCR0B-PWM
    5. Der AFC-Scan zu Beginn
    6. Die AFC im Normalbetrieb
    7. Analysieren des DCF77-Signals
    8. Umwandlung der DCF77-Bits in Datum und Zeit
    9. Aussenden von Status und Ergebnissen
Hinweis: Zu diesem Projekt gehören noch folgende weiterführenden Dokumente:

6.1 Hardware des ATtiny25 Controllers

DCF77-Controller ATtiny25 Das Steuern und Regeln und die Messung des DCF77-Signals erledigt ein achtpoliger ATtiny25. Es geht genauso gut auch ein ATtiny45 oder ATtiny85, wenn Du unbedingt ungenutztes Flash, SRAM und EEPROM verschwenden willst.

Die folgenden Funktionen sind im ATtiny25 realisiert:
  1. die Messung der DCF77-Amplitudensignal-Amplitude am ADC3-Eingang an Pin 2,
  2. die Erzeugung des AFC-Signals am OC0A-Ausgang an Pin 5,
  3. die Erzeugung der AGC-Regelspannung am OC0B-Ausgang an Pin 6 (in zwei Varianten), und
  4. die Erzeugung und Ausgabe der gewünschten Auswertungsinhalte am Pin 3 (Daten) und Pin 7 (je nach Ausgabeart belegt, bei seriellem Synchronsignal ist das der CLOCK-Ausgang, beim asynchronen ist es der CTS-Eingang),
Die einzelnen Hardware-Funktionen sind in den folgenden Unterkapiteln näher beschrieben.

Seitenanfang Index Hardware Software

6.1.1 Messung des DCF77-Empfangssignals

Der ATtiny25-Controller misst den Maximalwert der Signalstärke am Ausgang des OpAmp an seinem ADC3-Eingang. Da das Signal positive und negative Schwingungen um die Mittenspannung herum misst, werden diese "mathematisch" gleichgerichtet, so dass auch unsymmetrische Signalformen noch korrekt gemessen und ausgewertet werden.

Mittels Software werden über 256 Messungen hinweg zwei Parameter bestimmt:
  1. die maximale Amplitude des "gleichgerichteten" Signals, sowie
  2. der Mittelwert der 256 gemessenen Signale.
Der zweite Wert sollte um +2,5V herum liegen (8-Bit-ADC-Wert = 128) und dient im folgenden dem mathematischen "Gleichrichten" des Signals.

Der erste Wert der maximalen Amplitude steuert den AGC-Wert. Je nach gewählter Einstellung gilt dafür folgendes:
  1. Linear: Ist der über 2 Sekunden hinweg gemessene Maximalwert über 2,0V, wird die PWM um Eins erniedrigt, ist er unter 0,5V wird er um Eins erhöht.
  2. Negativ: Ist der über 2 Sekunden hinweg gemessene Maximalwert höher als die voreingestellten 2,0V (positiv = 4,5V, negativ = 0,5V, 8-Bit-Adc-Werte = 230 bzw. 25), dann wird der AGC-Gate-Spannungsgenerator ausgeschaltet. Dadurch nimmt die Gate-Spannung am Regel-FET langsam ab (470 µF und 10 MΩ) und die Amplitude wird niedriger.
Die weitere Auswertung der gemessenen Maximalwerte ist in der Software-Sektion beschrieben.

Seitenanfang Index Hardware Software

6.1.2 Erzeugung und Filterung der AFC-Spannung

Die OC0A PWM fuer die automatische Frequenzkontrolle Die OC0A-PWM erzeugt ein pulsweiten-moduliertes 8-Bit-Rechteck, das mit einem dreistufigen RC-Netzwerk gefiltert wird und daraus die Einstellspannung der drei Kapazitätsdioden liefert.

Die drei Stufen sind nötig, um die PWM-Rechtecke gehörig zu filtern. In der ersten Stufe beträgt das Ripple noch ca. 420 mVpp (siehe das Berechnungsblatt controller_OC0A in der LibreOffice Calc-Datei hier). Schon in der zweiten Filterstufe ist es auf 19 mVpp zurückgegangen, in der finalen dritten Stufe beträgt es weniger ca. 3,6 mVpp. Dieses mV-Ripple variiert die Resonanzfrequenz der LC-Eingangsstufe um ca. 7,2 Hz, schmal genug für den Betrieb und deutlich unterhalb der 256-Stufen-Auflösung der PWM (40 Hz/digit).

Folgeantwort der OC0A-PWM auf Aenderungen Das RC-Netzwerk hat einen weiteren Effekt: es verzögert die Anpassung an einen geänderten PWM-Wert. Die Verzögerung bei einer Änderung um 8 Bitstufen beläuft sich auf ca. 2 Sekunden, wie dieses Diagramm zeigt. Bei Messungen und Vergleichen muss dieser Zeitraum abgewartet werden, bis sich der neue PWM-Wert korrekt abbildet. Änderungen um 8 treten zu Beginn beim Scannen auf, kleinere Änderungen um eine Einheit sind ebenfalls nach ca. zwei Sekunden ganz sicher auf dem Endwert angekommen.

In der Start-Phase des Empfängers wird der OC0A-Wert, beginnend mit 255, in Stufen zu je acht (28 Stufen, entsprechend -0,16 V) abwärts gescanned. Nach dem Warten wird aus dem Mittelwert von 256 Maxima und Signalhöhen über 2,3 Sekunden die Differenz gebildet. Da in 2,3 Sekunden mindestens ein Amplitudenrückgang von DCF77 liegt, ist die durchschnittliche Signalhöhe niedriger als bei anderen störenden Dauersignalen, aus der Differenz kann daher DCF77 aus anderen Störquellen ermittelt werden, indem das Maximum der Differenz aus den Maxima und den Signalhöhen gesucht wird. Der PWM-Wert von OC0A wird auf den Wert eingestellt, bei dem dieses Maximum vorlag. Die Scan-Phase ist dann beendet.

Da in jeder Messphase zunächst 2,3 s lang gewartet wird, bis die PWM eingestellt ist, und da jede Messung über 2,3 s hinweg erfolgt, dauert diese Scan-Phase bei 28 Stufen insgesamt 72,8 s oder etwas über 1 Minute.

Die weitere Fein-Einstellung der Frequenz erfolgt im laufenden Betrieb, indem die OC0A-Werte jeweils um -1 und +1 variiert werden. Mehr über die Scan-Phase und die AFC-Einstellung im laufenden Betrieb ist in der Software-Sektion dieser Seite angegeben.

Seitenanfang Index Hardware Software

6.1.3 Erzeugung und Filterung der Verstärkungs-Regelspannung

Ist in der Software die AGC als analoge Spannung eingestellt, dann verhält sich die dreistufige RC-gefilterte Spannung wie bei der AFC beschrieben. Ist die Option Negativspannung eingestellt für die FET-Regelung der Operationsversträrker, verhält sich die Regelspannung etwas anders.

AGC-Spannungen beim Ein- und Ausschalten des Generators Die Erzeugung der negativen Regelspannung (AGC) für das Gate des FET erfolgt aus dem PWM-Ausgang OC0B des ATtiny25 über eine Spule, zwei Kondensatoren von 470 nF und zwei Germanium- (oder Schottky-) Dioden. Ist der OC0B-Ausgang eingeschaltet oder aktiv, wird er mit ca. 7,8 kHz getaktet. Durch die beiden Dioden und die beiden 470nF-Kondensatoren werden so -4,6 V am zweiten Kondensator erreicht. Das reicht für die Aussteuerung aller möglichen FETs völlig aus. Diese Spannung gelangt über den Ladewiderstand von 10 kΩ auf den Elko von 470 µF. Die Kurve der Aufladung ist recht steil, nach wenigen Sekunden Ladezeit sind -4,0 V erreicht.

Ist der Generator ausgeschaltet, entlädt sich der Elko über den 10 MΩ langsam wieder, die negative Gate-Spannung bewegt sich langsam in Richtung auf 0 V, RDSon wird niedriger und der in die zweite Verstärkerstufe eingespeiste Signalanteil wird niedriger.

Zu Beginn des Betriebs und wenn die Amplitude unter ein Mindestniveau fällt, dann wird der Generator eingeschaltet. Da sich in dieser Phase eine Auswertung der Amplitude nicht lohnt, wird nur die Maximalamplitude beobachtet, die sich aus 256 Messungen der Amplitude ergibt (über ca. 7,8 ms lang). Erreicht diese den Mindestlevel von 1,5 Volt, dann erfolgt die Abschaltung des Generators. Die AGC-Spannung wird dann durch die lange Zeitkonstante (10 MΩ, 470 µF) nur sehr langsam wieder entladen.

Während des normalen Betriebs wird die Maximalamplitude daraufhin überwacht, ob ein Mindestmaß unterschritten wird und der AGC-Spannungsgenerator wieder eingeschaltet werden muss. Damit die sekündliche Amplitudenabsenkung von DCF77 nicht weggeregelt wird, erfolgt das Einschalten des AGC-Gate-Spannungsgenerators und die Erhöhung der Verstärkung bei zu geringer Amplitude nur, wenn der Langzeit-Mittelwert der Amplitude dieses festgelegte Minimum unterschreitet. Die Langzeitmessung umfasst den Mittelwert aus 256 Messungen der Maximalamplitude und überspannt daher mehr als zwei Sekunden Messdauer, so dass mindestens eine Amplitudenabsenkung in die Langzeit-Mittelwertbildung eingeht.

Für die Erzeugung der negativen Gate-Spannung wird nur eine beliebige Rechteckspannung benötigt, eine PWM ist eigentlich dafür überkandidelt und auch nicht sinnvoll (das Impuls/Pausen-Verhältnis hat keinen nennenswerten Einfluss auf die erzeugte Spannung). Da der zweite OC-Ausgang eine PWM benötigt und TC0 daher im PWM-Modus arbeiten muss, wird der OC0B-Ausgang fest mit 50% Pulsweite ausgesteuert.

Mehr Details zu dem Regelungsalgorithmus der AGC-Spannung sind in der Software-Sektion zu finden.

Seitenanfang Index Hardware Software

6.1.4 Ausgabe der Ergebnisse

Die beiden Pins PB2 und PB4 produzieren das Ausgangssignal, abhängig von den Einstellungen im Quellcode der Software.
  1. Ist die Konstante cTxMode Null, dann sind beide Ausgänge dauerhaft auf Low-Potenzial.
  2. Ist der einfachste Modus 1 gewählt, dann folgt Pin 3 (Data) dem DCF77-Signal. Da zur Erkennung des Pegelrückgangs der DCF77-Amplitude softwaremäßig drei Maximalwerte abgewartet werden, beträgt die Verzögerung ca 30 bis 40 ms gegenüber dem Originalsignal. Pin 7 gibt das invertierte Signal aus, so dass auch Schaltungen, die ein invertiertes DCF77-Signal benötigen, direkt an den Controller angeschlossen werden können. Die beiden Pins liefern bis zu 50 mA Strom, so dass direkt Leuchtdioden angeschlossen werden können und, nicht wie bei anderen Empfängern, keine Transistortreiberstufe nötig ist.
  3. Ist synchrone serielle Ausgabe mit cTxMode = 2 ausgewählt, dann werden die Daten und Nachrichten als ASCII-Zeichenketten im seriellen Synchron-Modus übertragen. Dazu werden die Bits, beginnend mit dem niedrigstwertigen, nacheinander auf den Datenausgang an Pin 3 gelegt und mit einem Clock-Signal an Pin 7 an dem Empfänger übergeben. Die Baudrate ist mit der Konstanten cBaud einstellbar.

    Synchronuebertragung der Status- und Ergebnisbits

    Im Bild ist die Übertragung mit 10 kBd, ohne Invertierung, zu sehen. Die drei Phasen der Bit-Übertragung sind etwa alle gleich lang, so dass sich der Empfänger bequem auf alle Bits vorbereiten kann. Jeweils acht Bit stellen ein ASCII-Zeichen dar. Alle Zeichen werden ohne Pausen übertragen, am Ende der Zeile kommt noch ein Wagenrücklauf (0x0D) und ein Zeilenvorschub (0x0A) hinzu.
  4. Im Modus 3 werden die Ergebnisse und Statusmeldungen asynchron übertragen, wie sie für eine RS232-Übertragung benötigt werden.

    Asynchrone Zeichenuebertragung

    Alle Zeichen der Zeile werden mit einem Start- sowie mit zwei Stopbits eingerahmt. Dargestellt ist oben der +/-12V-Pegel auf der RS232-Datenleitung, unten das invertierte Eingangssignal des RS232-Pegelwandlers wie es an Pin 3 des ATtiny25 ausgegeben wird. Der Pegelwandler sieht dann etwa so aus:

    Async RS232-Interface An Steuersignalen wird nur das Clear-To-Send-Signal der empfangenden Schnittstelle ausgewertet: solange diese auf High-Pegel ist, wird gesendet. Die Baudrate ist wieder frei zwischen ca. 45 und ca. 50.000 wählbar. Für die Invertierung sorgt die Konstante cRevert mit dem Inhalt 1, dann klappt es auch mit der Polarität.
Was in den letzten beiden Fällen gesendet wird, kann mit der Konstanten cTxContent eingestellt werden:
  1. Null sendet nix.
  2. Eins sendet minütlich nur die Uhrzeit mit Stunden und Minuten, mit T davor und mit Doppelpunkten getrennt, sowie sowie mit CR/LF danach.
  3. Zwei sendet die Uhrzeit mit T davor, ein M/S/U, dann das Datum mit D davor, dann das Wochentagskürzel mit W davor, sowie danach CR/LF.
  4. Drei sendet zusätzlich zur zweiten Variante noch wichtige Informationen zum Status des Controllers, z. B. den Einstellwert der AFC-PWM mit F davor, den Zustand des AGC-Generators mit G davor, sekündlich die empfangenen Bits mit B davor, Fehlermeldungen bei der minütlichen DCF77-Auswertung (E-Nummern), und noch vieles andere mehr. Die zu sendenden Statusmeldungen sind mittels entsprechender Bits in der Auswahlmaske auswählbar und vorgegeben. Der Quellcode enthält hierzu detailliertere Angaben, wie diese Möglichkeiten eingestellt werden können.
Da sich die Wünsche an die Sendeformate mit der Zeit ändern können, empfehle ich dringend den Einbau des ISP6-Steckers zum Umprogrammieren, damit man nicht jedesmal den ATtiny25 aus der Fassung herausfriemeln muss.

Seitenanfang Index Hardware Software

6.1.5 Serielle Empfangsgerätschaften dazu

Die seriellen Signale sagen erst mal gar nix, solange kein entsprechender Empfänger vorhanden und angeschlossen ist. Wer den PC oder Laptop als Anzeiger verwenden kann/will, baut sich die RS232-Schnittstelle dazu (siehe weiter unten). Wer lieber was Eigenständiges als Anzeige haben will: hier sind drei Möglichkeiten vorgestellt:
  1. ein Empfänger für serielle Synchronsignale mit einem ATtiny24 auf Basis eines Anzeigemoduls mit einer LCD hier,
  2. ein Empfänger für asynchrone Signale mit einem ATmega48 und einer daran angeschlossenen LCD hier, oder
  3. ein Empfänger für asynchrone Signale mit einem ATmega324 und einer riesigen Sieben-Segment-LED-Anzeige für die Uhrzeit hier.
  4. eine Uhr mit einem Empfänger für synchrone serielle Signale mit Quarz und Lautsprecher hier.
Da ist für jeden Geschmack etwas dabei.

4.3 Die Software

4.3.1 Software-Download

Die Software befindet sich noch in der Bearbeitung. $$Hinzufügen$$

Die Größe der Software ergibt sich für die verschiedenen Ausgabearten und Optionen aus der Tabelle.

cTxModeAusgabeartAusgabeoptionenWorte% ATtiny25
0KeineKeine19218,8
1Original-DCF77-Hi/Lo Normal+InvertiertKeine21921,4
2Synchron, normal oder invertiertAlle100398,0
Keine96994,6
3Asynchron, normal oder invertiertAlle99897,4
Keine96494,2


Damit die Software noch in das Flash-Memory eines ATtiny25 passt, habe ich auf größere Schnörkel in der Software verzichtet. Zwischendurch hatte ich LCD-Breiten-angepasste Texte für die serielle Ausgabe vorgesehen. Diese waren dann aber so flash-verschwenderisch, dass es nicht mehr in den tiny25 reingepasst hätte. In dieser Version habe ich daher nur knappe Meldungen vorgesehen, die ausführlichere Darstellung erfolgt dann in der Empfangs-Software.

4.3.2 Software-Überblick

Die Software muss Folgendes erledigen:
  1. Das am ADC3-Eingang ankommende Signal wird regelmäßig vom ADC gemessen und Bei der Mittelwertbildung wird der Roh-ADC-Wert gemittelt und nach 256 Messungen das MSB der Summe im Register rAvg abgelegt. Dieser Wert wird vom ADC-Wert abgezogen. Tritt beim Abziehen das Carry-Flag ein, dann wird der Kehrwert gebildet (mathematisch: Gleichrichtung). Dieser Wert wird mit dem bisherigen Maximum in rMaxM verglichen und, falls er höher ist, als neuer Maximalwert abgelegt. Sind 256 Messwerte eingegangen (nach ca. 7,3 ms) wird der Maximalwert nach rMax kopiert.
  2. Der 8-Bit-Timer TC0, der in seinem A-Kanal das PWM-Signal für die Frequenzeinstellung und in seinem B-Kanal die Ladungspumpe für die negative Verstärkungs-Regelspannung erzeugt, zählt bei Überlaufen einen Zähler abwärts, der ein Zeitbasis-Signal erzeugt. Dieses wird dazu benutzt, um die Dauer der High- und Low-Phasen bei DCF77 festzustellen. Diese Mess-Zeiträume sind auf ca. 10 ms eingestellt, so dass übertragene Nullen ca. 10, Einsen ca. 20 und Minutenpausen 180 bis 190 Zählimpulse ergeben.
  3. Außerhalb der Interrupt-Service-Routinen wird jeweils geprüft, ob der AGC-Generator eingeschaltet ist (bGain = 0). Ist das der Fall und ist der eingestellte Maximalwert der Amplitude in cMaxLevel überschritten, wird dieser Generator abgeschaltet, die Flagge bGain gesetzt sowie die Langzeit-Mittelwert-Bildung neu gestartet.
  4. Aus dem Maximalwert der Amplitude werden jeweils 256 Messungen aufsummiert. Der MSB dieser Summe wird in rLTMax abgelegt. Ist dieser Maximalmittelwert kleiner als der in cMinLevel eingestellte Minimalwert, dann wird der AGC-Generator gestartet und die Flagge bGain gel&aouml;scht.
  5. Die DCF77-Signalerkennung erfolgt dann folgendermaßen:
    1. War der vorherige Zustand eine hohe Amplitude, dann wird geprüft, ob das Kurzzeitmaximum der Amplitude niedriger ist als der Langzeit-Mittelwert. Ist das der Fall, wird der Änderungszähler erhöht. Erreicht dieser Drei, dann liegt der Beginn einer Absenkung vor. Der High-Zähler wird dann auf den Bereich eines Minutenwechsels überprüft. Liegt er in diesem Bereich, wird ein Minutenwechsel durchgeführt.
    2. Lag beim vorherigen Zustand eine niedrige Amplitude vor, dann wird umgekehrt geprüft, ob das Kurzzeitmaximum höher als der Langzeit-Mittelwert liegt. Ist das der Fall, wird der Änderungszähler erhöht und bei Erreichen von Drei erfolgt eine Auswertung auf Nullen und Einsen.
  6. Falls Ausgabe-Optionen gewählt sind, müssen noch die entsprechenden Ausgabe-Operationen folgen. Diese werden dem erzeugten Binärcode optionsabhängig hinzugefügt, do dass der Code nicht mit ungenutztem Zeugs vollgemüllt wird.
Um den optimalen AFC-Ausgang zu ermitteln, werden
  1. zu Beginn ein Scan durchgeführt, und
  2. im laufenden Betrieb Messungen mit einer PWM-Stufe niedriger und höher durchgeführt.
Durchschnitte aus den Amplitudenmaxima Der Scan funktioniert folgendermaßen. Er startet mit der höchstmöglichen OCR0A-Einstellung (255 entspricht +5V entspricht der höchsten Frequenz). Nach einer Wartezeit von 2,3 Sekunden (Einstellzeit des RC-Filters) werden jeweils die Maxima bei allen Kurzzeitmessungen (256 Messungen, ca. 7 ms) für 2,3 Sekunden lang ausgewertet. Einerseits wird der Mittelwert ermittelt, der durch den Einfluss von darin enthaltenen Nullen- und Einsen-Übertragungen etwas niedriger liegt als der Maximalwert über die gesamten 2,3 Sekunden. Andererseits wird das Maximum über den gesamten Zeitraum gebildet. Das Diagramm zeigt den Unterschied über mehr als eine Minute lang an. Manche Durchschnitte liegen etwas niedriger, weil zufällig zwei übertragene Bits in diesem Zeitraum auftraten.

Der OCR0A-Wert wird dann jeweils um acht erniedrigt und diesselbe Warte- und Messzeit ausgeführt. Ist die Differenz aus dem Maximalwert und dem gemittelten Maximum höher, wird der Differenzwert sowie der zugehörige OCR0A-Wert gespeichert. Ist der OCR0A-Wert kleiner als 39, dann ist der Scan beendet und der ermittelte OCR0A-Wert wird in den Vergleicher des TC0 geschrieben. Weiter unten ist das Flussdiagramm des Algorithmus im Detail abgebildet.

Im laufenden Betrieb erfolgt die Messung folgendermaßen. Nach der Langzeit-Messung wird der OC0A-Wert um Eins angesenkt und nach einer Wartezeit von 2,3 s die Differenz aus den Langzeit-Maxima und dem gemittelten Langzeit-Mittelwert ermittelt. Danach wird der OC0A-Wert um Zwei erhöht und nach einer weiteren Wartezeit diese Differenz gemessen. Der OC0A-Wert wird auf denjenigen Wert eingestellt, bei dem die Differenz am größten war.
Seitenanfang Index Hardware Software

4.3.3 Die AD-Wandlung des Eingangssignals

Flussdiagramm der ADC-Messungen Die AD-Wandlung erfolgt im Freilauf-Modus (automatischer Neustart des Wandlers nach Lesen des Ergebnisses). Da der AD-Wandler das Maximum der 77,5-kHz-Wellenzüge erkennen muss, erfolgt die Wandlung relativ schnell (Vorteiler = 4) und das Abholen und der erste Teil der Verarbeitung erfolgt unmittelbar im ADC-Interrupt.

Das Timing ist im Rechenblatt controller_ADC der LibreOffice Calc-Datei hier näher angegeben. Die Maximalwert-Erkennung wertet 256 Werte aus. Da die nächste Wandlung erst dann angestoßen wird, wenn das Ergebnis der letzten Wandlung abgeholt worden ist, beträgt die Dauer pro Wandlung 14,25 Taktzyklen. Der AD-Wandler arbeitet daher mit 35,1 kHz und tastet das Eingangssignal von 77,5 kHz ca. 0,45-mal pro Sinuswelle ab. Die Sammlung von 256 Ergebnissen dauert etwa 7,3 ms.

Um Umrechnungen zu vermeiden, erfolgt die Maximalwertermittlung und die Mittelwertbildung der Eingangssignalamplituden mit einem separaten Zähler bis 256. Dadurch kann einfach das MSB der Summe als 8-Bit-Mittelwert gebildet werden.

Da für die gesamte Erkennung und Mittelwertbildung nur 8-Bit-AD-Werte herangezogen werden, wird beim Start des ADC das ADLAR-Bit gesetzt, nur das MSB des Ergebnisses wird abgeholt und weiterverarbeitet.

Die Erkennung des Maximums und die Bildung des Mittelwerts der Amplitude erfolgen innerhalb der abgebildeten Interrupt-Serrvice-Routine. Diese braucht dafür minimal 27 und maximal 30 Taktzyklen. Damit dies innerhalb der verfügbaren Dauer möglich ist und es nicht zu Verzögerungen beim Abholen des AD-Ergebnisses kommt, wird der Prozessortakt auf 2 MHz umgestellt (mit CLKPR). Bei 2 MHz und der gewählten Taktrate bleiben ausreichend Taktzyklen für die Interrupt-Service-Routine (und für alle anderen Aufgaben zwischendurch). Bei 1 MHz Takt käme es zu Konflikten, da dann das nächste ADC-Ergebnis schon vorläge, wenn die ISR noch gar nicht fertig abgearbeitet ist. Selbiges wäre auch der Fall, wenn durch die serielle Ausgabe von Status- und Ergebnismeldungen längere Wartezeiten vorlägen. Dies würde zu einer Absenkung der Abtastrate und zur Verlängerung des Mittelungszeitraums führen. Da dieser Zeitraum bei 2 MHz aber genügend Pufferzeit aufweist, sind solche geringfügige Verzögerungen kein Problem.

ADC-Messungen Um herauszufinden, wie groß die Messwert-Unterschiede der Maximumerkennung zu erwarten sind, habe ich im Rechenblatt controller_maxdetection in der LibreOffice Calc-Datei hier eine Simulation gemacht. Darin sind 256 Messungen in 7,3 ms simuliert, bei normaler und bei abgesenkter Amplitude. Die Amplitude wurde dabei mit 20% Zufalls-Zittern modelliert.

Wie man an den simulierten Werten erkennt, ist die Trefferquote beim Maximum und beim Signaldurchschnitt überwältigend gut. Einen Ausschnitt der ersten 0,4 ms zeigt die Abbildung.

Seitenanfang Index Hardware Software

4.3.4 OC0A- und OC0B-Einstellung: Der AFC-Scan zu Beginn

Flussdiagramm der Scan-Phase Dies zeigt den Scan-Vorgang, der zu Beginn des Betriebs außerhalb der ADC-Interrupt-Routine ausgeführt wird. Der Vorgang wird alle ca. 9 ms vom TC0-Interrupt angestossen, wenn dessen Zähler abgelaufen ist. Dies stellt sicher, dass eine feste und verlässliche Zeitbasis vorliegt, die unabhängig von den ADC-Ereignissen ist.

Zu Beginn, wenn der 470 µF-Kondensator noch nicht aufgeladen ist, ist der Verstärker noch mit einer Verstärkung von ca. 100 unterwegs, das DCF77-Signal verursacht noch keine ADC-Werte. Es wird daher der Gate-Spannungs-Generator eingeschaltet. Erst wenn die Verstärkung soweit angestiegen ist, dass der eingestellte Maximal-Level der Amplitude erreicht wird, wird der Generator wieder abgeschaltet und die weitere Signalverfolgung nimmt ihren Lauf.

Durch Aufsummierung von 256 abgeholten Kurzzeit-Maximalwerten der Amplitude sowie durch Feststellung der Maximalamplitude über den gesamten Zeitraum von 2,3 ms werden die entsprechenden Größen ermittelt. Liegen diese 256 Werte vor, dann wird überprüft, ob die Mindest-Aussteuerung des Verstärkers unterschritten wird. Ist dies der Fall, dann wird erneut der Generator in Gang gesetzt, um die Verstärkung zu erhöhen.

Wenn die 256 Werte mit ausreichend Amplitude vorliegen, werden diese Langzeit-Werte in entsprechende Register abgelegt. Wenn der Scan-Vorgang abgeschlossen ist, wird mit dem Maximalwert die DCF77-Signalerkennung durchgeführt (siehe weiter unten).

Zu Beginn muss herausgefunden werden, auf welcher Frequenzeinstellung des AFC-Signals sich DCF77 befindet. Das erfolgt in einer Scan-Phase.

Weil sich im Einstellbereich des AFC-Bereichs zwischen 70 und 80 kHz auch noch andere Sender tummeln können, wie z. B.
  1. Zu allererst: die fünfte Harmonische der 15.625 kHz-PWM liegt bei 78.125 kHz und vom Nutzsignal nur 625 Hz weg, daher müssen die Verbindungen der PWM vor dem RC-Filter bzw. Gleichrichter kurz gehalten und die Antenne möglichst weit weg vom PWM-Controller montiert werden.
  2. An meinem Standort hier südlich von Frankfurt gibt es einen starken Störer bei 80 kHz, von dem ich nicht weiß, woher der stammt.
  3. Meine Energiesparlampe sendet bei 70 kHz.
Es reicht daher nicht aus, nur das Maximum der Empfangsstärke heranzuziehen, denn die AFC würde sich dann auf dieses Störsignal einstellen und würde DCF77 verpassen. Zur4 Erkennung von DCF77 wird daher beim Scan (und später auch bei der AFC-Feineinstellung) der Amplitudenrückgang von DCF77 herangezogen. Beim Langzeit-Mittelwert ziehen die Amplitudenrückgänge den Durchschnittswert um 10 bis 20% nach unten. Es muss also die Differenz aus den Mittelwerten der Langzeit-Maximalamplitude mit dem Mittelwert der Signalstärke verglichen werden und dasjenige Signal herangezogen werden, bei dem diese Differenz am größten ist.

Zu Beginn startet die AFC-PWM mit 255 (= 5 V) und in einem längeren Durchlauf wird dieser Wert jeweils um 8 bis herunter auf 39 verringert (39/256*5 = 0,762 V). Bei jeder Verringerung um 8 wird eine Wartezeit eingefügt, bis sich das RC-Filternetzwerk der PWM auf den neuen Wert eingestellt hat. Die nötige Wartezeit wurde mittels Simulation in der Abbildung hier bestimmt. Im Beispielfall wurde der Scan-Wert 128 kurz nach 0,5 Sekunden um 8 abgesenkt (auf 2,1875 V). Wie das Diagramm zeigt, braucht es 1,5 Sekunden, bis sich die Spannung dem neuen Sollwert nähert, nach weiteren 0,5 Sekunden ist der neue Sollwert erreicht. Es ist daher angebracht, etwas länger als zwei Sekunden zu warten, bis die AFC-Spannung stabil ist.

Während der Scan-Phase, die 27 Schritte umfasst, sollten folgende Bedingungen eingehalten werden: Ist der Scan noch aktiv, dann wird jeweils das Ende eines 2,3-Sekunden-Intervalls abgewartet, bevor weiter analysiert wird. Der erste Durchgang wird dabei verworfen, um die Zeit für die Filtereinstellung abzuwarten. Erst bei gesetzter bWait-Flagge wird der Langzeit-Mittelwert in rLTMax von dem Langzeit-Maximalwert in rLTMaxM abgezogen. Ist dieser Wert größer als der bisherige, wird er gespeichert.

Dann wird der OCR0A-Wert um acht verringert und in das PWM-Vergleichsregister geschrieben. Unterschreitet der OCR0A-Wert den Wert 39 (entspricht 0,76 V), dann ist der Scan beendet und der ermittelte Bestwert wird in das Portregister OCR0A geschrieben.

Danach wird im normalen Betrieb die Feineinstellung des AFC-Wertes vorgenommen (siehe das nächste Kapitel).

Seitenanfang Index Hardware Software

4.3.5 Die AFC im Normalbetrieb

Nachdem der Grobscan absolviert ist, wird die AFC-Spannung feinjustiert. Dazu wird laufend der folgende Algorithmus verwendet:
  1. Die Langzeit-Differenz zwischen den über 2,3 Sekunden gemittelten Maxima und dem Langzeitmaximum wird für den aktuellen Zustand ermittelt und im SRAM zwischengespeichert.
  2. Der aktuelle OCR0A-Wert wird um Eins abgesenkt und nach einer Wartezeit von weiteren 2,3 Sekunden und nach einer Messzeit von 2,3 Sekunden wird erneut dieser Differenzwert ermittelt und gespeichert.
  3. Dann wird der OCR0A-Wert um zwei erhöht und erneut gewartet, gemessen und gespeichert.
Das Maximum der drei gespeicherten Werte wird ermittelt und das OCR0A-Portregister auf diesen Wert gesetzt.

Seitenanfang Index Hardware Software

4.4 Analyse des DCF77-Signals

Flussdiagramm der DCF77-Erkennung Dies ist das Flussdiagramm der DCF77-Signalauswertung. Dargestellt ist nur die Erkennung von Nullen, Einsen und Minutenwechseln.

Es beginnt damit, dass der Langzeit-Maximalwert über 2,3 Sekunden halbiert wird. Dieser Wert dient dazu, Nullen/Einsen und Pausen zu identifizieren.

Die weitere Verarbeitung erfolgt abhängig davon, ob zuletzt eine aktive Amplitudenabsenkung (bHi = 0) erkannt wurde oder eine Pause (bHi = 1). War es eine Amplitudenabsenkung (linker Teil des Diagramms), dann wird das Register rLoCnt erhöht und geprüft, ob das aktuelle Kurzzeit-Maximum oberhalb des halben Langzeit-Maximums liegt. Ist das nicht der Fall, wird rCnt auf drei gesetzt und weiter gewartet.

War das der Fall, wird rCnt erniedrigt. Ist es danach Null, dann liegt ein Wechsel von Low nach High vor. In diesem Fall wird auf die High-Erkennung umgeschaltet (bHi wird Eins und die Zähler drei).

Nun wird geprüft, wie lange das Low-Signal gedauert hat. Ist der Zähler niedriger als das Minimum für eine DCF77-Null (default: 8), dann liegt der DCF-Fehler 1 vor, der bei eingeschalteter Sync- oder Async-Übertragung berichtet wird.

Ist dann der Zähler dann auch noch kleiner als das Maximum für eine Null, dann liegt eine Null vor. In diesem Fall wird das Carry-Flag gelöscht und das Null-Bit von hinten her in den Bitspeicher eingeschoben (mit acht Schiebeoperationen). Schließlich wird der Bitzähler noch um Eins erhöht.

Handelte es sich nicht um eine Null, dann wird geprüft, ob es sich um eine Eins handelt (größer als oder gleich cDcf1Min und kleiner als cDcf1Max). Ist das der Fall wird eine Eins in den Bitspeicher eingeschoben.

Für den Fall, dass die Amplitude nicht abgesenkt war (bHi = 1, rechter Teil des Flussdiagramms) wird ähnlich vorgegangen. Auch hier wird gezählt und auf drei aufeinanderfolgende Phasen auf absinkende Amplitude gewartet. Liegt diese vor, dann wird überprüft, ob es sich um eine normale Pause wie nach einem Null- oder Eins-Bit handelte oder ob ein Minutenwechsel vorliegt. Unter- und Überschreitungen des Zählers werden wieder mit entsprechenden Fehlermeldungen quittiert.

Pruefung und Umwandlung der DCF-Bits in ASCII Sind alle Überprüfungen korrekt, dann wird gecheckt, ob die Anzahl empfangener Bits 59 ist. Fall nicht, gibt es wieder eine Fehlermeldung.

Das Lesen aller DCF-Bits aus dem SRAM erfolgt mit LDD r,Y+Konstante), wobei Y stets auf den Anfang des SRAM-Puffers sDcf zeigt. Die Konstanten dByteN zeigen dabei auf das jeweilige Byte des Bit-Schieberegisters (siehe nächstes Kapitel).

Dann erfolgt die Überprüfung, ob die Paritätsbits für die Minuten und die Stunden sowie das Paritätsbit des Datums korrekt sind. Fehler bei der Parität werden mit entsprechenden Fehlermeldungen quittiert. Sind die Paritäten in Ordnung, werden nacheinander alle DCF-Bits gelesen (Minuten, Stunden, Tag, Monat, Jahr), auf Korrektheit überprüft, d.h. Sind alle Überprüfungen korrekt, werden die binären DCF-Bits in ASCII umgewandelt (durch Addieren von ASCII-Null) und in den entsprechenden Positionen im sDcf-Puffer abgelegt. Da einige der Positionen sprachabhängig sind, werden dazu ebenfalls entsprechende Distanzen in Konstanten verwendet (z. B. dStrMoO für die Monats-Einer). Die sprachabhängige Definition der Konstanten sorgt dafür, dass die korrekte Position für die Ablage der ASCII-Zeichen eingehalten wird, ohne den Code mit allzu vielen .IF-Direktiven zu beladen.

Sind alle ASCII-Zeichen eingefüllt, erfolgt bei Bedarf die Umwandlung dieser Zeit- und Datums-Information in UTC. Dazu kommt das Flussdiagramm weiter unten im Text zur Anwendung.

Das Ergebnis wird dann in den Ergebnispuffer kopiert und, falls so gewählt, in den Sendepuffer kopiert und die Aussendung gestartet.
Im Folgenden noch einige Spezialteile der Umwandlung von DCF-Bits in Datum/Zeit.

4.4.1 Die DCF77-Datenbits

DCF77-Bits-Aufbau Dies ist die Lage aller 59 Bits, wie sie sich nach dem Rechtsschieben der empfangenen Bits ergibt.

Dazu folgende Anmerkungen:

Struktur der SRAM-Tabelle Beim Programmieren solcher ellenlanger Records (Records = zusammenhängende Daten) ist die Möglichkeit der AVR, mit den Registern Y und Z mit LDD und STD ein temporäres Displacement anzulegen, sehr hilfreich. Ich habe daher folgenden Aufbau der Daten gewählt. In den Fällen, in denen die englische Fassung von der deutschen abweicht, sind die betreffenden Elemente in Klammern angegeben.

Die SRAM-Tabelle ist folglich sehr systematisch aufgebaut, um eine leichte und nachvollziehbare Programmieraufgabe zu erhalten. Wer den Wochentag lieber an eine andere Position legen will, ändert einfach diese Positionszahlen, schon sieht der "Record" etwas anders aus.

In der Spalte Displ ist das Displacement angegeben, um mit LDD und STD auf diese Zelle zugreifen zu können. So gibt LDD R16,Y+dStrT den Inhalt der Tabelle an der Position dStrT im Register R16 zurück.

Die Riesenvorteile dieser Zugriffsart sind:

4.3.6.2 Überprüfung der Parität

Flussdiagramm Paritaetscheck-Algoritmus Die ist der hier verwendete Paritätschecker. Er frisst Bytes in Register rmp und schiebt diese solange rechts, bis keine Einsen mehr enthalten sind. Für jede Eins, die beim Rechtsschieben in das Carry herausrollt, wird die Parität von T im SREG-Register umgedreht. Damit die Routine sowohl mit Einzelregistern als auch mit mehreren Registern funktioniert, wird beim ersten Aufruf die T-Flagge mit CLT gelöscht. Weitere Aufrufe mit weiteren Registern rufen ParN auf, was den Stand der T-Flagge aus dem vorherigen Aufruf weiter verwendet.

Am Ende der Aufruferei muss T bei DCF77-Eingangsdaten Null sein.

Seitenanfang Index Hardware Software

4.3.6.3 Umwandlung der DCF77-Bits in Datum und Zeit

Das ist nun nicht mehr so kompliziert. Im günstigsten Falle nimmt man ein Byte aus dem SRAM, schiebt es ein wenig nach rechts, löscht die nicht benötigten oberen Bits, addiert eine ASCII-Null und schreibt das Ergebnis in die richtige Stelle im SRAM.

In komplizierteren Fällen muss noch ein zweites Byte geladen und das, oder die, oberen Bits des zweiten Bytes über das Carry in das erste Bit nach links eingeschoben werden.

Die DCF77-Bit-Tabelle oben ist dazu sehr hilfreich.

Um das ganze Lesen, Schieben und Kopieren optimaler zu gestalten, habe ich den einzelnen Positionen im SRAM Distanzen zugeordnet, deren Namen mit "d" beginnen. Damit kann mit LD rmp,Y+dConst und ST Y+dConst,rmp auf jede Position im Ensemble zugegriffen werden. Diese Konstanten können auch einfach verändert werden, um ein anderes Zeit- und Datumsformat neben EN und DE zu realisieren.

Seitenanfang Index Hardware Software

4.3.6.4 Umwandlung in UTC-Zeit

Das ist eigentlich eine ganz einfache Aufgabe: je nachdem ob das DCF-Bit MESZ Eins oder Null ist, wird von der Stunde zwei oder eins abgezogen. Nur: wenn dabei die ASCII-Null unterschritten wird, wird es komplizierter, denn dann muss das Datum um einen Tag und der Wochentag um eins zurückgesetzt werden. Ist dann auch noch gerade der Erste des Monats, dann muss die Anzahl Tage des Monats ermittelt werden und es müssen auch noch die Monate um eins verringert werden. Ist dann noch gerade Januar, dann ist sogar das Jahr noch dran. Das macht das Ganze etwas aufwändiger. Dafür ist es korrekter als nur die Stunden abzuziehen.

Flussdiagramm der UTC-Umwandlung

Seitenanfang Index Hardware Software

4.3.7 Serielles Senden von Status und Ergebnissen

Die Signalaussendung verwendet TC1 als Baudraten-Generator und für das nötige Timing. Da der 8-Bit-TC1 im ATtiny25 Prescaler-Werte zwischen 1 und 16.384 in Zweierpotenzen einstellen kann und im CTC-Betrieb durch 1 bis 256 geteilt werden kann, kann nahezu jede beliebige Baudrate eingestellt werden. Baudraten oberhalb von 50.000 werden durch die Ganzzahlen-Mathematik zunehmend ungenauer, aber wer braucht das schon unbedingt so schnell. Die Ungenauigkeit kann in der Symboltabelle, die gavrasm und avr_sim im Listing produzieren, in den beiden Konstanten cBaudEff (effektive Baudrate) und cBaudDiff in 0,01%-Auflösung abgelesen werden. Bei 9k6 async liegt die echte Baudrate bei 9.615 Bd, was um 0.16% zu hoch liegt. So was Kleines kümmert aber keine RS232-Schnittstelle.

Während des Betriebs sammeln sich Status- und Ergebnismeldungen an, die auf Wunsch ebenfalls zu senden sind. Diese werden in einem SRAM-Sendepuffer gesammelt, der von sBuf bis sBufEnd reicht. Ist die Zeile komplett, werden Wagenrücklauf- und Zeilenvorschub-Zeichen sowie eine ASCII-Null angefügt, der den Sendeprozess beendet.

Sendeformate Sync/Async Ist ein Minuten-Datenset vom DCF77-Empfänger eingegangen und sind alle Überprüfungen erfolgreich absolviert, dann wird dieser Datensatz über die serielle Schnittstelle gesendet. Er beginnt mit einem T, danach kommt die Uhrzeit (mit Sekunden = 0). Danach wird die Zeitbasis mit den Buchstaben M für MEZ, S für MESZ oder U für UTC angegeben. Hinter dem folgenden D kommt dann das Datum (hier im Format cEN = 0). Darauf kommt nach einem W das zweistellige Kürzel des Wochentags (hier ebenfalls mit cEN = 0).

Wer auf seiner LCD Platz hat (16 oder 20 Zeichen pro Zeile) kann alle empfangenen Zeichen dekodieren und etwas ausführlichere Versionen ausgeben. So kann man statt "S" Sommerzeit ausschreiben, statt "M" MEZ oder statt "U" auch UTC. Oder man erweitert den Wochentag "Mi" zu Mittwoch. In der ersten Version dieser Software hatte ich dies vorgesehen, habe es aber in dieser Version wieder entfernt, weil die ausführlichen Texte nicht mehr in das Flash eines ATtiny25 gepasst haben. Da die Software des Empfangsgeräts in einem ATtiny24, ATmega44 oder gar ATmega324 mehr Platz hat, kann das die Software dort erledigen. Außerdem mag nicht jeder so eine übermäßig geschwätzige Software und das Senden geht auch schneller, braucht weniger Zeit und beschäftigt den sowieso schon von der AM-Gleichrichtung heftig ausgelasteten ATtiny25 auch nicht so arg lange mit der Ausgabe von Sendesignalen.

E-Meldungen Ist die Option cEM in der Konstanten cTxContent auf Eins gesetzt, dann werden alle Fehler- und die Erfolgsmeldung(en) des DCF77-Empfängers auf der seriellen Schnittstelle ausgegeben. Dabei gelten die nebenstehenden Bedeutungen der 26 Error-Codes.

Ist die Konstante cSM in der Konstanten cTxContent auf Eins gesetzt, werden auch Statusmeldungen des Empfängers ausgegeben. Diese beginnen mit einem S. Solche Statusmeldungen können sein: Alle Statusmeldungen bestehen einheitlich aus acht Zeichen, jeweils gefolgt von einem Wagenrücklauf und einem Zeilenvorschub. Im Sendepuffer werden diese mit einem Nullbyte abgeschlossen, das das Senden terminiert.

Ist der Sendepuffer mit T, E oder S-Meldungen fertig zum Senden präpariert,
  1. zeigt der Sendezeiger X auf den Pufferanfang,
  2. im synchronen Fall wird rTxCnt auf Zwei gesetzt,
  3. eine Eins wird in den Bitzähler rTxBit geschrieben, damit das nächste Zeichen aus dem Puffer geholt wird,
  4. die Flagge bTx im Flaggenregister rFlag wird gesetzt,
  5. der Zähler TCNT1 wird mit Null überschrieben, und
  6. das Interrupt-Masken-Bit OCIE1A des Zählers wird gesetzt und damit die Interrupts eingeschaltet.
Der gesamte Sendevorgang läuft dann in der Interrupt-Service-Routine ab, die es in zwei Versionen im Quellcode gibt:
  1. mit cTxMode=2 wird die Synchron-Variante aktiviert, mit
  2. 3 wird die Async-Variante eingebracht.
In beiden Modi kann mit der Konstanten cReverse=1 die Polarität der beiden Ausgabepins invertiert werden.

Da sich Async- und Sync-Methode erheblich unterscheiden, werden diese nachfolgend separat im Detail dargestellt.

4.3.7.1 Serielles Senden im Sync-Modus

Serial sync Flussdiagramm Das Flussdiagramm zeigt die Interrupt-Ausführung beim TC1 Compare Match Interrupt. Die roten Zahlen stellen die Anzahl Taktzyklen bei jeder Instruktion dar.

Ist synchrones Senden eingestellt, erfolgt der Interrupt drei mal häufiger als im asynchronen Modus, denn für die Übertragung jedes Bits werden drei Phasen benötigt. Diese werden in dem Phasenzähler rTxCnt verwaltet. Die Phasen 1 und 0 aktivieren und deaktivieren den CLOCK-Ausgangs-Pin PB2. Die Phase 2, in der die Bits auf den DATA-Ausgangs-Pin PB4 gelangen (unterer Teil des Flussdiagramm) erniedrigt zunächst den Bitzähler in rTxBit. Wenn dieser Null erreicht, wird das nächste ASCII-Zeichen aus dem SRAM-Puffer geholt. Ist dies eine ASCII-Null, wird das Senden beendet, die Sendeflagge bTx gelöscht, der Datenausgang auf Null gebracht und die TC1-Interrupts abgeschaltet. Wenn nicht, wird das erste Bit rechts herausgeschoben und der Ausgang damit gesetzt oder gelöscht.

Alle Verläufe benötigen weniger als 32 Taktzyklen. Daher werden die Takte der ADC-Messung nur in Einzelfällen etwas verzögert, aber nur kurz blockiert. Nur bei hohen Baudraten über 60kBd blockiert der Sendevorgang den ATtiny25 und keine anderen Interrupts werden mehr ausgeführt. Der Quellcode lässt keine höheren Baudraten als 31 kBd zu.

Wenn cTxContent die Ausgabe des kurzen Zeitformats auswählt, benötigt die Senderoutine bei 10 kBd dafür ca. 8.8 ms. Beim Langformat sind es 18 ms. Da beides nur einmal pro Minute auftritt, ist es nicht relevant.

Seriell Sync-Ausgabe AA mit 10 kBd Dies zeigt die Sendung von hexadezimal 0xAA (=1010.1010) über die Data- und Clock-Pins i Sync-Modus.


Seitenanfang Index Hardware Software

4.3.7.2 Serielles Senden im Async-Modus

Flussdigramm Seriell Async Senden Das Flussdiagramm zeigt die Interrupt-Ausführung im Async-Sende-Modus.

Wenn die asynchrone Sendung ausgewählt ist, bedeutet jeder Interrupt ein Bit. Pro Zeichen werden zu den 8 Zeichen-Bits ein Start-Bit und zwei Stopbits zusätzlich ausgesendet. Die Baudrate entspricht daher 8/11 der Zeichengschwindigkeit.

Die Interrupt-Service-Routine beginnt mit der Verminderung der Anzahl Bits in rTxBit. Erreicht der Bitzähler Null, wird das nächste Zeichen aus dem Puffer in rTx geholt. Ist dies eine ASCII-Null, ist das Senden beendet und die Interrupts werden ausgeschaltet. Ist es keine Null, wird das Startbit gesendet (bei cRevert = 0 ist das Startbit high, bei 1 ist es low). Bei den nachfolgenden Interrupts werden zwei Stopbits ausgegeben, wenn die Anzahl Bits unter drei liegt. Bei allen anderen Bitzahlen wird ein Bit nach rechts in das Carry herausgeschoben und PB4 entsprechend gesetzt.

Alle Verzweigungen benötigen maximal 27 Takte. Die Maximalgeschwindigkeit, bei der alle anderen Interrupts blockiert werden, beträgt 74,1 kBd. Berechnet man die echte Zeit, die das Startbit, die acht Datenbits und die beiden Stopbits benötigen, dann sind knapp 95 kBd Blockade-Baudrate möglich. Die Baudrate ist daher softwareseitig auf 47 kBd begrenzt.

Die Minimal-Baudrate liegt bei unter 45 Bd, niedrig genug, um auf Kurzwelle im 80- oder 40-m-Band mit 45,45 Bd einen DCF77-Datum/Uhrzeuit/Wochentag-Sender über Radio-Teletype (RTTY) aufzusetzen.

Bei 9k6 dauert das Langformat 25 ms, das Kurzformat 12,6 ms, welches über cTxContent ausgewählt werden kann.

Die beiden Simulationsdiagramme zeigen das Zeichen 0xAA im Async-Modus, rechts im invertierten Ausgabeformat wie es in einen MAX232 eingespeist werden kann.

Async Seriell-Ausgabe AA mit 9,6 kBd Async Seriell-Ausgabe AA mit 9.6 kBd, invertiert


Seitenanfang Index Hardware Software

$$$ Da der ATtiny25 mit der reinen Verstärkungsregelung massiv unterfordert wäre, macht er auch gleich noch Auch die Umwandlung der Mittel-Europäischen (Sommer-)Zeit in UTC ist bei den ASCII-Text-Formaten per Software einstellbar. Dabei wird nicht nur die Uhrzeit, sondern auch das Datum korrekt umgewandelt.

Dieser Empfänger ist also ein vielseitiges Instrument: er kann
  1. als AFC- und AGC-Regler für den geregelten Empfänger fungieren, die Software tut dann nichts anderes als dies,

    DCF77 Mode 0

    das verstärkte und geregelte hochfrequente DCF77-Signal kann am Verstärkerausgang für eigene Zwecke abgegriffen werden,
  2. als NUR-Empfänger konfiguriert werden und empfangsschwächere Empfänger ersetzen,

    DCF77 Mode 1

    in diesem Fall gibt der ATtiny25 nur das Amplitudensignal von DCF77 normal und invertiert aus, die Dekodierung und Anzeige muss dann mit einer weiteren Mimik erfolgen,
  3. es kann aber auch als DCF77-Empfänger und -Dekoder konfiguriert werden und sendet dann
Ist die letztgenannte Betriebsart gewählt, können die Asynchron-Signale aber auch mit einem weiteren Controller empfangen, ausgewertet und auf einer LCD angezeigt werden.

Ergo: die eierlegende Wollmilchsau für DCF77. Der Programmcode ist entsprechend vielseitig ausgelegt und jeder kann sich das, was er braucht, mit ein paar wenigen Änderungen von einigen Konstanten zusammenklöppeln. Folglich strotzt der Quellcode nur so von .IF-Direktiven und hat nur noch knapp in einem ATtiny25-Memory Platz. $$$

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