Home > NTP Clock
Last modified: Jan 27, 2007
We developed a clock that has Network Time Protocol (NTP) implemented by modifying PICNIC, sold by Akitsuki Denshi.
The clock fetches the time information from NTP server at National Institute of Information and Communications Technology. It utilizes the information for the time synchronization.
Japan Standard Time (JST) can be displayed on LCD, by only overwriting the firmware for PIC16F84.
If you add the extended switches board to PICNIC,
you can configure IP address, netmask, gateway address and NTP server address without the firmware re-compilation.
The details are described in the specification sheet (spec.pdf, Japanese).

感想、質問等については
にお願いします。
秋月電子通商の PICNIC を改造し、NTP (Network Time Protocol) を実装した時計を開発しました。
正確な時刻をインターネット上の NTP サーバ (情報通信研究機構) から取得し、その時刻情報を時計の較正に利用します。
PICNIC の PIC16F877 のファームウェアを書き換えるだけで LCD に日本標準時 (JST) を表示させることが可能です。
さらにスイッチ付き拡張 I/O 基板を付ければ、
IP アドレス、ネットマスク、ゲートウェイアドレス、NTP サーバアドレスの設定を焼き込まなくても設定可能になります。
詳しくは詳細仕様書を御覧ください。
詳細仕様書 spec.pdf (154 KB)
細かい情報は詳細仕様書に書きました。参照してください。
ほぼPICNICの回路図のまま ISA-Bus NIC (Planex ENW-2401P-T) を利用して NTP Clock を作成してみました。
PIC のクロックは 12.8000 MHz の高精度水晶モジュールを使用しています。
これでネットワークに繋がらなくても月差が数秒になります。
せっかく時間精度がよくなったのでネットワーク遅延による誤差も補正できるようにしました。
1時間に一度自動的に較正します。
この二つの機能によって、+-0.02 sec の誤差で常に JST を保持することができます。
コレガの ISA-Bus NIC (CG-E2ISAT)は RTL8019AS の JP ピンを H に上げないと動きません。また、他の NIC は確認していません。
マザーボード基板データ (PCB): isanic4.pdf (19KB)
写真: DSCF0036s.JPG, DSCF0040s.JPG
NTP Clock は UEC Electronics Contest にエントリしています。
総合優勝することが出来ました。関係者の皆様に深く感謝いたします。
配布資料:簡易仕様書 2nd edition spec3.pdf 54KB
プレゼンテーション pr.ppt 551KB
展示ポスタ poster.ppt 87KB
高精度バージョンの ISA-Bus NIC NTP Clock 「時缶 (トキカン)」が独立行政法人情報通信研究機構 NTP クライアントコンテスト [nict.go.jp] で優秀賞を頂きました (December 15, 2006).
NTP Clock frimware for PICNIC ver.2
ntp0067.asm (EUC)
ChangeLog
Ethernet log (ntp0045e.asm on PICNIC)
Ethernet log (ntpdate on Linux)
拡張I/O基板
ext2.pcb (extended board design for PCBE)
ext2.pcb.png (PCBE exported image: png 12KB)
ext2.ce2 (circuit chart for CE2)
ext2.ce2.png (exported image: png 3KB)
基板写真裏 (jpeg 66KB)
基板写真表 (jpeg 71KB)
注)
CMOSの未使用Pinの処理をしていませんでした。
未使用の入力PinはVccに繋げるかかGNDに落してください。
TriState (PICNIC製作) [tristate.ne.jp]
PICNICのひろば (PA-3.0.5 Windows版 配布元) [tristate.ne.jp]
秋月電子通商 (PICNIC販売)
PA-3.0.5 [strawberry-linux.com] (assembler)
RTL8019AS (RealTek Ethernet Controller) [realtek.com.tw]
Experimental NTP Servers [jst.mfeed.ad.jp]
RFC958 (NTP)
RFC2030 (SNTP)
Electronics Contest (ELECON) @UEC [elecon.ee.uec.ac.jp]
NTP Clock another web page on ELECON@UEC [elecon.ee.uec.ac.jp]
UNIX では ntpdate, ntpq, xntpd などの NTP クライアント、サーバがあります。
既存のものを重複して作るのも意味が無いですし、素人には ntpdate より高性能で軽いプログラムなど書けません。
実際にカーネルの時刻同期をするのなら ntpdate などを利用することをお勧めします。
ここでは NTP (UDP) プロトコル, Perl でのネットワークプログラミングの勉強を兼ねて Perl スクリプトを書いてみました。
秒の整数部までを NTP サーバから取得して表示するだけのスクリプトです。
ntp.pl.gz
packet to sent:
--- B32 B32 B32 B32 B64 B64 B64 B64 ---
#送信する Packet を unpack() して表示
01234567890123456789012345678901
0: 00001011000000000000000000000000
1: 00000000000000000000000000000000
2: 00000000000000000000000000000000
3: 00000000000000000000000000000000
4: 0000000000000000000000000000000000000000000000000000000000000000
5: 0000000000000000000000000000000000000000000000000000000000000000
6: 0000000000000000000000000000000000000000000000000000000000000000
7: 0000000000000000000000000000000000000000000000000000000000000000
Host: ftp07.apple.com, Port: 123
returned packet:
--- B32 B32 B32 B32 B64 B64 B64 B64 B*---
#受信した Packet を unpack() して表示
01234567890123456789012345678901
0: 00001100000000110000010011110001
1: 00000000000000000000011100110100
2: 00000000000000000000101001111011
3: 01000000101010100110001000001010
4: 1011111011111011101001010110000000010011110010100111000000000000
5: 0000000000000000000000000000000000000000000000000000000000000000
6: 1011111011111011101001011000110010110011010010010110000000000000
7: 1011111011111011101001011000110010110011010110010001000000000000
8:
--- N* ---
#受信した Packet を unpack() して表示(ネットワークバイト順による long 値)
0: 201524465
1: 1844
2: 2683
3: 1084908042
4: 3204162912
5: 332034048
6: 0
7: 0
8: 3204162956
9: 3007930368
10: 3204162956
11: 3008958464
$TransmitTime: 3204162956
NTP time: Sun Jul 15 14:15:56 2001 $ntp: 995174156
localtime: Sun Jul 15 14:15:57 2001 time(): 995174157
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0(0) |LI | VN |Mode | Stratum | Poll | Precision |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1(1) | Root Delay |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2(2) | Root Dispersion |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3(3) | Reference Identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
4 | Reference Timestamp (64) |
(4,5) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
5 | Originate Timestamp (64) |
(6,7) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
6 | Receive Timestamp (64) |
(8,9) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
7 | Transmit Timestamp (64) |
(10,11)| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Key Identifier (optional) (32) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| |
| Message Digest (optional) (128) |
| |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
64bit timestamp format
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Integer Part |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Fraction Part |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
RFC2030 (SNTP)
Oreily "Perl Cookbook" section 17.4 (UDP client)
Network Time Protocol project [ntp.org]
SNTP@IT 用語辞典 [atmarkit.co.jp]
Microchip社のPICマイコンをLinuxで開発する場合の方法について書きます。
秋月のライタとPAアセンブラを利用します。
いろいろな言語で開発できるようですが、ここでは一番一般的なアセンブラを使用します。
アセンブラのなかでも Microchip 社の配布している MPLAB に付属している MPASM ではなく、秋月電子通商の PIC ライタキットに付属していた PA アセンブラを使用します。PA アセンブラ開発者の方のサイト [strawberry-linux.com] には Linux 版の PA があります。
この PA は、後ほどパッチを当てなければならないので、make する前にライタソフトの準備をします。
秋月の PIC ライタキット用の Linux 版ライタソフト [jcom.ne.jp] を作って公開されている方がいます。README を良く読んでください。現時点 (Sep 2001) では PA にパッチを当てるように指示が出ているのでその通りにします。次に、このライタソフトを make し、最後に PA を make します。PA の make の際に yacc と lex が必要なので、予め bison (yacc) と flex (lex) をインストールしておきました。
これで Linux での PIC 開発環境が整います。PA のシミュレータやデバッガが無く、MPLAB に比べるとまだまだですが、最低限の開発はできます。シミュレータなどご存知の方は教えてください。
EditorでPAアセンブラを書いてからアセンブルします。
$ pa -m sample2.asm 16f84.h
つぎに、ライタをシリアルポートに接続してアセンブルされたhexファイルを書き込みます。
# akipic -p /dev/ttyS0 -d 16f84a -e Erase OK # akipic -p /dev/ttyS0 -d 16f84a -w sample2.hex ID information... 0xf 0xf 0xf 0xf config word status... CP disable PWRTE enable WDTE disable FOSC HS Program memory = 0056 Data memory = 003F Config word = 0007
他にもオプションなどいろいろな機能があるので、PA や AKIPIC 付属のドキュメントを読んでください。
使ったことはありませんが、秋月のライタやPAアセンブラではなくて
GNUPIC [gnupic.org]
というものもあります。simulatorなど開発環境が充実しるようです。
また、トランジスタ技術 2000年9月号には PA を Linux で使う詳しい記事が掲載されています。