Home > NTP Clock

Last modified: Jan 27, 2007


Table of Contents

  • NTP Clock
  • NTP Client (Perl)
  • PIC development environment for Linux

Abstract

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).

photo: NTP Clock strip Click to enlarge.


Staff

  • YOKOBORI Masayuki
    miyabi at uranus.interq.or.jp
    企画/原案, Clock routine, User Interface and others.

  • OKAZAKI Atsuya

    Network routine

感想、質問等については にお願いします。

NTP Clock

block diagram 秋月電子通商の PICNIC を改造し、NTP (Network Time Protocol) を実装した時計を開発しました。 正確な時刻をインターネット上の NTP サーバ (情報通信研究機構) から取得し、その時刻情報を時計の較正に利用します。

PICNIC の PIC16F877 のファームウェアを書き換えるだけで LCD に日本標準時 (JST) を表示させることが可能です。 さらにスイッチ付き拡張 I/O 基板を付ければ、 IP アドレス、ネットマスク、ゲートウェイアドレス、NTP サーバアドレスの設定を焼き込まなくても設定可能になります。 詳しくは詳細仕様書を御覧ください。

詳細仕様書 spec.pdf (154 KB)

NTP Clockの作り方 (簡易版)

細かい情報は詳細仕様書に書きました。参照してください。

  1. PICNIC組み立て
  2. 拡張I/O回路作製
    (最低限の機能限定ならば、 IP アドレスなどの設定をアセンブル時にすれば拡張I/O基板を作製しなくても使用可能です。)
    PICNIC の拡張基板用コネクタに接続する RA0-3 にプッシュスイッチをつけた拡張基板を作る。
    回路図 ext2.ce2.png (exported image)
  3. コーディング, アセンブル
    ntp0067.asm (EUC)
    アセンブラソース (ntp*.asm) に IP アドレス、ネットマスク、ゲートウェイアドレス、NTP サーバアドレスを書き込む。
    (拡張I/O基板としてスイッチを作ればこれらの IP などの設定は後からスイッチで変更できます。)
    PA-3.0.5 でアセンブラソースファイルをアセンブル
  4. PIC書き込み
    生成された hex ファイルを PIC ライタで PIC16F877-20MHz に書き込む。
    Configuration bit: 3F32
  5. 完成
    photo: NTP Clock case
    Click to enlarge.

ISA-Bus NIC NTP Clock

isanic.jpg ほぼ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

UEC Electronics Contest (2001)

NTP Clock は UEC Electronics Contest にエントリしています。
総合優勝することが出来ました。関係者の皆様に深く感謝いたします。
配布資料:簡易仕様書 2nd edition spec3.pdf 54KB
プレゼンテーション pr.ppt 551KB
展示ポスタ poster.ppt 87KB

NICT NTP Client Contest (2006)

高精度バージョンの 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に落してください。

Reference

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]



NTP Client (Perl)

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

NTP Message Format (RFC2030 Section 4)

                           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                         |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Reference

RFC2030 (SNTP)
Oreily "Perl Cookbook" section 17.4 (UDP client)
Network Time Protocol project [ntp.org]
SNTP@IT 用語辞典 [atmarkit.co.jp]



PIC development environment for Linux

Microchip社のPICマイコンをLinuxで開発する場合の方法について書きます。
秋月のライタとPAアセンブラを利用します。

Install

いろいろな言語で開発できるようですが、ここでは一番一般的なアセンブラを使用します。
アセンブラのなかでも 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 付属のドキュメントを読んでください。

Other information

使ったことはありませんが、秋月のライタやPAアセンブラではなくて GNUPIC [gnupic.org] というものもあります。simulatorなど開発環境が充実しるようです。
また、トランジスタ技術 2000年9月号には PA を Linux で使う詳しい記事が掲載されています。