マイコン用のリアルタイムクロックRTC-8564NBについて、その機能と使用方法について、これまで製作したものを元に紹介します。
■参考資料■
Real Time Clock Module RTC-8564JE/NB アプリケーションマニュアル :セイコーエプソン
Real Time Clock Module RTC-8564JE/NB カタログ :セイコーエプソン
1.概要
RTC-8564NBは、セイコーエプソン製のリアルタイムクロックICで、I2Cバスインタフェースで容易にマイコンと接続できるものです。
リアルタイムクロック(以降RTC)とは、マイコンに接続して使う時計ICのことで、ほとんどの場合マイコンの電源がOFFの状態でも計時を続けるようにバックアップ電源を付けて使用します。
RTCには多くの種類が発売されていますが、RTC-8564NBは水晶振動子を内蔵し、“年,月,日,曜日,時,分,秒”カウンタと、時刻アラームおよび定周期タイマ機能、そしてI2Cバスインタフェースを持ったRTCです。
電源電圧範囲が1.8~5.5Vと広いため、マイコンの電源が3.3Vでも5.0Vでも接続できて便利です。また、時計の精度も月差±1分程度と、RTCとして高い精度といえます。
備考:ここでは、IICバス(Inter IC Bus)をI2Cと表記します。
2.ブロック図とピン配置
下記にRTC-8564NBのブロック図とパッケージを示します。
(エプソン RTC-8564NBアプリケーションマニュアルより)
(エプソン RTC-8564NBカタログより)
3.秋月電子通商のモジュール
RTC-8564NBは、SONという趣味の電子工作では使いにくいパッケージなので、下の写真のように8ピンDIPに変換したものとして秋月電子通商で販売されています。
このモジュールにはI2Cバスのプルアップ抵抗や割り込み出力/INTをモニタするLEDがついており、基板上のジャンパーをハンダでショートすると使用できるようになっています。ただし、このモジュールをバックアップ電源で動作させる構成の場合は次の点に注意が必要です。
1) 割り込み出力/INTを使う場合に/INTをモニタするLEDを使うと、LEDがバックアップ電源を消費してしまうので、LEDは使わない方がいいです。
2) クロック出力端子CLKOUTからクロックを出力させていると、消費電流が増えるためバックアップ時間が短くなってしまいます。
3) I2Cバスのプルアップ抵抗を使うと、同じバスに接続されたデバイス分だけリーク電流が増えるのでバックアップ時間が短くなってしまいます。もし、他のデバイスの中に電源OFF中にSCLまたはSDA端子がLOWに落ちるデバイスがあると、さらにバックアップ電源を消費してしまいます。
秋月電子通商のRTC-8564NBモジュールの回路とピン配置は下図のようになっています。
4.内部レジスタ
RTC-8564NBの内部レジスタ一覧表を下記に示します。これは「RTC-8564NBプリケーションマニュアル」から抜粋したものです、詳細を知りたい人はそちらを参照してください。
この中で便利な機能として、電源電圧低下を検知する機能があります。
SecondsレジスタのVLビットは、電源電圧がVLOW(最低保持電圧)より下がると“1”になるビットで、RTCのバックアップが無効になったかどうか知ることができます。つまり、マイコンが起動時にVLビットを調べることでRTCを初期化すべきか判断できます。
(エプソン RTC-8564NBアプリケーションマニュアルより)
5.設定
5-1.動作開始
コントロールレジスタ1に、全ビット“0”を書き込みます。
TESTは、メーカーのテスト用ビットなので必ず“0”を書き込んでおきます。
STOPは、時計に日時を設定するとき動作を一時停止させるために使うもので、それ以外では“0”にします。
前に述べたように、SecondsレジスタのVLでバックアップが有効かどうか知ることができます。従って、マイコン起動時のチェックでVL=“0”であれば、以降で説明する各種設定はRTC内に保持されているはずなので、起動のたびに設定する必要はありません。
5-2.定周期タイマ割り込みを使う
一定周期でマイコンに割り込みをかけたい場合、定周期タイマ割り込みを使います(割り込み出力は/INT端子)。設定は次のとおりです。
(1)定周期タイマ割り込み機能制御レジスタのTD1,TD0で、定周期タイマ用カウンタのソースクロックを選択します。この時、TEは“0”にしておきます。
(2)定周期タイマ用ダウンカウンタに、カウント初期値をバイナリでセットします。つまり、この初期値×ソースクロックで、割り込み周期が決まります。
(3)コントロールレジスタ2に、TF=“0”,TIE=“1”と、TI/IPに使用する出力モード(レベル出力の時“0”,パルス出力の時“1”)を書き込みます。
TFは定周期タイマ割り込みの発生を示すフラグですが、“0”を書き込んでリセットしておきます。TI/TPは、定周期タイマ割り込みによる/INT端子出力をパルス出力モード※(繰り返しモード)にするか、レベル出力モード(1回限りモード)にするか選択する設定です。レベル出力モードでは、TFに“0”を書き込むまで/INT端子はLOWのままです。
(4)定周期タイマ割り込み機能制御レジスタのTEを“1”にセットするとタイマ動作開始です(TD1,TD0は先ほどと同じ設定をします)。
定周期タイマ割り込みは、ダウンカウンタが1から0になったとき発生します。レベル出力モードで使用の場合は、割り込みを受け付けたらコントロールレジスタ2のTFに“0”を書き込んで、次の割り込みに備えます。
※tRTN時間だけ/INTを出力し、TFは自動的に“0”になります。tRTNは定周期タイマのソースクロックによって異なります。
注意:コントロールレジスタ2の、AFはアラーム割り込み、TFは定周期タイマ割り込みの発生を示すステータスフラグです。両方の割り込みを使う場合は、AF,TFをプログラムでチェックし、どちらが発生したか判断する必要があります。
5-3.アラーム割り込みを使う
指定した日時に割り込みを発生させたい場合、アラーム割り込みを使います(割り込み出力は/INT端子)。設定は次のとおりです。
(1)アラームレジスタに割り込みを発生させたい日時(曜日,日,時,分)をセットします。
(2)コントロールレジスタ2に、AF=“0”,AIE=“1”を書き込みます。
以上で準備完了です、アラームレジスタと時計の“曜日,日,時,分”が一致したとき、コントロールレジスタ2のAFが“1”になって割り込みが発生します。
割り込み出力の/INT端子はレベル出力なので、割り込みを受け付けたらコントロールレジスタ2のAFに“0”を書き込んで、次の割り込みに備えます。もし、この1度きりで次回の割り込みを使用しないのであれば、AIEに“0”を書き込んでおきます。
セットできる日時は“曜日,日,時,分”ですが、それぞれのAEを“1”にすることによって設定対象から除外できます。例えば、“曜日”と“日”は指定せず、“時,分”のみが一致したとき発生させたい場合は、DayAlarmとWeekdayAlarmのAEに“1”を書き込んでおきます。ただし、全てのAEを“1”にするとアラーム割り込みは発生しません。
注意:コントロールレジスタ2の、AFはアラーム割り込み、TFは定周期タイマ割り込みの発生を示すステータスフラグです。両方の割り込みを使う場合は、AF,TFをプログラムでチェックし、どちらが発生したか判断する必要があります。
5-4.CLKOUT端子からクロックを出力する
CLKOUT端子から出力されるクロックを、別のタイマカウンタのクロックとして使用したり、マイコンの割り込みに利用したりできます。
CLKOUT端子からクロックを出力するには、次のように設定します。
(1)CLKOE端子を“H”レベルにします。ただし、秋月電子通商のRTC-8564NBモジュールは、すでにVDDにプルアップされているため“H”状態です。
(2)CLKOUT出力設定レジスタで、FEに“1”を書き込み、FD1,FD0で目的の周波数を選択します(下図参照)。
(3)CLKOUT出力を停止したい場合は、FEに“0”を書き込みます。
注意1:32768Hz以外を選択しているとき、コントロールレジスタ1のSTOPに“1”を書き込むと、CLKOUT出力が停止します。
注意2:バックアップ電源で動作中もCLKOUT出力を使用していると、使用していない時より消費電流が多いため、バックアップ時間が短くなります。
5-5.日時の設定と読み込み
日時を設定する場合は、次のように行います。
(1)コントロールレジスタ1のSTOPに“1”を書き込み、動作を停止します。
(2)下図に示す時計カウンタとカレンダカウンタに、現在日時を各BCD(BinaryCodedDecimal:2進化10進数)でセットします。
(3)コントロールレジスタ1のSTOPに“0”を書き込み、動作を再開します。
Weekdaysレジスタは曜日を示していて、“0”は日曜,“1”が月曜,“2”が火曜…と続き,“6”が土曜になります。ただし、“7”をセットすると正常動作できなとのことです。
SecondsレジスタのVLは、前述のように“0”を書き込みます。MonthsレジスタのCは、Yearsレジスタが“99”から“00”にオーバーフローしたことを示すものなので、設定時は“0”を書き込みます。
日時を読み込む場合は、コントロールレジスタ1のSTOPは“0”のまま、時計カウンタとカレンダカウンタを読み出します。STOPを“1”にして読み出すと遅れが生じます。
「秒」の更新直後に読み込みたい場合は、定周期タイマ用カウンタのソースクロックに1Hzを設定し、さらに定周期タイマ用ダウンカウンタに“1”を設定して、1秒ごとの定周期割り込み発生直後に読み込みます。
「分」の更新直後に読み込みたい場合は、定周期タイマ用カウンタのソースクロックに1/60Hzを設定し、さらに定周期タイマ用ダウンカウンタに“1”を設定して、60秒ごとの定周期割り込み発生直後に読み込みます。
6.制御プログラム
下記にH8/3694Fの場合の、RTC-8564NBの制御フロー図とプログラム例を示します。この中で、I2Cバスインタフェースの初期化および通信関数を呼んでいますが、ここではI2Cバスインタフェースについての説明は省きます。
補足:初期化関数iic2_initの引数0xA2はRTC-8564NBのスレーブアドレスです。
・RTC-8564NBの制御フロー図(RTC8564NB_CtrlSampleFlow.pdf)
・RTC-8564NBの制御プログラム例(RTC8564NB_CtrlSampleSource.pdf)
関数InitRTCのフロー図からもわかるように、RTC-8564NBは電源ONのたびに初期化するのではありません。前に述べたように、VLビット(VoltageLow
Flag)という電圧低下検知ビットをチェックして、これが’1’のとき初期化しています。
この例では、RTC-8564NBの定周期タイマ割り込み機能を使って、マイコンに対し1秒周期の割り込み(IRQ0)を発生させています。この割り込みは時刻の「秒」更新と同期しているので、この割り込み直後に時刻を読み込めば秒単位で最新の時刻を得ることができます。
なお、割り込み処理関数Int_IRQ0のフローにあるように、時刻の読み込みはIRQ0割り込み処理内では行っていません。1秒フラグbSecIntFlgというのを用意しておいて、割り込み処理内ではそれをセットするだけです。
1秒フラグは、日時を必要とする割り込み外の関数から関数ChkSecIntFlgを呼ぶことで監視とクリアが行われます。
多くのRTCがそうであるように、RTC-8564NBも内部の日付・時刻カウンタはBCD(Binary Coded Decimal)形式になっています。この例では、日付・時刻をバイナリ形式で扱えるように、RTC-8564NBへの書き込み時はバイナリ→BCDに、読み込み時はBCD→バイナリに変換しています。