14
Seite 1 von 14 Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die Aufgabe mit Hilfe unseres Microcontrollers „MicoWi“, der Zusatzplatine „DCF 77 Empfänger“ sowie der „Micosa-Box“ das DCF 77 Signal zu empfangen, auszuwerten und auf der 4-stelligen 7-Segement-Anzeige darzustellen. Gruppenmitglieder - Pierre Beckmann - Stefan Bendrin - Dennis Hoppen - Felix Müller - Sven Stollmayer Inhaltsverzeichnis 1. DCF 77 – Die richtige Zeit Deutschlands a. Was ist DCF 77? b. Warum gibt es DCF 77? c. Reichweite des DCF 77 Signals d. Wie wird das DCF 77 Signal erzeugt? e. Zeitinformationen des DCF 77 Signal f. Zuverlässigkeit des DCF 77 Signals g. Zukunft des DCF 77 Signals 2. Beschreibung der Funktionen 3. Programmablaufpläne (PAP) 4. Quellcode in C für Keil C51 Compiler Ein Low-Cost DCF77 Empfänger, wie er auf der Zuatzplatine verwendet wird.

Der Microcontroller als DCF 77 Empfängertrampicturebook.de/mc/media/pdf/DCF77-Projekt-2.pdf · Seite 1 von 14 Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die

Embed Size (px)

Citation preview

Page 1: Der Microcontroller als DCF 77 Empfängertrampicturebook.de/mc/media/pdf/DCF77-Projekt-2.pdf · Seite 1 von 14 Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die

Seite 1 von 14

Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die Aufgabe mit Hilfe unseres Microcontrollers „MicoWi“, der Zusatzplatine „DCF 77 Empfänger“ sowie der „Micosa-Box“ das DCF 77 Signal zu empfangen, auszuwerten und auf der 4-stelligen 7-Segement-Anzeige darzustellen. Gruppenmitglieder

- Pierre Beckmann - Stefan Bendrin - Dennis Hoppen - Felix Müller - Sven Stollmayer

Inhaltsverzeichnis

1. DCF 77 – Die richtige Zeit Deutschlands a. Was ist DCF 77? b. Warum gibt es DCF 77? c. Reichweite des DCF 77 Signals d. Wie wird das DCF 77 Signal erzeugt? e. Zeitinformationen des DCF 77 Signal f. Zuverlässigkeit des DCF 77 Signals g. Zukunft des DCF 77 Signals

2. Beschreibung der Funktionen 3. Programmablaufpläne (PAP) 4. Quellcode in C für Keil C51 Compiler

Ein Low-Cost DCF77 Empfänger, wie er auf der Zuatzplatine verwendet wird.

Page 2: Der Microcontroller als DCF 77 Empfängertrampicturebook.de/mc/media/pdf/DCF77-Projekt-2.pdf · Seite 1 von 14 Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die

Seite 2 von 14

1. DCF 77 – Die richtige Zeit Deutschlands Was ist DCF 77? DCF 77 ist ein Zeitsignal, es wird auf der Normalfrequenz 77,5 kHz als Zeitinformation in kodierter Form von einem Langwellensender bei Mainflingen ausgestrahlt. Die Sendeleistung beträgt etwa 50 kW bei einer ausgestrahlten Leistung von etwa 30 kW in einer Reichweite von ca. 2000 km.

Einer der Masten, die das DCF 77 Signal senden. Warum gibt es DCF 77? Die Physikalisch-Technische Bundesanstalt ist, wie es 1978 im Gesetz über die Zeitbestimmung festgesetzt ist, zur Darstellung und Verbreitung der „gesetzlichen Zeit“ verpflichtet. DCF 77 ist ein über Langwelle ausgestrahltes Zeitsignal, in dem die Zeitinformation der nächsten Minute kodiert ist. Dieses Zeitsignal ist die “richtige Zeit Deutschlands“ und findet auch im alltäglichen Leben bei zum Beispiel Funkarmbanduhren und Funkweckern Verwendung, jedoch auch in der Datenverarbeitung findet dieses Signal immer mehr Aufmerksamkeit. Es gibt spezielle Funkuhren, die man an PCs anschließen kann, damit diese über entsprechende Software auch mit der "richtigen Zeit Deutschlands" versorgt werden können. Die Weitergabe der gesetzlichen Zeit an die verschiedensten Nutzer in Industrie, Wirtschaft und Forschung erfolgt über Satelliten, den Langwellensender DCF 77 und einen Telefondienst. Jeder Sender, dessen Reichweite über die Landesgrenzen reicht, muss ein solches Rufzeichen mit senden.

Page 3: Der Microcontroller als DCF 77 Empfängertrampicturebook.de/mc/media/pdf/DCF77-Projekt-2.pdf · Seite 1 von 14 Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die

Seite 3 von 14

Reichweite des DCF 77 Signals Das von der Sendeantenne abgestrahlte DCF 77-Signal erreicht den Empfangsort auf zwei Wegen: Zum einen breitet es sich als Bodenwelle entlang der Erdoberfläche aus, und zum anderen gelangt es als Raumwelle nach Reflexion an der ionosphärischen D-Schicht zum Empfangsort. Die Reichweite beträgt am Tag ca. 1900km und bei Nacht ca. 2100km. Wenn man weiter entfernte Orte erreichen möchte, gelingt dies nur nach mehrfachen Reflexionen (z.B. zwei Reflexionen an der D-Schicht, eine Reflexion an der Erdoberfläche). Zusammengefasst ergeben sich für die Boden- und Raumwelle folgende Eigenschaften: Die sehr stabile Bodenwelle hat eine große Reichweite. Bis zu Entfernungen von einigen hundert Kilometern ist ihre Empfangsfeldstärke deutlich größer als die der Raumwelle. Unter 500 km Entfernung vom Sender kann man mit Feldstärken der Bodenwelle über 1 µV/m rechnen. Im Entfernungsbereich zwischen etwa 600 bis 1100 km können Boden- und Raumwelle gelegentlich gleich groß sein, was bei Gegenphase zur gegenseitigen Auslöschung (Fading) führen kann. Andererseits ist bei gleicher Phase aber auch ein vorübergehender starker Feldstärkeanstieg möglich. Beide Phänomene werden auch schon in Braunschweig (d = 273 km) beobachtet. In diesem Zusammenhang ist es wichtig zu wissen, dass diese "Schwebung" zwischen Boden- und Raumwelle langsam abläuft (eine Viertelstunde und länger) und somit für eine Funkuhr genügend Zeit zur Aufnahme der DCF 77-Zeitinformation zur Verfügung steht. In Entfernungen über 1100 km tritt der Bodenwellenanteil immer mehr zurück, und es überwiegt dann die Raumwelle, deren Ausbreitung in großen Entfernungen besonders am Tage recht konstant ist. Zwischen 1100 und 2000 km Entfernung sind Feldstärken der Raumwelle zwischen einigen hundert und etwa 100 µV/m zu erwarten.

Lage und Reichweite der DCF 77 Sender, der fast ganz Europa abdeckt und so mit den richtigen Zeitinformationen versorgt.

Page 4: Der Microcontroller als DCF 77 Empfängertrampicturebook.de/mc/media/pdf/DCF77-Projekt-2.pdf · Seite 1 von 14 Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die

Seite 4 von 14

Wie wird das DCF 77 Signal erzeugt? Das DCF 77 Zeitsignal wird mittels Atomuhren erzeugt. Die Physikalisch-Technische Bundesanstalt kontrolliert die ausgesendeten Signale, welche innerhalb jeder Minute in Sekundenimpulsen kodiert die komplette Zeitinformation einschließlich Uhrzeit, Datum und Wochentag übertragen. Die Sendezeit ist, mit kleinen Ausnahmen, ein 24h-Dauerbetrieb, da für die Dauer von bspw. Gewittern die Aussendung des Signals vorübergehend abgeschaltet wird. Bei Wartungen oder Störungen muss auf einen Reservesender oder eine Reserveantenne umgestellt werden. Je nach Art der Arbeiten, kann die Unterbrechung mehrere Stunden andauern. Dies geschieht aber heute selten, da drei unabhängig voneinander arbeitende Steuereinheiten das Signal erzeugen. So kann auch sichergestellt werden, dass immer die richtige Zeit ausgegeben wird.

Die aktuellen Zeitinformationen werden direkt am Standort des Langwellensenders DCF77 mit Hilfe dieser Steueranlage erzeugt, drei kommerzielle Atomuhren geben dabei den Takt vor.

Page 5: Der Microcontroller als DCF 77 Empfängertrampicturebook.de/mc/media/pdf/DCF77-Projekt-2.pdf · Seite 1 von 14 Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die

Seite 5 von 14

Zeitinformation des DCF 77 Signals Die Zeitinformationen werden als digitales Signal zusätzlich zur Normalfrequenz übertragen. Das geschieht durch negative Modulation des Signals (Absenken der Trägeramplitude auf 15 %) im Sekundentakt. Der Beginn der Absenkung liegt jeweils auf dem Beginn der Sekunden 0 bis 58 innerhalb einer Minute. In der 59. Sekunde erfolgt keine Absenkung, wodurch die nachfolgende Sekundenmarke den Beginn einer Minute kennzeichnet und der Empfänger synchronisiert werden kann. Die Länge der Amplitudenabsenkungen am Beginn der Sekunden steht jeweils für den Wert eines binären Zeichens: 100 ms Absenkung stehen für den logischen Wert „0“, 200 ms für „1“. Damit stehen innerhalb einer Minute 59 Bit für die Übertragung der Zeitinformationen zur Verfügung.

Das Sendeprogramm von DCF77: aktuelle Zeitinformationen zu Minute, Stunde, Tag, Woche, Monat und Jahr kodiert mit kurzen und langen Sekundenmarken für binäre Nullen und Einsen.

Page 6: Der Microcontroller als DCF 77 Empfängertrampicturebook.de/mc/media/pdf/DCF77-Projekt-2.pdf · Seite 1 von 14 Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die

Seite 6 von 14

Zuverlässigkeit des DCF 77 Signals Die zeitliche Verfügbarkeit von 99,7 % ist vertraglich vereinbart - im Jahr 2002 wurden fast 99,95 % erreicht. Bei einem Stromausfall hält eine USV (unterbrechungsfreie Stromversorgung) und ein Notstromaggregat den Betrieb in der Sendezentrale aufrecht. Zukunft des DCF 77 Signals Die Aufrechterhaltung des Sendebetriebes des DCF 77 Signals hängt von der Zusammenarbeit der Physikalisch-Technische Bundesanstalt und der Telekom ab (Verbreitung des Signals über Telekom Langwellensender). Die Physikalisch-Technische Bundesanstalt ist für die Erzeugung des DCF 77 Signals verantwortlich und die Telekom für die Aussendung des Signals über ihren Langwellensender. Die Physikalisch-Technische Bundesanstalt muss für die Nutzung des Telekomsenders viel Geld bezahlen, außerdem stehen in den kommenden Jahren umfangreiche Sanierungsmaßnahmen an den Antennenanlagen und dem Sendegebäude an. Die Physikalisch-Technische Bundesanstalt hat aber erkannt, wie wichtig die Aufrechterhaltung des DCF 77 Signals ist. Ihr ist bekannt, dass die Nutzer des Signals, sowohl Hard-/Softwarehersteller, als auch die eigentlichen Anwender aus Industrie und Haushalt, auf das Fortbestehen des Signals vertrauen, indem sie hohe Investitionskosten in die Entwicklung und die Anschaffung von DCF 77 Antennen stecken. Aber auch die Telekom beweist mit den hohen Sanierungskosten an Antennenanlagen und Sendegebäude ihr Interesse am Fortbestehen des Sendebetriebes. Ein vertragliches Abkommen besteht zwischen der Physikalisch-Technische Bundesanstalt und der Telekom, indem der Betrieb bis mindestens ins Jahr 2013 beschlossen wurde. Quellenangabe http://www.DCF 77.de/ http://de.wikipedia.org/wiki/DCF 77 http://www.meinberg.de/german/info/DCF 77.htm http://www.ptb.de/de/aktuelles/archiv/presseinfos/pi2009/pitext/pi090311.html

Page 7: Der Microcontroller als DCF 77 Empfängertrampicturebook.de/mc/media/pdf/DCF77-Projekt-2.pdf · Seite 1 von 14 Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die

Seite 7 von 14

2. Beschreibung der Funktionen void Init(): In der Init-Funktion werden die Timer gesetzt, deren Interrupts freigegeben und anschließend gestartet. void put_dig(unsigned char stelle, unsigned char digwert): Diese Funktion gibt eine einstellige Zahl auf einem der 7-Segment-Displays der Zusatzplatine aus. Dazu wird die Stelle (0-3) und der Wert der anzuzeigenen Zahl übergeben. void put_zahl(unsigned int zahl): Die put_zahl-Funktion gibt eine mehrstellieg Zahl auf den 7-Segment-Displays der Zusatzplatine mittels der put_dig-Funktion aus. void cleardisp(void): Diese Funktion setzt alle 7-Segment-Displays auf der Zusatzplatine auf 0, dafür wird 4-mal die put_dig-Funktion mit dem Übergabewert "0" aufgerufen. void Auswertung(): Bei der Auswertung werden die ermittelten Bits interpretiert, indem mittels Multiplikation der Wertigkeiten und Addition derer Produkte die Uhrzeit und das Datum ermittelt werden. Wenn die Funktion aufgerufen wird, wird als erstes mit Hilfe der Paritätbits auf Empfangsfehler abgefragt. Wenn ein Fehler aufgetauch ist und es bereits eine fehlerfreie Messung gab, wird die Fehlerkorrektur aufgerufen. Falls es noch keine fehlerfreie Messung gab, wird die aktuelle Messung "verworfen" und die Variablen bleiben auf "0". Am Ende der Funktion wird schließlich die Ausgabe-Funktion aufgerufen. void Ausgabe(): Diese Funktion gibt auf der Zusatzplatine das Datum bzw. die Uhrzeit mittels der put_dig-Funktion aus. Von der Variable "Mode" ist abhängig, ob die Uhrzeit oder das Datum angezeigt wird. void timer0 (void) interrupt 1: Mithilfe von Timer0 wird alle 20ms der Zustand des aktuellen Signalpegels erfasst. Durch die Anzahl der erfassten High Pegel, wird ermittelt, ob das gemessene Signal für eine 1, eine 0 oder ein Minutenimpuls steht bzw. ein Empfangsfehler vorliegt. Nachdem eine Messung für eine Minute durchgeführt wurde, wird die Auswertungs-Funktion aufgerufen. void main(): In der main-Funktion werden die Funktionen init() und cleardisp() aufgerufen. Anschließend läuft eine Endlosschleife, die abfragt, ob die Differenz zwischen dem aktuellen Index und dem Index der letzten Ausgabe größer gleich 5 ist. Wenn dies der Fall ist, wird die Ausgabe-Funktion aufgerufen und Datum bzw. Uhrzeit ausgegeben. So wechselt die Ausgabe alle 5 Sekunden zwischen Datum und Uhrzeit.

Page 8: Der Microcontroller als DCF 77 Empfängertrampicturebook.de/mc/media/pdf/DCF77-Projekt-2.pdf · Seite 1 von 14 Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die

Seite 8 von 14

3. Programmablaufpläne (PAP)

Page 9: Der Microcontroller als DCF 77 Empfängertrampicturebook.de/mc/media/pdf/DCF77-Projekt-2.pdf · Seite 1 von 14 Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die

Seite 9 von 14

Page 10: Der Microcontroller als DCF 77 Empfängertrampicturebook.de/mc/media/pdf/DCF77-Projekt-2.pdf · Seite 1 von 14 Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die

Seite 10 von 14

Page 11: Der Microcontroller als DCF 77 Empfängertrampicturebook.de/mc/media/pdf/DCF77-Projekt-2.pdf · Seite 1 von 14 Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die

Seite 11 von 14

4. Quellcode in C für Keil C51 Compiler //============================================================== // Programm zum Empfang und Auswertung des DCF77-Funksignal //============================================================== #include "reg51.h" #include "stdlib.h" // Include für die abs() Funktion #define THBYTE 0xB1; // 20ms --> 65535-20000=45535=0xB1DF #define TLBYTE 0xDF; #define DCFPORT P0 // P0 als Eingangsport der DCF77-Platine #define DISPLAYPORT P1 // P1 als Ausgabeport für Datum und Uhrzeit sbit SIGNAL=DCFPORT^7; // Pin mit invertiertem DCF77-Signal unsigned char Mode=0; // gibt an, ob das Datum oder die Uhrzeit ausgegeben wird unsigned char Count=0; // zählt die Anzahl der Messungen unsigned char CountHigh=0; // zählt die Anzahl der gemessenen High Pegel unsigned char Zyklus[60]={0}; // speichert einen Messzyklus von 60sek unsigned char Index=0; // fungiert als Index für den Messzyklus unsigned char FirstReceive=0; // gibt an, ob mindestens eine Messung fehlerfrei war unsigned char MinutenEiner=0; unsigned char MinutenZehner=0; unsigned char StundenEiner=0; unsigned char StundenZehner=0; unsigned char TagEiner=0; unsigned char TagZehner=0; unsigned char Wochentag=0; unsigned char MonatEiner=0; unsigned char MonatZehner=0; unsigned char JahrEiner=0; unsigned char JahrZehner=0; unsigned char OldIndex=0; // Initialisierungsfunktion für Timer ========================== void init () { unsigned char tm; // Zwischenwert TMOD-Register tm=TMOD; // Timermodusregister einlesen tm=tm&0xF0; // Zustand Timer 1 ausmaskieren TMOD=tm|1; // Timer 0: 16 Bit ohne Autoreload (Modus 1), Timer 1 unverändert TH0=THBYTE; // High-Byte des Zählers setzen TL0=TLBYTE; // Low-Byte des Zählers setzen ET0=1; // Interrupt für Timer 0 freigeben EA=1; // generelle Interruptfreigabe TR0=1; // Timer 0 starten } // Funktion zum Ausgeben einer Stelle auf Display ============== void put_dig(unsigned char stelle,unsigned char digwert) { unsigned char out; out=(stelle<<4); // Stellen um 4 Bit nach links schieben out=(out&0x70); // Stellen eintragen (nur 3 Bit) out=out|(digwert&0xF); // BCD-Wert eintragen DISPLAYPORT=out; // Daten ausgeben DISPLAYPORT=(out|0x80); // Übernahmebit setzen DISPLAYPORT=out; // Übernahmebit wieder auf 0 } // Funktion zum Ausgeben einer Zahl auf Display ================ void put_zahl(unsigned int zahl) { unsigned int out,rest; rest=zahl; out=zahl/1000; put_dig(3,out); // Tausender rest=rest%1000; out=rest/100; put_dig(2,out); // Hunderter rest=rest%100; out=rest/10; put_dig(1,out); // Zehner rest=rest%10; put_dig(0,rest); // Einer }

Page 12: Der Microcontroller als DCF 77 Empfängertrampicturebook.de/mc/media/pdf/DCF77-Projekt-2.pdf · Seite 1 von 14 Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die

Seite 12 von 14

// Funktion zum Leeren des Displays ============================ void cleardisp(void) { // alle Stellen des Displays auf 0 setzen int i; for(i=0;i<4;i++) { put_dig(i,0); } } // Funktion zur Ausgabe von Datum und Uhrzeit ================== void Ausgabe () { switch (Mode) { // Zeit ausgeben case 0: Mode=1; put_dig(0,MinutenEiner); put_dig(1,MinutenZehner); put_dig(2,StundenEiner); put_dig(3,StundenZehner); break; // Datum ausgeben case 1: Mode=0; put_dig(0,MonatEiner); put_dig(1,MonatZehner); put_dig(2,TagEiner); put_dig(3,TagZehner); break; } } // Funktion zur Auswertung eines Messzyklus ==================== void Auswertung () { // Ist ein Empfangsfehler aufgetreten (Auswertung der Paritätsbits)? if(Zyklus[0]!=0 || Zyklus[20]!=1 || (Zyklus[21]+Zyklus[22]+Zyklus[23]+Zyklus[24]+Zyklus[25]+Zyklus[26]+Zyklus[27])%2!=Zyklus[28] || (Zyklus[29]+Zyklus[30]+Zyklus[31]+Zyklus[32]+Zyklus[33]+Zyklus[34])%2!=Zyklus[35] || (Zyklus[36]+Zyklus[37]+Zyklus[38]+Zyklus[39]+Zyklus[40]+Zyklus[41]+Zyklus[42]+Zyklus[43]+Zyklus[44]+Zyklus[45]+Zyklus[46]+Zyklus[47]+Zyklus[48]+Zyklus[49]+Zyklus[50]+Zyklus[51]+Zyklus[52]+Zyklus[53]+Zyklus[54]+Zyklus[55]+Zyklus[56]+Zyklus[57])%2!=Zyklus[58]) { // Wurde schon einmal fehlerfrei gemessen? if(FirstReceive==1) { // Wenn Ja: Fehlerkorrektur if(MinutenEiner==9) { MinutenEiner=0; MinutenZehner++; if(MinutenZehner*10==60) { MinutenZehner=0; StundenEiner++; if(StundenZehner*10+StundenEiner==24) { StundenEiner=0; StundenZehner=0; TagEiner++; if(TagZehner*10+TagEiner>=30) { TagEiner=1; TagZehner=0; MonatEiner++; if(MonatZehner*10+MonatEiner==13) { MonatEiner=1; MonatZehner=0; if(JahrEiner==9) { JahrEiner=0; JahrZehner++; if(JahrZehner*10==100) { JahrZehner=0; } } else {

Page 13: Der Microcontroller als DCF 77 Empfängertrampicturebook.de/mc/media/pdf/DCF77-Projekt-2.pdf · Seite 1 von 14 Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die

Seite 13 von 14

JahrEiner++; } } } } } } else { MinutenEiner++; } } else { // Wenn Nein: Werte auf 0 lassen } } else { // die erste, fehlerfreie Messung wurde durchgeführt FirstReceive=1; // Auswertung des Blocks "Uhrzeit" MinutenEiner=Zyklus[21]*1+Zyklus[22]*2+Zyklus[23]*4+Zyklus[24]*8; MinutenZehner=Zyklus[25]*1+Zyklus[26]*2+Zyklus[27]*4; StundenEiner=Zyklus[29]*1+Zyklus[30]*2+Zyklus[31]*4+Zyklus[32]*8; StundenZehner=Zyklus[33]*1+Zyklus[34]*2; // Auswertung des Blocks "Datum" TagEiner=Zyklus[36]*1+Zyklus[37]*2+Zyklus[38]*4+Zyklus[39]*8; TagZehner=Zyklus[40]*1+Zyklus[41]*2; Wochentag=Zyklus[42]*1+Zyklus[43]*2+Zyklus[44]*4; MonatEiner=Zyklus[45]*1+Zyklus[46]*2+Zyklus[47]*4+Zyklus[48]*8; MonatZehner=Zyklus[49]*1; JahrEiner=Zyklus[50]*1+Zyklus[51]*2+Zyklus[52]*4+Zyklus[53]*8; JahrZehner=Zyklus[54]*1+Zyklus[55]*2+Zyklus[56]*4+Zyklus[57]*8; } // Ausgabefunktion aufrufen Ausgabe(); } // Interrupt-Funktion zum Empfang des Signals ================== void timer0 (void) interrupt 1 { TR0=0; // Timer 0 abstellen TH0=THBYTE; // High-Byte des Zählers setzen TL0=TLBYTE; // Low-Byte des Zählers setzen TR0=1; // Timer 0 starten // Anzahl der Messungen hochzählen Count++; // Wurde eine Sekunde gemessen (50*20ms=1000ms=1sek)? if(Count==50) { // Entsprach die Anzahl der High Pegel logisch 0 (Anzahl 4-6)? if((CountHigh>=4)&&(CountHigh<=6)) { // 7-Segment Display, aus P2=255; // 0 speichern und Index hochzählen Zyklus[Index]=0; Index++; // Wurde eine Minute lang gemessen? if(Index==59) { // Index zurücksetzen Index=0; // Auswertungsfunktion aufrufen Auswertung(); } } // Entsprach die Anzahl der High Pegel logisch 1 (Anzahl 9-11)? else if ((CountHigh>=9)&&(CountHigh<=11)) { // 7-Segment Display, Punkt P2=254;

Page 14: Der Microcontroller als DCF 77 Empfängertrampicturebook.de/mc/media/pdf/DCF77-Projekt-2.pdf · Seite 1 von 14 Der Microcontroller als DCF 77 Empfänger Als Gruppe hatten wir die

Seite 14 von 14

// 1 speichern und Index hochzählen Zyklus[Index]=1; Index++; // Wurde eine Minute lang gemessen? if(Index==59) { // Index zurücksetzen Index=0; // Auswertungsfunktion aufrufen Auswertung(); } } // Minutenimpuls else if(CountHigh==0) { // 7-Segment Display, Strich P2=253; // Index zurücksetzen Index=0; // Auswertungsfunktion aufrufen Auswertung(); } // Empfangsfehler else { // 7-Segment Display, an P2=0; // Index hochzählen, Wert der vorherigen Messung bleibt erhalten Index++; // Wurde eine Minute lang gemessen? if(Index==59) { // Index zurücksetzen Index=0; // Auswertungsfunktion aufrufen Auswertung(); } } // Nächste Messung Count=0; CountHigh=0; } // Es wurde noch keine Sekunde gemessen.. else { // Ist das aktuelle Signal high (invertierter Pin wird abgefragt)? if(SIGNAL==0) { // Anzahl der High Pegel hochzählen CountHigh++; } } } // Hauptprogramm =============================================== void main () { init(); // Timer initialisieren cleardisp(); // Display leeren while(1) // Endlosschleife { // wechselnde Ausgabe von Datum und Uhrzeit alle 5sek if(abs(Index-OldIndex)>=5) { OldIndex=Index; Ausgabe(); } } }