最近は、RXマイコンのソフトウェアーを少しづつ充実させてきている。
「I2C」もその一つ。
I2Cのデバイスはかなり色々あるので、ドライバーを用意しておけば、今後便利に使えるだろう。
今まで、I2Cのデバイスを本格的に使った事が無かったので、今回実験してみて、色々な事が判った。
今回は、以前にサンプルで貰った、マキシム社扱いのDS1371と言うRTCを接続してみた、RX621にはRTCは内臓なのだが、バックアップが出来ないようなので使い物にはならない。
※電源を切ったら時計は止まってしまう、電源を入れた時に、また時刻を設定しなければならない、こんな仕様では、RTCとは言えないだろう。
仕方なく、外部にRTCを付ける事になる、それから言いたいのは、RTCの一般的な仕様について・・
一般的なRTCは、秒、分、時、日、月、年、うるう年など、色々なカウンターで構成されている、しかしながら、実用的な時間管理を行う場合、秒単位で時間を計算しなければならず、それには、一旦、秒でシリアライズされた値に変換して、計算を行い、time、date に戻す必要があり、カウンターが time、date では二度手間になるだけで、むしろ余計なお世話と言わざるをえない。
この time、date 仕様は、時間が判ればOKなようなチープな機器なら良いかもしれないけど、現代の機器、それも32ビットマイコンの組み込み機器では、ソフトでどうとでもなるので、単なるバイナリーカウンターの方が良い。
DS1371は、32ビットのバイナリーカウンターを持ったRTCで、数少ない単なるバイナリーカウンターのRTCだ、ただ残念なのは、値段はそんなに安く無い事だ、むしろ、time、date 仕様のRTCの方が安い。
※1000個単位ならそこそこ安いが、それでも、もっと安いRTCが沢山ある。
※マイクロチップMCP79410
※DS1371は、クリスタルの外付けコンデンサを内臓しているとこが良い。
それでは、早速I2Cについて・・
I2Cを敬遠していたのは、面倒そうだから・・、今回、色々ソフトを作ってみて、思った通り、かなり面倒で、気を配る必要がある事が判った。
・処理が複雑になりがちで、難しい部分が非常に多い。
・プログラムをポーリング処理にすると、待ち時間でCPUを無駄に消費するので、最低でも割り込み処理にしないと実用的では無いだろう。
※DS1371からデータを4バイト取得するだけでも、100Kbpsだと、最低でも1ミリ秒はかかる・・
※割り込みでCPU時間を節約しても、「値」が欲しいと思ってリクエストしても、実際の値を得るまでにかかる時間は一緒なので、全体のマネージメントや戦略を考えないといけない。
・デバイスの仕様やバグで、I2Cのバスが思ったように応答せず、ハングアップする事があるので、そこから復帰させるルートを考えておかなくてはならない。
まだ他にも色々あるけど、I2Cは、優れた規格とは言えないと思う、が、一度、「糞」でも流通してしまうと、みんなそれに従うのが、痛たすぎる・・・
とりあえず、ポーリング仕様のI2Cドライバーを追加して、DS1371の読み出し、書き込み、時刻設定コマンドなど追加してみたので、ソースコードを更新した。
多少、バグなども修正した。