マイコン・プログラミング・メモ
RTC-8564の使い方
ホームページに戻るトップページに戻る前ページに戻る次ページに進む最終ページに進む
マイコン用のリアルタイムクロックRTC-8564、その機能と使用方法について、これまで製作したものを元に紹介します。
■参考資料■
Real Time Clock Module RTC-8564JE/NB アプリケーションマニュアル :セイコーエプソン
Real Time Clock Module RTC-8564JE/NB カタログ :セイコーエプソン
1.概要

RTC-8564は、セイコーエプソン製のリアルタイムクロックICで、I2Cバスインタフェースで容易にマイコンと接続できるものです。パッケージによってRTC-8564JEとRTC-8564NBがあります。
リアルタイムクロック(以降RTC)とは、マイコンに接続して使う時計ICのことで、ほとんどの場合マイコンの電源がOFFの状態でも計時を続けるように、バックアップ電源を付けて使用します。
RTCには多くの種類が発売されていますが、RTC-8564は水晶振動子を内蔵し、“年,月,日,曜日,時,分,秒”カウンタと、時刻アラーム割り込み機能および定周期割り込み機能、そしてI2Cバスインタフェースを持ったRTCです。
電源電圧範囲が1.8~5.5Vと広いため、マイコンの電源が3.3Vでも5.0Vでも接続できて便利です。また、時計の精度も月差±1分程度と、RTCとして高い精度といえます。
   備考:ここでは、IICバス(Inter IC Bus)をI2Cと表記します。

2.ブロック図とピン配置

下記にRTC-8564のブロック図とRTC-8564NBのパッケージを示します。
RTC8564NBブロック図
(エプソン RTC-8564JE/NBアプリケーションマニュアルより)

RTC8564NBのパッケージ
(エプソン RTC-8564JE/NBカタログより)

3.秋月電子通商のモジュール

RTC-8564は、VSOJまたはSONという趣味の電子工作では使いにくいパッケージなので、下の写真のように8ピンDIPに変換したものとして秋月電子通商で販売されています。
このモジュールは、SONパッケージのRTC-8564NBを実装したもので、I2Cバスのプルアップ抵抗や割り込み出力/INTをモニタするLED等も載っています。それらは、基板上のジャンパーをハンダでショートすると使用できるようになっています。

このモジュールをバックアップあり電源で動作させる場合は次の点に注意が必要です。
1) 割り込み出力/INTを使う場合に/INTをモニタするLEDを使うと、LEDがバックアップ電源を消費してしまうので、LEDは使わない方がいいです。
2) クロック出力端子CLKOUTからクロックを出力させていると、消費電流が増えるためバックアップ時間が短くなってしまいます。
3) モジュールにあるI2Cバスのプルアップ抵抗を使うと、同じバスに接続された他のデバイスの保護ダイオードなどを通ってバックアップ電源がリークするので、バックアップ時間が短くなってしまいます。
RTC8564NBモジュールの写真

秋月電子通商のRTC-8564NBモジュールの回路とピン配置は下図のようになっています。
RTC8564NBモジュールの回路

4.内部レジスタ

RTC-8564の内部レジスタ一覧表を下記に示します。これは「RTC-8564JE/NBプリケーションマニュアル」から抜粋したものです、詳細を知りたい人はそちらを参照してください。
この中で便利な機能として、電源電圧低下を検知する機能があります。
SecondsレジスタのVLビットは、電源電圧がVLOW(最低保持電圧)より下がると“1”になるビットで、RTCのバックアップが無効になったかどうか知ることができます。つまり、マイコンが起動時にVLビットを調べることでRTCを初期化すべきか判断できます。
RTC8564NBレジスタマップ
(エプソン RTC-8564JE/NBアプリケーションマニュアルより)

5.設定

5-1.動作開始

コントロールレジスタ1に、全ビット“0”を書き込みます。
TESTは、メーカーのテスト用ビットなので必ず“0”を書き込んでおきます。
STOPは、時計に日時を設定するとき動作を一時停止させるために使うもので、それ以外では“0”にします。

前に述べたように、SecondsレジスタのVLでバックアップが有効かどうか知ることができます。従って、マイコン起動時のチェックでVL=“0”であれば、以降で説明する各種設定はRTC内に保持されているはずなので、起動のたびに設定する必要はありません。
コントロールレジスタ1

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をプログラムでチェックし、どちらが発生したか判断する必要があります。
定周期タイマ割り込み設定レジスタ
コントロールレジスタ2

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をプログラムでチェックし、どちらが発生したか判断する必要があります。
アラーム機能設定レジスタ
コントロールレジスタ2が示すアラーム発生状況
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出力を使用していると、使用していない時より消費電流が多いため、バックアップ時間が短くなります。
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秒ごとの定周期割り込み発生直後に読み込みます。

コントロールレジスタ1で時計停止
時刻・日付・曜日レジスタ

6.制御プログラム

下記にH8/3694Fの場合の、RTC-8564の制御フロー図とプログラム例を示します。この中で、I2Cバスインタフェースの初期化および通信関数を呼んでいますが、ここではI2Cバスインタフェースについての説明は省きます。
補足:初期化関数iic2_initの引数0xA2はRTC-8564のスレーブアドレスです。

RTC-8564の制御フロー図

RTC-8564の制御プログラム例

注意:これらは例であり、必ずしも正常にコンパイルおよび正常に動作することを保証するものではありません。

関数InitRTCのフロー図からもわかるように、RTC-8564は電源ONのたびに初期化するのではありません。前に述べたように、VLビット(VoltageLow Flag)という電圧低下検知ビットをチェックして、これが’1’のとき初期化しています注。
この例では、RTC-8564の定周期タイマ割り込み機能を使って、マイコンに対し1秒周期の割り込み(IRQ0)を発生させています。この割り込みは時刻の「秒」更新と同期しているので、この割り込み直後に時刻を読み込めば秒単位で最新の時刻を得ることができます。
なお、割り込み処理関数Int_IRQ0のフローにあるように、時刻の読み込みはIRQ0割り込み処理内では行っていません。1秒フラグbSecIntFlgというのを用意しておいて、割り込み処理内ではそれをセットするだけです。
1秒フラグは、日時を必要とする割り込み外の関数から関数ChkSecIntFlgを呼ぶことで監視とクリアが行われます。
多くのRTCがそうであるように、RTC-8564も内部の日付・時刻カウンタはBCD(Binary Coded Decimal)形式になっています。この例では、日付・時刻をバイナリ形式で扱えるように、RTC-8564への書き込み時はバイナリ→BCDに、読み込み時はBCD→バイナリに変換しています。

注:VLビットが"0"であっても他のレジスタの設定値が壊れている、または設定が壊れていることを検知できないことが時々発生しています。電圧降下が正常にVLビットに反映されないのか、I2C通信に不具合があるのか、現時点では原因がわかっていません。製作する人は、VLビットが"1"になったとき以外にも初期化できるようにしておくことをお勧めします。

ホームページに戻るトップページに戻る前ページに戻る次ページに進む最終ページに進む
■■■ 注 意 ■■■
1.ここに掲載された内容(写真,図,表などを含む)の、全てまたは一部を無断で使用しないでください。
2.ここで紹介した手法(構造や仕組み,回路,プログラムなどを含む)を使用したことにより、問題や不利益が発生したとしても一切関知しません。
3.ここで紹介したプログラム例は、正常なコンパイルおよび正常な動作を保証するものではありません。