実際に回路を組んで動作確認を行ったところ以下のような改善点がありました。
時計の動作が遅い
調べてみると、1秒の時間を作る処理に誤りがありました。20ミリ秒を50回カウントして1秒を作るのですが、最初は50と比較してそれ以下であれば、カウンターを更新する処理にしていました。この場合、カウントアップを後から行っているので1カウント余分にカウントすることになります。比較値を49に修正して正確な1秒を作ることができました。 ロータリエンコーダで時刻修正ができない
原因はエンコーダ回路と接地間に入れていたコンデンサが悪影響していました。コンデンサには0.1μFを使用していました。ロータリエンコーダを回してA端子またはB端子が+5Vに接続されるとコンデンサに急激に電流が流れ、+5Vの電圧が下がっていました。そのため、PICの電源が一瞬OFFになり初期化されていました。 コンデンサはロータリエンコーダのチャッタリング防止用に付けたのですが、今回の時計ではソフトウェアでチャッタリングを防止しているので必要ありません。コンデンサを外すことによりPICが初期化することはなくなりました。 ただ、それでもエンコーダでの時刻修正が出来ませんでした。この原因はエンコーダと接地間に入れている抵抗値が10KΩと大きく、エンコーダがOFFの状態でもPICの端子の電圧が高く、Lレベルにならなかったのです。抵抗値を1KΩに変更して正常に時刻修正ができるようになりました。 PM1xでの時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ミリ秒にした
時刻設定モードに切り替わるときに設定桁は時1位になってしまう
原因はRB7のラストルックデータを設定しなかったためでした。RB7を連続して2秒間押して時刻設定モードになりますが、RB7のラストルックが0だと、RB7を押し直していないのにRB7が変化したとして設定位置を1桁移動していました。時刻設定モードになるときにRB7のラストルックを1に設定しておけば、次にRB7が押されたときに桁が移動するようになります。 時刻設定モードから抜けるとき、0秒設定がずれる
1日に約1秒遅れる
原因は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になります。詳細に計測すれば誤りに気が付いたかも知れません。 |