目次PIC回路集デジタル時計


デジタル時計 動作確認


実際に回路を組んで動作確認を行ったところ以下のような改善点がありました。

時計の動作が遅い
    1秒のカウント時間を計測すると、正確な時計に比べて遅れてしまいました。
    調べてみると、1秒の時間を作る処理に誤りがありました。20ミリ秒を50回カウントして1秒を作るのですが、最初は50と比較してそれ以下であれば、カウンターを更新する処理にしていました。この場合、カウントアップを後から行っているので1カウント余分にカウントすることになります。比較値を49に修正して正確な1秒を作ることができました。


ロータリエンコーダで時刻修正ができない
    ロータリエンコーダを回すと時計表示全体が一瞬点滅して時刻更新ができませんでした。また、時刻修正する桁を指定してもロータリエンコーダを回すと時10位の位置に戻ってしまいました。
    原因はエンコーダ回路と接地間に入れていたコンデンサが悪影響していました。コンデンサには0.1μFを使用していました。ロータリエンコーダを回してA端子またはB端子が+5Vに接続されるとコンデンサに急激に電流が流れ、+5Vの電圧が下がっていました。そのため、PICの電源が一瞬OFFになり初期化されていました。
    コンデンサはロータリエンコーダのチャッタリング防止用に付けたのですが、今回の時計ではソフトウェアでチャッタリングを防止しているので必要ありません。コンデンサを外すことによりPICが初期化することはなくなりました。
    ただ、それでもエンコーダでの時刻修正が出来ませんでした。この原因はエンコーダと接地間に入れている抵抗値が10KΩと大きく、エンコーダがOFFの状態でもPICの端子の電圧が高く、Lレベルにならなかったのです。抵抗値を1KΩに変更して正常に時刻修正ができるようになりました。


PM1xでの時1位の時刻修正が異常
    PM0xの状態で時1位を"9"に設定し、その後、時10位をPM1xに変更し、再度、時1位をカウントアップすると時1位が異常(数字にならない)表示されました。
    時1位の時刻修正は時10位がPM1xの場合には0,1,2の3種類のみ設定出来るようにしています。しかし、上限判定で2と等しいかどうかだけで判定したため、時1位が9の場合には2でないということで単純にカウントアップしていました。そのため、7セグメントテーブルを越えたデータを参照し、異常な表示となりました。
    処理を「2以上」で判定するようにし、正常に修正できるようになりました。
    同様にPM1xでのカウントダウン処理でも内容が「0」かどうかだけで判定していたので正常な時刻修正ができませんでした。時1位の内容が「3以上」の判定を入れて正常に修正できるようになりました。

    今回の時計では時10位をAM0xまたはPM0xの状態で時1位に9などを設定し、その後、時10位をAM1xまたはPM1xにするとAM19時とかPM19時とかになります。これに関しては特別な処理はしていません。


時刻設定時の点滅周期を200ミリ秒にした
    最初、この点滅周期を500ミリ秒にしていました。500ミリ秒だと時刻を速く修正すると表示が消えているときに数字が変わり、少し見づらいので、200ミリ秒周期に修正しました。


時刻設定モードに切り替わるときに設定桁は時1位になってしまう
    時刻設定モードに切り替わる時は設定桁として時10位を指定しているのに、時1位の位置になってしまいました。
    原因はRB7のラストルックデータを設定しなかったためでした。RB7を連続して2秒間押して時刻設定モードになりますが、RB7のラストルックが0だと、RB7を押し直していないのにRB7が変化したとして設定位置を1桁移動していました。時刻設定モードになるときにRB7のラストルックを1に設定しておけば、次にRB7が押されたときに桁が移動するようになります。


時刻設定モードから抜けるとき、0秒設定がずれる
    時刻設定が終了し、0秒に合わせて0秒設定スイッチを押してもすぐに1秒になったりして、秒の設定に誤差が生じました。原因は時刻設定モードから時計モードになるときに1秒をカウントするカウンタをクリアしていなかったためでした。時刻設定モードになるときに1秒カウンタをクリアすることで解決しました。0秒設定のチェックは20ミリ秒周期で行われるので最大20ミリ秒の誤差は生じますが、実用上は問題ありません。


1日に約1秒遅れる
    連続動作をさせると、1日に約1秒遅れてしまいました。最初はPLL発振器がTVのカラーバースト信号に同期していないのかと思い、PLL発振器の動作確認をしていました。しかし、周波数カウンタで計測すると正常に10000.0000KHzで動作しています。
    原因は10MHzのクロックを1/200000にするCPLDのロジックに誤りがありました。CPLDでは1/100000のカウンタと1/2のカウンタを使用して1/200000のカウンタにしていますが、1/100000のカウント判断をするロジックで99999で判定するべきところを100000で判定してしまいました。そのため1/200002のカウンタとなっていました。修正前のロジックの場合100000秒で1秒の遅れになります。1日は86400秒ですから、1日で0.86秒遅れることになります。
    CPLDのカウンタの出力は50Hzで計算では49.9995Hzになります。詳細に計測すれば誤りに気が付いたかも知れません。