gombeのブログ

マイコンの電子工作系PIC32/KiCad/C/C++/3D/

時計の設計(時刻カウントについて)

時刻のカウントは一般的な製品では多くがRTCを搭載しています。これはリアルタイムクロックと呼ばれていて中身はただのカウンタです。水晶発振子の発振回路が入っている場合が多いです。で、今回のマイコンは入ってません(爆

しかしながら「もどき」なら入ってましたのでそれを使います。TMR1には同発振回路と最大16bitのカウンタがあります。発振回路は32.768k(215Hz非常に都合が良い‼︎)の発振ができます。カウンタが16bitだと最長で2sのカウントが可能です。スリープ時という低消費電力ステージでもカウント可能でオーバーフローでおきます。プリスケーラをセットすることでもっと長周期もできますがね。で、今回は秒針を使わないので4sにセットします。でもこれにはもう一つのわけがあって一つ目は使っているマイコンが8bitなのでどうあがいても非同期で16bitの値を取得できません。できたとしてもそれは正確な値の保証はありません。また、再設定時にも誤差を含み、時計として精度が出ません。なのでカウント値は読み出しも書き込みもしません。(あ、きちんと初期化はしますよ)オーバーフローで割り込みがかかりますのでそれでその時に処理をします。

カウントはプログラム処理で行います。まあ当たり前なんですが15カウントで1分ですね。電源損失時はバックアップコンデンサで動きますがこの時はマイコンはSleepにしておきます。Sleep時にもカウントはできます。処理したらまたすぐに復活するまでSleepにしますよ。Sleep時にはタイマーが動いているのでちょっと電流は流れますがそんなに流れないからコンデンサである程度はバックアップ可能です。