このライブラリは, エプソンのRTCRX8900用の ドライバです.
RTCは秋月電子の [AkizukiRTC_RX8900][高精度RTC(リアルタイムクロック) RX8900 DIP化モジュール]を使いました.
動作を確認した機種は以下の表のものになります.
CPUアーキ | 利用した機種 |
---|---|
AVR | Arduino Mega |
SAMD | Arduino MKR WiFi 1010 |
SAM | Arduino Due |
ESP32 | スイッチサイエンス ESP Developer 32 |
RTC_RX8900_U.h
に以下のようなデバッグや性能テストに用いるための機能を生かすフラグがあります.
必要に応じて有効・無効を変更してください.
#define DEBUG
サンプルプログラムは,本ドライバの各機能を実行した場合に,RTCの各レジスタが適切に設定されているか否かを 確認するためのものです.
RTC_RX8900_U.h
のDEBUG
定義を有効にした上で
コンパイルとインストールをしてください.
以下の行を無効にすることで,詳細なメッセージとレジスタの内容の確認が実行されます.
#undef DEBUG
以下の行を有効にすると,各テストでレジスタの書き換えが行われた後に,全レジスタの内容をダンプします.
#define DUMP_REGISTER // レジスタの値を書き換えた後に,レジスタ値のdumpを見たい場合はこれを有効にする(DEBUGも有効にする)
チップのレジスタ値の詳細などの情報が必要な機能がありますので,EPSONのアプリケーションマニュアルを参照しながら読んでください.
RTC_RX8900_U(TwoWire * theWire, int32_t rtcID=-1)
RTCが用いるI2CのI/FとIDを指定してオブジェクトを生成.
引数 | 内容 |
---|---|
theWire | I2CのI/F |
rtcID | rtcに番号をつける場合に利用.(デフォルト値は-1) |
bool begin(bool init, uint32_t addr=RTC_EPSON_RX8900_DEFAULT_ADRS)
第1引数は,時刻やタイマ,アラームの設定を実施するか否かを示すフラグ.
I2Cのアドレスにデフォルトでないものを用いる場合は 第2引数で指定.指定しない場合は,デフォルトのアドレスで初期化を実施.
返り値 | 意味 |
---|---|
true | 初期化成功 |
false | 初期化失敗 |
RTCのチップの種類や機能の情報を取得するメンバ関数.
void getRtcInfo(rtc_u_info_t *info)
bool setTime(date_t* time)
引数で与えた時刻をRTCに設定.
返り値 | 意味 |
---|---|
true | 設定成功 |
false | 設定失敗 |
bool getTime(date_t* time)
RTCから取得した時刻情報を引数で与えた構造体に格納.
返り値 | 意味 |
---|---|
true | 取得成功 |
false | 取得失敗 |
RX8900は1種類しかアラームがないため,以下の各関数の第1引数`num``は0限定です.
int setAlarm(uint8_t num, alarm_mode_t * mode, date_t* timing)
RX8900はアラームのパラメータのうち,日付もしくは曜日のどちらかを用いる必要があります.このどちらを利用するかは第2引数のメンバtype
で指定します.
modeのメンバ変数 | 意味 |
---|---|
useInteruptPin | 無視 |
type | 0:曜日 , 1:日付け |
第3引数のtiming
では,分・時・日(もしくは曜日)を指定しますが,特定の分や時ではなく,その要素を無視する指定をすることもできます.この場合は第3引数の該当メンバの値を255(0xFF)にしてください.
返り値 | 意味 |
---|---|
RTC_U_SUCCESS | 設定成功 |
RTC_U_FAILURE | 設定失敗 |
RTC_U_ILLEGAL_PARAM | サポートしていないパラメータの設定など |
int setAlarmMode(uint8_t num, alarm_mode_t * mode)
各パラメータはsetAlarm(uint8_t num, alarm_mode_t * mode, date_t* timing)
と同じです.
int controlAlarm(uint8_t num, uint8_t action)
action
を0に設定すると,アラームが停止,1に設定するとアラームが再開します.
返り値 | 意味 |
---|---|
RTC_U_SUCCESS | 設定成功 |
RTC_U_FAILURE | 設定失敗 |
RTC_U_ILLEGAL_PARAM | サポートしていないパラメータの設定など |
RX8900はタイマが2種類あります.以下の関数の第1引数num
でそれを指定し,num=0
で利用できるのがある周波数信号が何回発生したかで判定するもの,num=1
で利用できるのが,毎秒(もしくは毎分)発火するものの2種類です.
int setTimer(uint8_t num, rtc_timer_mode_t * mode, uint16_t multi)
返り値 | 意味 |
---|---|
RTC_U_SUCCESS | 設定成功 |
RTC_U_FAILURE | 設定失敗 |
RTC_U_ILLEGAL_PARAM | サポートしていないパラメータの設定など |
第3引数のmultiはtimerカウンタ0の値,第2引数modeのメンバrepeatがtimerカウンタ1の値となります.それぞれの値の意味はアプリケーションマニュアルを参照してください.
第2引数modeの他の構造体メンバは以下のように取り扱われます.
- useInteruptPin : コントールレジスタ 4bit目(TIE bit)に割当て (0 ピン出力なし, 1 ピン出力あり)
- interval : extentionレジスタの0,1bit目(TSEL0,1)に割当て (カウントする周波数信号の種類)
第2引数の構造体メンバinterval
のみが意味を持ち, extentionレジスタの5bit目(USEL)に代入されます.
なお,値が0の場合は毎秒,値が1の場合は毎分発火します.
int setTimerMode(uint8_t num, rtc_timer_mode_t * mode)
返り値 | 意味 |
---|---|
RTC_U_SUCCESS | 設定成功 |
RTC_U_FAILURE | 設定失敗 |
RTC_U_ILLEGAL_PARAM | サポートしていないパラメータの設定など |
第2引数modeのメンバrepeatは無視され,他のメンバ変数は以下のように取り扱われます.
- useInteruptPin : コントールレジスタ 4bit目(TIE bit)に割当て (0 ピン出力なし, 1 ピン出力あり)
- interval : extentionレジスタの0,1bit目(TSEL0,1)に割当て (カウントする周波数信号の種類)
setTimer()
と同じ動作となります.
int controlTimer(uint8_t num, uint8_t action)
第2引数action
の意味は以下の通り.
action の値 |
意味 |
---|---|
0 | タイマ停止 |
1 | タイマ再開 |
返り値 | 意味 |
---|---|
RTC_U_SUCCESS | 設定成功 |
RTC_U_FAILURE | 設定失敗 |
RTC_U_ILLEGAL_PARAM | サポートしていないパラメータの設定など |
周波数信号を出力する端子は1つしかないため,以下の各関数の第1引数num
は0限定です.
int setClockOut(uint8_t num, uint8_t freq, int8_t pin=-1)
RX8025は出力できる信号は周波数を選択できません. そのため,第2引数は無視します.
また,RX8025はある端子(FOE端子)を外部から電圧をHIGHにしないと周波数信号を出力しないため,RTCのFOE端子と接続しているArduinoのピン番号を第3引数で与えます.
返り値 | 意味 |
---|---|
RTC_U_SUCCESS | 設定成功 |
RTC_U_FAILURE | 設定失敗 |
RTC_U_ILLEGAL_PARAM | サポートしていないパラメータの設定など |
int setClockOutMode(uint8_t num, uint8_t freq)
FOUT端子に出力する信号の周波数を選択します.第2引数をextensionレジスタのFSELビットに代入されるため,その意味はアプリケーションマニュアルを参照してください.
int controlClockOut(uint8_t num, uint8_t mode)
第2引数は以下の表のような意味となります.
mode の値 |
意味 |
---|---|
0 | クロック出力停止 |
1 | クロック出力開始 |
返り値 | 意味 |
---|---|
RTC_U_SUCCESS | 設定成功 |
RTC_U_FAILURE | 設定失敗 |
RTC_U_ILLEGAL_PARAM | サポートしていないパラメータの設定など |
int checkInterupt(void)
割り込みの有無を16bitの2進数の列として出力.どのbitが立っているかでどの割り込みが発生しているかを判定することができる. 出力値はflagレジスタ(0x0E番)の3~5bit目が出力されるため,その意味はアプリケーションマニュアルを参照してください.
返り値 | 意味 |
---|---|
0以上 | flagレジスタ(0x0E番)の3~5bit目の値 |
RTC_U_FAILURE | 取得失敗 |
RTC_U_ILLEGAL_PARAM | サポートしていないパラメータの設定など |
int clearInterupt(uint16_t type)
checkInterupt()
の出力と同じく,消すフラグをbit列の中で1として表記して与える.
返り値 | 意味 |
---|---|
RTC_U_SUCCESS | 設定成功 |
RTC_U_FAILURE | 設定失敗 |
RTC_U_ILLEGAL_PARAM | サポートしていないパラメータの設定など |
int checkLowPower(void)
RTCへの電源供給が切れ,時刻やタイマ等全ての設定をやり直す必要があるか否かを示すフラグの情報を取得する.負の値(RTC_U_FAILURE
)の場合はフラグ値の取得失敗,0以上の場合は読み取りに成功しています.
値としては,0
以外の値の場合はなんらかの異常が起こっています.この値はflagレジスタの0,1bit目の値になるため,詳細はアプリケーションマニュアルを参照してください.
int clearPowerFlag(void)
電源喪失を示すフラグをクリアする関数.返り値が負の場合はフラグ値のクリアに失敗.成功の場合はRTC_U_SUCCESS
が返されます.
一般的に発振器はチップの温度で発振周波数が変化してしまうため,RX8900は内部温度で時計の進み方を自動で調整します.この機能は止めることはできませんが,調整する頻度だけは指定することができます.
float getTemperature(uint8_t mode)
RTCの内部温度を取得します.引数の意味は以下の表の通りです.
modeの値 | 意味 |
---|---|
RTC_U_TEMPERATURE_KELVIN | 絶対零度で温度を返します |
RTC_U_TEMPERATURE_CELCIUS | 摂氏で温度を返します |
RTC_U_TEMPERATURE_FAHRENHEIT | 華氏で温度を返します |
int setTemperatureFunction(uint8_t mode)
RX8900では調整機能はON/OFFできませんが,調整を実行する周期は指定できます.デフォルトは2秒周期です.
modeの値(2進数) | 周期 |
---|---|
00 | 0.5秒 |
01 | 2秒 |
10 | 10秒 |
11 | 30秒 |
返り値 | 意味 |
---|---|
RTC_U_SUCCESS | 設定成功 |
RTC_U_FAILURE | 設定失敗 |
RTC_U_ILLEGAL_PARAM | サポートしていないパラメータの設定など |
RV8803ではレジスタ番号0x07
がSRAM領域として利用できます.以下の2つの関数の第1引数addr
が0の場合に,このレジスタを利用します.
また,len
は1しか利用できません.
int getSRAM(uint8_t addr, uint8_t *array, uint16_t len)
レジスタ番号0x07
のデータを配列arrayの最初の要素に代入されます.
int setSRAM(uint8_t addr, uint8_t *array, uint16_t len)
配列arrayの最初の要素のデータをレジスタ番号0x07
に書き込みます.