Article View: de.sci.electronics
Article #1479Re: DCF-Decodierung
From: Matthias Hanke
Date: Tue, 14 Oct 1997 00:00
Date: Tue, 14 Oct 1997 00:00
60 lines
3485 bytes
3485 bytes
Marc 'Nepomuk' Heuler wrote:
>
> In article <343fdf25.806551@steinfurt.westfalen.de>, Olaf Hellmann writes:
>
> > >Mich w�rde ein '51 Code interessieren, der die DCF77 Datenfelder in die
> > >Anzahl der Sekunden seit 1. Januar 1997 (oder ein anderes Jahr)
> > >Mitternacht umrechnet. Diese Anzahl k�nnte ich dann per Timerint jede
> > >Sekunde um 1 erh�hen und h�tte so einen immer stimmigen Zeitstempel f�r
> > >Logzeilen, auch wenn das DCF77 Signal mal nicht empfangen wird. Hast Du so
> > >eine Funktion?
> >
> > [...]
> >
> > Wenn du das wirklich mit einen 10 ms Interrup machst kannst du auch
> > sehr einfach die Uhr auch bei Nichtempfang weiterrechnen lassen denn
> > zumindest bei meinen 80535 war der Interrup so genau das ich einen
> > Abweichung von 3 Sekunden pro Tag bei Nichtempfang der DCF-Zeit hatte
> > was IMHO ein sehr guter Wert ist der voll und ganz ausreicht.
>
> Genau das ist ja der Punkt. Es geht n�mlich nicht so einfach. Ich mu� in
> der Funktion ber�cksichtigen, wieviele Sekunden eine Minute hat usw, und
> insbesondere, wieviel Tage welcher Monat, wieviel Tage welches Jahr hat.
> Dann kommen die Regeln f�r's Schaltjahr dazu, jedes volle Jahrhundert
> wieder nicht, das Jahrtausend dann doch wieder usw. All diesen Kram k�nnte
> ich mir sparen, wenn ich oben beschriebene Funktion h�tte. Dann reduziert
> sich der ganze Kram auf einen einfachen x-Bit Z�hler.
>
> Hat jemand eine solche Funktion?
Nee, leider nicht. Das ist aber doch ganz einfach zu realisieren: Man
kann z.B. fuer jede Stelle einen BCD-Zaehler einrichten (SE, SZ, ME, MZ,
HE, HZ..., je nachdem wieviel Speicher Dir zur Verfuegung steht. Dann
bastelst Du Dir Funktionen, die jeweils eine Stelle incrementieren, z.B.
se() erhoeht die einerstelle der Sekunden um 1. Das sieht dann etwa so
aus:
se(){
sek++;
if(sek>9){
sek=0;
sz(); // Zehnerstelle erhoehen
}
}
Und so weiter. Damit erleichtert sich auch die Ausgabe aufs Display.
Zwei Punkte sind zu beachten:
1. Man darf nicht so tief verschachteln, dass der Stack ueberlaeuft.
2. Die Funktion muss auf jeden Fall (also worst case: Ueberlauf aller
Stellen)
vor dem naechsten Interrupt zurueckkehren.
Dein Verfahren funktioniert natuerlich ach. Dann hast Du aber fuer jede
Zeitausgabe viel zu rechnen.
Das Datum (Schaltjahr und so) ist doch wohl nicht unbedingt noetig,
oder? Wenn Du das dennoch implementieren moechtest musst Du auch noch an
die Umschaltung Sommerzeit/Normalzeit denken.
Hanky
Technical Details
Message-ID:
<344349D6.366B75D@heh.uni-osnabrueck.de>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<343d443c.1437672@steinfurt.westfalen.de> <rpscB*NTd@aargh.mayn.de> <343fdf25.806551@steinfurt.westfalen.de> <nIudB*TWd@aargh.mayn.de>Show Full Headers
Complete Article Headers
X-Google-Language: GERMAN,ASCII X-Google-Thread: 112e71,ad6ee8c0941936ad X-Google-Attributes: gid112e71,public X-Google-Thread: 105dc7,991f831314cdee3d X-Google-Attributes: gid105dc7,public X-Google-Thread: 10ba43,991f831314cdee3d X-Google-Attributes: gid10ba43,public X-Google-Thread: fa709,991f831314cdee3d X-Google-Attributes: gidfa709,public X-Google-Thread: f637a,991f831314cdee3d X-Google-Attributes: gidf637a,public From: Matthias Hanke <hanky@heh.uni-osnabrueck.de> Subject: Re: DCF-Decodierung Date: 1997/10/14 Message-ID: <344349D6.366B75D@heh.uni-osnabrueck.de> X-Deja-AN: 280457448 References: <343d443c.1437672@steinfurt.westfalen.de> <rpscB*NTd@aargh.mayn.de> <343fdf25.806551@steinfurt.westfalen.de> <nIudB*TWd@aargh.mayn.de> Organization: HEHOS-NET Newsgroups: de.sci.electronics,fido.ger.elektronik,maus.elektronik,t-netz.elektronik,z-netz.alt.elektronik