概要JJYによるクロックを作ってみる。NPCのJJYの受信IC、9501のモジュールを使用したので無調整で簡単に受信出来た。PIC16F876により、9501モジュールからJJYタイムコードを解析して、表示する。それだけじゃ、つまらないので、EAGLEによる回路図、基板作成に挑戦。解析のために、PIC16F876を使用した基板を作成した。ePLL書き込み等に使用したものと同じ構成だが、以下のように。9501モジュール用のコネクタを追加して、簡単に受信部分を接続可能にした。9501用に、3.3Vのレギュレータを追加。同調回路のコイルとコンデンサは大きいものだったので、基板側に置くようにした。9501モジュール上に載っている場合は、それを接続しなければ良い。EAGLEを使って回路図と基板を設計した。手持ち部品に合わせたライブラリ作成に1週間以上掛かった。OLIMEXで基板の発注をしてみたが、2週間程で基板が送られてきた。本当はコイルも巻きたかったが、とりあえず電波時計をバラして取り出したコイルとコンデンサを利用した。基板図ちなみにこの回路図の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秒単位なので余裕だったが、ぎりぎりの時はアセンブラで書くしか無いかもしれない。タイムコードの詳細とりあえず、タイムコードをそのまま表示するだけの単純なプログラムにする。→ポートの配線が全く違うので、サンプルコードを大幅に書換え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。削除して接続し直すと直る。回路図にテスト端子を入れておくべきだったなぁ。あと、9501と16F873の間に保護抵抗も入れとくべきだろうね。