R8C RTC に DS3231 を追加

最近、アマゾンで、中華の Arduino 用モジュールが色々入手出来る。
※かなり前からかな・・

これらのモジュール基板、多くの種類があり、値段がもの凄く安い!
※品質はそれなりかもしれないが、この値段なら十分だと思える。
※部品単体で買っても、こんなに安くは買えない。

で、気になった「基板」をいくつか買ってみた~
※RTC、ジャイロ・加速度センサー、リチウムイオン充電モジュールなど

・DS3231(RTC)
このモジュールは、マキシム社のRTCで、I2Cインターフェースを備えている。
温度補償水晶発振器(TCXO)および水晶を内蔵していて、超高精度。

このモジュールには、32KのEEPROM、リチウムイオン電池(CR2032)による
バックアップ付きで、電池まで付いている。

これで、たったの、200円
※degi-key で調べると、デバイス単体で890円

ありえない値段でビックリ!
※2個買ったけど、どちらも機能するようだ。

とりあえず、以前にDS1371でRTCのテストプロジェクトを作成したので、DS3231用
クラスを実装してみた。
※しょうもないバグで、数時間悩んだけど・・

内臓レジスターは、BCDになっており、非常に面倒な仕様となっている。
クラスでは、レジスターを読み出してから、time_t に変換している。
逆にレジスターに書き込むには、time_t から、tm 形式に変換してから行う。
※そうしないと、多くの場合、不便極まりないので・・・
本当は、こんな「クソ」仕様のRTCは使いたくないのだが、安いので仕方無い・・・
※この仕様のRTCは「うるう年」を厳密には正しく扱えない、まぁ今は既に2015年なので、
2099年までの範囲なら、まぁ問題無いか・・

common/time.c は、タイムゾーンを含めた、時間関係で最低限必要な関数を実装してある。
通常は、libc に含まれるが、R8C で、time 関係のライブラリーをリンクすると、非常に大きな
容量となるので、独自に実装した関数郡を用意してある。
標準の「time.h」をインクルードすると、「当たる」ので注意が必要。

// 対象の RTC を有効にする
// #define DS1371
#define DS3231

※「main.cpp」で、どちらかを有効にする事で、RTCのタイプを切り替えできる。

IMG_0781s

I2C_RTC_test