でんかのブログ

テクニカル系ネタをメインに、つれづれなるままに書いていきます。

灯台下暗し

電波時計同期装置ですが、時間帯や日によって安定して同期できたり、なかなか同期できなかったりしてしまい、安定性の無さで悩んでいました。(´・ω・`)

昨日は安定しなかったのですが、日付が変わる辺りで同期に成功していて、今日も試してみたら問題なく動作していました。で、ふと頭を過ったバグの予感…∑(´Д`;)

標準電波のJJYフォーマットでは二つのパリティを入れます。計算式は以下の通りです。

PA1 = (20h+10h+8h+4h+2h+1h) mod 2
PA2 = (40m+20m+10m+8m+4m+2m+1m) mod 2

ここでhは時間、mは分です。つまりPA1は24時間制での時間の値から計算されるパリティ、PA2は同様に分の値から計算されるパリティです。ですが、制御プログラムのソースを見ると…以下抜粋です。

jy_t = t_st->tm_yday + 1;
out0(fd,sec);
out0(fd,sec);
if (jy_t - 200 >= 0) { out1(fd,sec); jy_t -= 200; pa1 = !pa1; } else out0(fd,sec);
if (jy_t - 100 >= 0) { out1(fd,sec); jy_t -= 100; pa1 = !pa1; } else out0(fd,sec);
out0(fd,sec);
if (jy_t -  80 >= 0) { out1(fd,sec); jy_t -=  80; pa1 = !pa1; } else out0(fd,sec);
if (jy_t -  40 >= 0) { out1(fd,sec); jy_t -=  40; pa1 = !pa1; } else out0(fd,sec);
if (jy_t -  20 >= 0) { out1(fd,sec); jy_t -=  20; pa1 = !pa1; } else out0(fd,sec);
if (jy_t -  10 >= 0) { out1(fd,sec); jy_t -=  10; pa1 = !pa1; } else out0(fd,sec);
pos_marker(fd,sec);

…tm_ydayって書いてありますね。∑(´Д`;)

これは年月日の情報を計算して出力している部分です。なのになぜかPA1の値を計算しちゃってます。ちなみに時間の出力ロジックでもPA1をちゃんと計算してます。つまり“日によってPA1の値は反転してしまう”ワケなのです…これで日によって安定しなかった理由がハッキリしました…。゚(ノД`)゚。

原因は時刻出力のロジックをコピペして年月日の出力ロジックを作ったのですが、パリティ計算の部分を削除し忘れてたのです…。゚ヽ(゚`Д´゚)ノ゚。

ソフトウェア作るのは慣れっこだけど、ハードウェアは超初心者だからというワケで、ハードウェアばかり疑ってたのですが、原因はソフトウェアでした…灯台下暗し、ですね。。゚(ノД`)゚。

というワケで、問題がなかなか解決しない時は自信がある部分ほど疑って掛かるほうが良いというコトですね…よく言われるコトですが、ひさびさに身に染みて理解しました…(´・ω・`)