% Content-encoding: UTF-8 \documentclass[ngerman]{article} \usepackage[utf8]{inputenc} \usepackage{multicol,babel} \usepackage{xspace} \setcounter{secnumdepth}{0} \setcounter{tocdepth}{0} \renewcommand{\reftextbefore}{auf der vorherigen Seite} \renewcommand{\reftextfacebefore}{auf der gegenüberliegenden Seite} \renewcommand{\reftextafter}{auf der nächsten Seite} \renewcommand{\reftextfaceafter}{auf der gegenüberliegenden Seite} \renewcommand{\figurename}{Abbildung} %\begin{document} \title{Jiffy} \author{Michael Kalus} \maketitle \begin{multicols}{2} Im Heft 1/2010 wurde am Beispiel des amforth für den atmega168 beschrieben, wie einem Forth für Mikrocontroller ein Schrittmacher eingesetzt werden kann. In der Timer--Interrupt--Service--Routine wurde ein Phasenakkumulator benutzt, um eine im Mittel genaue Sekunde zu generieren. Wie im Listing zu sehen war, ging diese Uhr zu schnell. Der geschätzte Wert für den Phasenakku --- der JIFFY --- war zu ungenau. Inzwischen benutze ich einen 3 Byte breiten Phasenakku, berechne den Jiffy, und bestimme eine Korrektur für den Wert --- siehe Listing (gforth). Zudem ist Jiffy im amforth nun als Variable angelegt, damit die Ganggenauigkeit der Uhr vom Terminal aus nachgestellt werden kann\footnote{Die Datei tim2ISR.asm gebe ich auf Anfrage gerne weiter.\\ michael.kalus@onlinehome.de\\}. Die Berechnung erfolgt als Gleitkommazahl, um ein Gefühl dafür zu vermitteln, dass die Ganggenauigkeit mit diesem Verfahren ja nicht beliebig hoch werden kann, weil immer ein Rest bleibt. Für meinen Hausgebrauch finde ich es aber ok, wenn die Uhr in den Steuerungen eine Sekunde pro Tag ungenau geht. \end{multicols} \section{Links} \url{http://en.wikipedia.org/wiki/Jiffy_(time)}\\ \url{http://de.wikipedia.org/wiki/Arithmetik}\\ \url{http://de.wikipedia.org/wiki/Gleitkommazahl}\\ \section{Listing} \begin{quote} \begin{listing}{1} vocabulary jiffywords jiffywords definitions decimal : .. bye ; : d* ( ud1 ud2 -- udprod ) >r swap >r 2dup um* 2swap r> * swap r> * + + ; \ jiffy berechnen. &001 s>d \ phasenaccu Breite: &256 s>d d* \ byte0 &256 s>d d* \ byte1 &256 s>d d* \ byte2 &256 s>d d* \ prescaler &256 s>d d* \ Takte bis timer2 overflow 2constant tickers 2variable mhz 20.000000 mhz 2! 2variable cnt 0 0 cnt 2! : cnt+ cnt 2@ 1 s>d d+ cnt 2! ; : cnt- cnt 2@ 1 s>d d- cnt 2! ; : +mhz ( tickers -- tickers+mhz ) mhz 2@ d+ ; : -mhz ( tickers -- tickers-mhz ) mhz 2@ d- ; : jiffy ( -- rest jiffy ) 0 0 cnt 2! tickers begin -mhz cnt+ 2dup d0< until +mhz cnt- cnt 2@ ; \ Interval zwischen zwei Zeiten in Sekunden: : mm 60 * ; : hh 60 * mm ; : dd 24 * hh ; : sec { d h m s -- s } \ convert day hour minute second into seconds 0 d dd + h hh + m mm + s + ; : interval ( d h m s d h m s - v ) sec >r sec r> swap - ; \ Verhältnis der Sekundenabweichung zum Zeitinterval in ppm: : ppm ( v s -- ppm ) 1000000 * swap / ; \ Korrektur des jiffy: \ v = interval in Sekunden, s = Gangabweichung in Sekunden, j0 = altes jiffy. : j { v s j0 -- j1 } s s>d d>f v s>d d>f f/ 1e0 f+ j0 s>d d>f f* ; : j. j f. ; cr cr .( Jiffy = ) 3 16 56 40 4 8 54 11 interval 1 -54968 j. cr cr \ finis \end{listing} \end{quote} \vfill \begin{center} \includegraphics[height=8cm]{2010-0203/sanduhr}\\ \end{center} \end{document}