今日は結構ToDoを消化する事ができた。
目玉は、受信データの正常判定だろうか。
今まではJJY信号と一緒にやってくるパリティのチェックだけ
やっている状況だったのだけど、たまに変なデータが来て
パリティチェックを通ってしまう(2bit化ければパリティで
正常性を判定出来ないのだ)事例が見られて、受信データの
健全性を担保する何かを実装する必要があった。
・確率分布を取ってピークサーチ
・パリティチェックだけ
ネットで他の作者によって提案されているJJY時計のうち
ソースが公開されているものは、概ねこの2つだったように思う。
前者は(私に)荷が重い、後者はデータの健全性を担保出来ない
という事で、何かラクに実装出来てそれなりに効果が期待出来る
ノイズ除去の方法は無いか と思って思いついたのが
複数回のデータ受信によって、n回同じデータが取得出来れば
確からしいデータだろう。 という方法(n連一致)だ。
今回はサンプル数(n)を3にして、同じ値が3つ連続すれば
正しい値であるとして採用するロジックにしてみた。
今の所は正しい値のみを引いてくれているように見える。
今まではJJYの受信パルスを評価する機能に掛かりっきりで
ユーザI/Fの方に手が回っていなかったのだが
今回、入出力仕様案として策定したI/F仕様案を若干修正して
コマンド入力、データ出力のフォーマットを作り込んだ。
時刻、年月日の表示は勿論だが、JJYに同期した後の時刻なのか
そうではないのか、受信したのであればどちらの周波数なのか。
その辺りが1つのデータを見る事で分かるようにしたつもりだ。
★同期してないとき
*,0000/00/00_00:00:03.913*
★40kHzで同期
4,2011/03/18_18:18:04.983*
★60kHzで同期
6,2011/03/18_18:21:08.652*
先頭の1文字が、現在のJJY時計の状態。
*は未同期、4は40kHzに同期済み、6は60kHzに同期済み だ。
その後は分かるね。 最後はmSec単位の秒時刻。
…と、ここまで作り込んできて今更気がついた事があった。
時→日の連携を作り込んでおらず、非常に長い1日となっていた。
せっかく、JJYからの受信データに含まれる通算日を
グレゴリオ暦に置き換える処理を作ったのだから、活用したい。
日付変更時に、バックグラウンドで管理している”通算日”に
インクリメントし、年月日を再構成するのだ。
以下結果。
★日付変更
4,2011/03/18_23:59:58.814*
4,2011/03/18_23:59:59.782*
4,2011/03/19_00:00:00.767*
4,2011/03/19_00:00:06.115*
きちんと18日から19日に出来ているようだ。
今日のまとめ。↓
★やったこと
・受信データの正常判定(3連一致)実装
・JJY同期 / 内部時計モード遷移実装
・出力フォーマットを仕様通りに
・入力コマンドを追加(40/60kHz周波数指定での強制受信を追加)
★ToDo
・再同期処理
・受信バンド切り替えのロジックを考える。
Comments