JJYクロック
by K.I
2004/04/27〜
Index
概要
基板
プログラムについて
JJYタイムコードの解析
メモ
改訂履歴
概要
JJYによるクロックを作ってみる。
NPCのJJYの受信IC、9501のモジュールを使用したので無調整で簡単に受信出来た。
PIC16F876により、9501モジュールからJJYタイムコードを解析して、表示する。
それだけじゃ、つまらないので、
EAGLEによる回路図、基板作成に挑戦。→
OLIMEX
で発注
C言語(Hitech-C)によるプログラムに挑戦
[top]
基板
解析のために、PIC16F876を使用した基板を作成した。これは、
ePLL書き込み
等に使用したものと同じ構成だが、以下のように。
9501モジュール用のコネクタを追加して、簡単に受信部分を接続可能にした。
9501用に、3.3Vのレギュレータを追加。
同調回路のコイルとコンデンサは大きいものだったので、基板側に置くようにした。9501モジュール上に載っている場合は、それを接続しなければ良い。
今回、初めて
EAGLE
を使って回路図と基板を設計した。
手持ち部品に合わせたライブラリ作成に1週間以上掛かった。
OLIMEX
で基板の発注をしてみたが、2週間程で基板が送られてきた。
本当はコイルも巻きたかったが、とりあえず電波時計をバラして取り出したコイルとコンデンサを利用した。
EAGLEによる
回路図
EAGLEによる
基板図
ちなみにこの回路図のRS232Cレベルコンバータ付近の配線、及びシリアルポートのDSUB9コネクタの配線は間違っている。
このように
配線しなおす必要がある。
基板が出来上がっていたので、パターンを切ったり繋いだり、RS232Cレベルコンバータを1ピンずらして取り付けたりで大変だった。
[top]
プログラムについて
今回は、アセンブラではなく初めてC言語で記述してみた。
情報が多いCSS-Cを使いたかったが、今回はHitech-Cを選択した。→自分の環境ではCSS-Cで不具合があったことが大きいが、Hitech-Cは簡単にインストール出来て問題も無かったため。
Hitech-Cのフリー版は、使用出来るCPUが限られており例えば16F877は使えるが、16F876は対象じゃない。でもメモリマップは同一なので多分使えるはずだ。→でも2Kワードの制限があるけどね。
とは言っても、以下のようにいろいろ問題点があった。
Hitech-Cは極端に情報が少ない。
これ
ぐらいかなぁ→参考にさせていただきました。→情報量の少なさは致命的かも。やっぱりCSS-Cなのかなぁ。。。
基本的なルーチンを、全てC言語で書き直す必要がある。→ちょっと時間が掛かるなぁ
アセンブラとアルゴリズム自体変えた方が良い場合が多かった。
あと当然ながら、冗長なコードになる。今回は時間が1秒単位なので余裕だったが、ぎりぎりの時はアセンブラで書くしか無いかもしれない。
JJYタイムコードの解析
NICT
1
による
タイムコードの詳細
とりあえず、タイムコードをそのまま表示するだけの単純なプログラムにする。フローは以下を参照
100ms毎に、タイムコードをチェック、マーカー、'0'、'1'を判断する
タイムコードの立ち上がりで、秒単位のカウントアップ
マーカーにより、10秒単位のリセット
マーカーの連続で、0秒にリセット
基本的には、0.4秒のコードを無視して、マーカーを除いた8ビットを16進値で表示
40秒台は、0.1秒のコードを無視して、マーカーを除いた8ビットを16進値で表示
50秒台は、0.7秒,0.8秒のコードを無視し、最後のマーカーを除いた7ビット(最上位ビットは0)を16進値で表示
作成したプログラム
ソースコード
mod9501.c
ディレイ用ライブラリ
delay.c
,
delay.h
LCD用ライブラリ
lcd.c
,
lcd.h
→ポートの配線が全く違うので、サンプルコードを大幅に書換え
1
以前は通信総合研究所という組織だったが、統合されて名前が変わったみたい。名前を変えるのは良いけど資料はもっと分かりやすい場所に置いて欲しいよね。探しちゃったよ。
[top]
メモ
16F873から、16F876に変更したことでEEPROMに書き込めなかった問題については、ユーザメモリのマップの違いによるものだった。とりあえずバンク2で共通に読み込める領域に持っていくことで、問題無く書き込めるようになる。→今回はEEPROMを使っていないけれど、これからは気兼ねなく16F876が使えるよね。
タイムコードのフォーマット決めたのは誰なんだろう。あんまり考えられてない気がする。プログラムしてみると、いろいろ気になった。
日付が、月日ではなく1月1日からの通算日になっているが利点があるんだろうか?→少なくとも、時計では通算日なんか使わないよなぁ。→計算するのは面倒だよなぁ。。。
データの区切りに一貫性がない。特に40秒台と50秒台は1ビットずらしておいてくれれば、例外的に処理する必要無いんだけどなぁ。
0秒はマーカー2回だが、確定するのは1秒後になってしまう。マーカーを1ビット手前にずらしてくれれば、簡単に0秒合わせが出来るのに。。。→これ、一番の問題かもね。
分の確定も10秒後、時の確定も20秒後というのも扱いにくいなぁ。最低1分以上の時間が必要になるよなぁ。→まぁ、これについては1分手前にずらすのは、フォーマット上凄く変だからしょうがないんだけどね。
プログラムで、50ms毎にチェックするつもりで書いたんだけど、100ms毎みたいだなぁ。。。何故なんだろう。
EAGLEのライブラリの部品のサイズが、結構間違っていたので修正が必要。
EAGLEのBoardで、GNDが繋がっていないのが3箇所あった。1箇所は回路図でも繋がっていなかったが、それ以外は回路図はOK。削除して接続し直すと直る。ちょっとBUGっぽい。
回路図にテスト端子を入れておくべきだったなぁ。あと、9501と16F873の間に保護抵抗も入れとくべきだろうね。
[top]
改訂履歴
[040505] 基本動作を確認
現状では、ボタン入力は全て無効
[top]
[電子工作関連に戻る]
コメント欄の表示/非表示
⇒ Disqusの広告がうるさすぎるので基本は非表示にしました
Please enable JavaScript to view the
comments powered by Disqus.
comments powered by
Disqus