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

4 DCF77 Geradeausempfänger mit geregeltem Operationsverstärker und ATtiny25

Geradeaus-Empfänger für DCF77 benötigen eine Verstärkungsregelung. Die Gründe dafür sind:
  1. die Information im DCF77-Signal ist in der Amplitudenhöhe kodiert, die Verstärkung darf also nicht so hoch werden, dass die Amplitudenbegrenzung einsetzt (Clipping),
  2. zu hohe Verstärkung führt zur Oszillation, weil das Ausgangssignal in den Eingang zurückgeführt wird und die Schaltung schwingt. Da man für den Empfang Verstärkungen von 5.000 und mehr benötigt, lösen schon sehr geringe Rückstrahlungen Schwingungen aus.
Bei dem Konzept hier werden folgende Komponenten verwendet: 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.

Dieser Empfänger ist also ein vielseitiges Instrument: es kann als NUR-Empfänger konfiguriert werden und empfangsschwächere Empfänger ersetzen, es kann aber auch als DCF77-Empfänger und -Dekoder konfiguriert werden und sendet dann auf Wunsch nur die Zeit oder Zeit, Datum und Wochentag sowie Statusmeldungen über seine zwei möglichen seriellen Schnittstellenarten. Die Synchron-Signale können mit einem Controller ausgewertet und auf einer LCD angezeigt werden. Die Asynchron-Signale können direkt über eine RS232-Schnittstelle an einen PC oder Laptop gesendet und in einem Terminalprogramm 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.

4.0 Index

  1. Hardware des Empfängers und Verstärkers
    1. Schaltbild der Hardware
    2. Wie der Empfangskreis funktioniert
    3. Wie der geregelte OpAmp-Verstärker arbeitet
    4. Serielle Empfangsgerätschaften dafür
  2. 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
  3. 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
  4. Anzeigeteil mit ATtiny24 und einer LCD
Hinweis: Zu diesem Projekt gehören noch folgende weiterführenden Dokumente:

4.1 Hardware des regulierten OpAmp-Empfängers

Hier wird die Hardware des Empfängers ausführlich beschrieben und erläutert. Der ATtiny25 produziert seine Ergebnisse auf Wunsch an einer seriellen Schnittstelle. Für den Empfang dieser seriellen Signale und deren Anzeige wurden drei Konepte entwickelt:
  1. ein serieller Synchron-Empfänger mit einer LCD und einem ATtiny24,
  2. ein serieller Asynchron-Empfänger mit einer LCD und einem ATmega48,
  3. ein serieller Asynchron-Empfänger für eine Großuhr mit LEDs und einem ATmega324.
Wer alles in einem einigen Controller haben will, kann sich mit diesem Konzept bedienen und braucht sich um serielle Schnittstellen nicht kümmern: Alles in einem Mega324.

4.1.1 Schaltbild der Hardware

Schaltbild des regulierten OpAmp-Empfaengers Das ist schon alles:

Seitenanfang Index Hardware Software

4.1.2 Wie der Eingangskreis funktioniert

1 mH Ferritspule Die 1 mH-Ferritspule wurde aus einem 10 cm langen Ferritstab gebaut. Dieser wurde mit zwei bis drei Lagen Isolierband bewickelt und darauf eine Spule mit 0,25-mm-Kupferlackdraht angebracht. Um zu ermitteln, wieviele Windingen für 1 mH nötig sind, habe ich die Induktivität nach 100, 130 und 160 Windungen gemessen. Aus diesen Messungen habe ich den AL-Wert pro Windung2 bestimmt.

WindungenInduktivität [mH]AL [nH per w2]
1000,4039,72
1300,7544,56
1601,0540,88


Der AL-Wert ist demnach ungefähr 41 nH/Windung2. Für eine 2 mH-Spule wären daher 220 Windungen nötig gewesen.

Der Ohm'sche Widerstand der 160 Windungen beträgt 5.6 Ω, die induktive Reaktanz bei 77,5 kHz liegt bei 510 Ω. Die erforderliche Kapazität C für 77,5 kHz Resonanzfrequenz liegt bei 4,03 nF. Da es entsprechende Styroflexkondensatoren nicht zu kaufen gibt, habe ich einen Kondensator mit 3,3 nF und einen mit 330 pF kombiniert. Den Rest zum Sollwert verteilt sich auf die drei Kapazitätsdioden.

Der Parallelresonanz-Widerstand von L und C liegt bei 50 kΩ und höher. Daher kommen Transistorstufen niedriger Eingangsimpedanz oder transistorisierte Operationsverstärker wie der 741 nicht infrage, es muss schon ein FET-OpAmp sein.

Seitenanfang Index Hardware Software

4.1.3 Wie der regulierte Operationsverstärker funktioniert

Operationsverstärker mit fester Verstärkung Operationsverstärker mit variabler Verstärkung In dem ursprünglichen Konzept sollte der Widerstand R1 einer linearen Verstärkerstufe durch einen FET ersetzt werden. Dessen Gate-Spannung variiert zwischen Null und -4,6 V. Das hätte den Widerstandswert zwischen den Drain- und Source-Pins des FET zwischen einigen 100 Ω und mehr als 1 MΩ variiert.

Auszug RDSon aus dem Datenblatt des BF245 Dieser Auszug aus dem Datenblatt zeigt die Variation von RDSon der drei Typen an BF245. Die Kurven beginnen bei ungefähr 200 Ω (bei einem BF245A) oder weniger und reichen bis 100 kΩ. Der BF245C benötigt für das gleiche RDSon höhere negative Gate-Spannungen als die A- oder B-Typen.

RDSon und erreichbare Verstärkung beim FET BF256B Das gleiche Diagramm ist für den Typen BF246B nicht erhältlich. Normalerweise ist im Datenblatt nur IDSS aufgelistet, das ist der Drain-Source-Strom bei Null Volt Gate-Spannung, und das auch nur für eine einzige Drain-Spannung. Das ist zwar ausreichend, um daraus den RDSon bei 0 V Gatespannung zu berechnen, aber liefert keine Kurve der Steilheit wie beim BF245-Datenblatt.

Ich habe daher einen BF246B ausgemessen, indem ich an seinen Drain einen Widerstand von 100 kΩ gegen 5V angeschlossen habe und die Drain-Spannung bei verschiedenen Gatespannungen gemessen habe. Das Diagramm zeigt die Ergebnisse für das errechnete RDSon und die daraus berechnete Verstärkung der Gesamtschaltung. Die Verstärkung bewegt sich zwischen knapp über 10 und 1.000, also ein 100-facher Unterschied. Das sollte als Regelungsbereich ausreichen.

Unglücklichweise hat sich herausgestellt, dass der CA3140 in dieser Schaltung nur dann funktioniert, wenn man mit den beiden Offset-Pins 1 und 5 die Mittenverstellung des CA3140 ziemlich weit auf eine Seite verschiebt (4k7-Trimmer an Pin 1 und 5, Mitte an Minus). Der Einstellbereich, in dem der CA3140 dann verstärkt, ist recht eng. Beim Verlassen des Einstellbereichs erfolgt übermäßiges Schwingen. Auch ist diese Mittenverstellung sehr stark verstärkungsabhängig und reagiert sogar auf die Verstellung des LC-Kreises mit den Varaktordioden, den ich direkt an den positiven Eingang des CA3140 angekoppelt hatte. Jedenfalls ist das alles nix Zuverlässiges, was sich auch für den Nachbau eignet.

Es musste daher ein anderes Regelkonzept her. Nach etlichen misslungenen Versuchen hat sich die im Schaltbild gezeigte Lösung als geeignet und ausreichend robust erwiesen. Löngen, bei denen die Koppelkondensatoren kleiner ausgelegt waren (z. B. 1 nF), haben allesamt zu viel Noise und Instabilität gebracht, was bei der hohen Verstärkung von 100.000 auch zu erwarten ist, denn 10µV Rauschen oder Störsignal machen, mit 100.000 multipliziert, schon ganze 1 V aus. Dafür hat der hochempfindliche, weil FET-entkoppelte, LC-Eingangskreis nicht mal auf meine Energiesparlampe reagiert, die sonst alle handelsüblichen DCF77-Empfänger sicher zum Entgleisen bringt.

Eine Verstärkung von 100.000 bedeutet, dass 10 µV HF auf 1 V am Ausgang verstärkt werden. Die Verstärkung reicht daher sowohl für den Empfang im Nahbereich als auch in einiger Entfernung.

Wie man an der Verstärkung sieht, verläuft die Regelkurve im Mittenbereich ziemlich steil, das heißt: schon geringe Änderungen der Regelspannung bewirken einen steilen Anstieg oder Abfall der Verstärkung, sodass die AD-Wandler-Mimik immer wieder nachregeln muss. Das kann man vermeiden, indem man die Verstärkungen der beiden OpAmp-Stufen so anpasst, dass die Regelspannung relativ niedrig ist. In diesem Bereich ist die Kurve dann weniger steil und bleibt über weite Strecken relativ stabil. Die Verstärkungen beider Stufen können mit den Widerständen vom negativen Eingang zu Minus relativ bequem verstellt werden. Braucht man viel Verstärkung, macht man beide Widerstände z. B. 1 oder 10 kΩ, darf es ein bisschen weniger sein, kann es auch ein 100 kΩ sein. Da die beiden Verstärkerstufen nicht invertieren, bleiben sie auch einer Verstärkung von 1.000 noch stabil.

Seitenanfang Index Hardware Software

4.1.3 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 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.
Da ist für jeden Geschmack etwas dabei.

4.2 Hardware des ATtiny25 Controllers

DCF77-Controller ATtiny24 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 SRAM und EEPROM verschwenden willst.

Die folgenden Funktionen sind im ATtiny25 realisiert:
  1. die Messung der DCF77-Amplitudensignal-Amplitude am ADC3-Eingang Pin 2,
  2. die Erzeugung des AFC-Signals am OC0A-Ausgang Pin 5,
  3. die Erzeugung der AGC-Regelspannung am OC0B-Ausgang Pin 6, 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),
Die einzelnen Hardware-Funktionen sind in den folgenden Unterkapiteln näher beschrieben.

Seitenanfang Index Hardware Software

4.2.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 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: ist diese höher als z. B. 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 (100 µF und 1 MΩ) und die Amplitude wird niedriger.

Die weitere Auswertung der gemessenen Maximalwerte ist in der Software-Sektion beschrieben.

Seitenanfang Index Hardware Software

4.2.2 Erzeugung und Filterung der AFC-Spannung

OC0A als AFC-Controller 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 opampreg_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 auf dem Endwert.

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 10 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 344 s oder knapp 6 Minuten.

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

4.2.3 Erzeugung und Filterung der Verstärkungs-Regelspannung

AGC-Spannungsgenerator 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 OC0A-Ausgang aktiv (ca. 7,8 kHz), 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-Spannungsgerenator 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

4.2.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 keine Transistortreiberstufe nötig ist.
  3. Ist synchrone serielle Ausgabe mit bTxMode = 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 4 kBd 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 ein Wagenrücklauf und ein Zeilenvorschub.
  4. Im Modus 3 werden die Statusmeldungen und Ergebnisse asynchron übertragen.

    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 45 und ca. 50.000 wählbar. Für die Invertierung sorgt die Konstante cRevert mit 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 einem U danach, sofern es sich um die UTC handelt, sowie CR/LF danach.
  3. Zwei sendet die Uhrzeit mit T davor, ein U wenn es sich um UTC handelt, dann das Datum mit D davor, dann den Wochentag, 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.


Seitenanfang Index Hardware Software

4.3 Die Software

4.3.1 Software-Download

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

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 und die bAdc-Flagge gesetzt. Dies findet in der Interrupt-Service-Routine des ADC complete Interrupts statt.
  2. Außerhalb der Interrupt-Service-Routine 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 erreicht, wird dieser Generator abgeschaltet, die Flagge bGain gesetzt sowie die Langzeit-Mittelwert-Bildung neu gestartet.
  3. 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.
  4. 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.
  5. 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

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 opampreg_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 Interrupt-Serrvice-Routine. Diese braucht dafür minimal 27 und maximal 32 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. 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 Ergenismeldungen längere Wartezeiten vorlägen. Dies würde zu einer Absenkung der Abtastrate und zur Verlängerung des Mittelungszeitraums führen. Da dieser Zeitraum 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 opampreg_maxdetection in der LibreOffice Calc-Datei hier eine Simulation gemacht. Darin sind 256 Messungen in 7,3 ms simuliert, bei normaler und abgesenkter Amplitude. Die Amplitude wurde 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.

Sind alle Überprüfungen korrekt, dann wird gecheckt, ob die Anzahl empfangener Bits 59 ist. Fall nicht, gibt es wieder eine Fehlermeldung.

Dann erfolgt die Überprüfung, ob die Paritätsbits für die Minuten und die Stunden sowie das Paritätsbit des Datums korrekt sind. Ist auch dies der Fall, werden die DCF-Bits in das Zeit- und Datumsformat umgewandelt. Falls UTC vorgewählt ist, wird die Zeit und, falls erforderlich auch das Datum, entsprechend in UTC umgewandelt. 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.

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

Flussdiagramm der UTC-Umwandlung 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.

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.

LCD-Darstellungen Was nacheinander gesendet wird, wird von cLcdLines und cLcdCols bestimmt. Hier sind die Darstellungen auf den diversen LCDs zusammengestellt.

Ist cLcdLines und cLcdCols gleich Null, dann werden alle Informationen in einer Zeile gesendet, versehen mit einem "T" für die Uhrzeit, mit einem "D" für das Datum, mit einem "W" für den Wochentag sowie den abschließenden Zeichen Wagenrücklauf und Zeilenvorschub. Dieses Sendeformat eignet sich am Besten für Terminals (22 Zeichen pro Zeile).

Bei einzeiligen LCDs (cLedLines = 1 sind möglichst viele Informationen in der ersten Zeile versammelt. Je mehr Zeilen verfügbar sind, desto ausführlicher werden die dargestellten Informationen. Bei vierzeiligen LCDs werden noch DCF77-Empfänger- und Status-Meldungen dargestellt.

Die Darstellungsweise ist noch von cLcdCols abhängig, denn die gesendeten Zeilenlängen müssen in eine Zeile der LCD passen. Jede gesendete Zeile beginnt mit einer Kennung. T bedeutet dabei die Uhrzeit, wenn cLcdCols grö&slig;er als acht ist gefolgt von dem Kürzel für die Zeitbasis (MEZ, MESZ oder UTC, in englisch MET bzw. MEST). D bedeutet das Datum (Tag, Monat und Jahr getrennt mit Punkten, in englisch Monat, Tag und Jahr getrennt mit /). Ist genügend Platz auf der LCD, folgt darauf der ausgeschriebene Wochentag, falls nicht, wie bei 2*16, nur dessen Kürzel (englisch: dito). Falls die Konstante cTxContent die Ausgabe von DCF77-Meldungen und/oder Statusmeldungen einschaltet, erscheinen diese mit E bzw. mit S ebenfalls.

Ist der Puffer 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 zeit 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 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



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