秋月電子通商の 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.
細かい情報は詳細仕様書に書きました。参照してください。
- PICNIC組み立て
- 拡張I/O回路作製
(最低限の機能限定ならば、 IP アドレスなどの設定をアセンブル時にすれば拡張I/O基板を作製しなくても使用可能です。) PICNIC の拡張基板用コネクタに接続する RA0-3 にプッシュスイッチをつけた拡張基板を作る。 回路図
- コーディング, アセンブル ntp0067.asm (EUC)
アセンブラソース (ntp*.asm) に IP アドレス、ネットマスク、ゲートウェイアドレス、NTP サーバアドレスを書き込む (拡張I/O基板としてスイッチを作ればこれらの IP などの設定は後からスイッチで変更できます)。
-
PA-3.0.5 でアセンブラソースファイルをアセンブル
-
PIC書き込み
生成された hex ファイルを PIC ライタで PIC16F877-20MHz に書き込む。
Configuration bit: 3F32
- 完成
コレガの ISA-Bus NIC CG-E2ISATは RTL8019AS の JP ピンを H に上げないと動きません。 また、他の NIC は確認していません。
マザーボード基板データ (PCB): isanic4.pdf
NTP Clock は UEC Electronics Contest にエントリし、総合優勝することが出来ました。関係者の皆様に感謝いたします。
- 配布資料:簡易仕様書 2nd edition spec3.pdf
- プレゼンテーション pr.ppt 551KB 展示ポスタ
- poster.ppt
高精度バージョンの ISA-Bus NIC NTP Clock 「時缶 (トキカン)」が独立行政法人情報通信研究機構 NTP クライアントコンテスト で優秀賞を頂きました (December 15, 2006).
- NICT 公開NTP クライアントコンテスト [nict.go.jp]
- 「NICT公開NTPクライアントコンテスト」授賞者決定! (報道資料) [nict.go.jp]
- 情報通信研究機構、“NICT NTP クライアントコンテスト”の審査結果を発表 [impress.co.jp]
- 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に落してください。
- YOKOBORI Masayuki miyabi at uranus.interq.or.jp 企画/原案
- Clock routine, User Interface, Network routine, and others. OKAZAKI Atsuya
- 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
実行結果
$ 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
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 に比べるとまだまだですが、最低限の開発はできます。 シミュレータなどご存知の方は教えてください。
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 というものもあります。 simulatorなど開発環境が充実しるようです。 また、トランジスタ技術 2000年9月号には PA を Linux で使う詳しい記事が掲載されています。




