Skip to content

geodenx/ntp_clock

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NTP Clock using PICNIC

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

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

詳細仕様書

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. Please see the above spec.pdf (in Japanese) for further details.

作り方 (簡易版)

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

  1. PICNIC組み立て
  2. 拡張I/O回路作製

(最低限の機能限定ならば、 IP アドレスなどの設定をアセンブル時にすれば拡張I/O基板を作製しなくても使用可能です。) PICNIC の拡張基板用コネクタに接続する RA0-3 にプッシュスイッチをつけた拡張基板を作る。 回路図

  1. コーディング, アセンブル ntp0067.asm (EUC)

アセンブラソース (ntp*.asm) に IP アドレス、ネットマスク、ゲートウェイアドレス、NTP サーバアドレスを書き込む (拡張I/O基板としてスイッチを作ればこれらの IP などの設定は後からスイッチで変更できます)。

  1. PA-3.0.5 でアセンブラソースファイルをアセンブル

  2. PIC書き込み

生成された hex ファイルを PIC ライタで PIC16F877-20MHz に書き込む。

Configuration bit: 3F32

  1. 完成

ISA-Bus NIC NTP Clock

ほぼPICNICの回路図のまま ISA-Bus NIC [Planex ENW-2401P-T](http://www.planex.co.jp/product/adapter/enw2401pt.shtml) を利用して NTP Clock を作成してみました。 PIC のクロックは 12.8000 MHz の高精度水晶モジュールを使用しています。 これでネットワークに繋がらなくても月差が数秒になります。 せっかく時間精度がよくなったのでネットワーク遅延による誤差も補正できるようにしました。 1時間に一度自動的に較正します。 この二つの機能によって、+-0.02 sec の誤差で常に JST を保持することができます。

コレガの ISA-Bus NIC CG-E2ISATは RTL8019AS の JP ピンを H に上げないと動きません。 また、他の NIC は確認していません。

マザーボード基板データ (PCB): isanic4.pdf

UEC Electronics Contest (2001)

NTP Clock は UEC Electronics Contest にエントリし、総合優勝することが出来ました。関係者の皆様に感謝いたします。

NICT NTP Client Contest (2006)

高精度バージョンの ISA-Bus NIC NTP Clock 「時缶 (トキカン)」が独立行政法人情報通信研究機構 NTP クライアントコンテスト で優秀賞を頂きました (December 15, 2006).

開発者向け情報

Contributors

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

References

Perl NTP Client

UNIX では ntpdate, ntpq, xntpd などの NTP クライアント、サーバがあります。 既存のものを重複して作るのも意味が無いですし、素人には ntpdate より高性能で軽いプログラムなど書けません。 実際にカーネルの時刻同期をするのなら ntpdate などを利用することをお勧めします。

ここでは NTP (UDP) プロトコル, Perl でのネットワークプログラミングの勉強を兼ねて Perl スクリプトを書いてみました。 秒の整数部までを NTP サーバから取得して表示するだけのスクリプトです。 ntp.pl

実行結果

$ perl ntp.pl
packet to sent:
--- B32 B32 B32 B32 B64 B64 B64 B64 ---
   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*---
   01234567890123456789012345678901
0: 00001100000000110000010011110001
1: 00000000000000000000011100110100
2: 00000000000000000000101001111011
3: 01000000101010100110001000001010
4: 1011111011111011101001010110000000010011110010100111000000000000
5: 0000000000000000000000000000000000000000000000000000000000000000
6: 1011111011111011101001011000110010110011010010010110000000000000
7: 1011111011111011101001011000110010110011010110010001000000000000
8: 
--- N* ---
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                         |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

References

  • 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 に比べるとまだまだですが、最低限の開発はできます。 シミュレータなどご存知の方は教えてください。

使い方

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 付属のドキュメントを読んでください。

FYI

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

About

NTP Clock for PICNIC (2001)

Topics

Resources

Stars

Watchers

Forks