RL78/G13でI2Cを使ってみる

最近アマゾンで、Arduino向けデバイスが格安で入手できる、中華製で、品質は
それなりではあるけれども、値段が恐ろしく安い。(送料も大抵無料)
評価欄で、低評価をしてる人がいて笑ってしまうのだが、こんだけ安くて、何が不満な
のだろうか?
部品を正規ルートで買って組み立てたら10倍以上の値段になるだろうか・・
「当り」、「はずれ」は当然として、不満なら正規品を買えば良いだけの事と思うのだ
が・・
※スイッチサイエンスや、ストロベリーリナックスで、同じような「製品」は入手でき
る、その場合のコストを考えてほしいと思う。

-----
さて、シリアル入出力は、割り込みにも対応できて、機能的にはとりあえず十分なので
何か外にデバイスを接続したくなる。
RL78/G13には、SAU(シリアル・アレイ・ユニット)を簡易I2Cとして使
う機能があるが、他に、IICA(I2Cアレイ)が1チャネルあり、I2Cの仕様を
全て満足する事が出来るので、当然ながら、こちらを使う事になる。

ハードウェアーマニュアルを読んでも、イマイチ使い方がピンとこなかったが、以前に
R8Cで、I2Cをソフトウェアーだけで実現した経験があったので、それが役立った、
出来上がってみると、R8Cで実装した構成とほぼ同じようになった。
新規のデバイスを使うのは、困難が伴う、I2Cは動作が複雑なのでなおさらだ。
ハードウェアー・マニュアルの不備などに悩まされ、ルネサスさんのサンプルコードも
参考にして、ようやく動作した。
まだ、ポーリング動作なので、遅いI2Cは、割り込みにする必要があるのだけど。
※R8CのソフトウェアーI2Cもフル機能がある。

構成が複雑化してくると、バイナリーが肥大化してきた、これを解消する為、このプロ
ジェクトから、最適化オプション「-O2」を「-Os」とした。
これは、「-O2」から、バイナリサイズが大きくなる可能性のある最適化オプションを取
り除いたもので、サイズはかなり縮小する。
※おおよそ1/4になった。

使ったデバイスは、DS3231で、RTCだ、このモジュールは中華製で、危険なほど
安い!(確か220円とかだった)
このRTCは、OSCの発振周波数が非常に正確なのが特徴で、普通にチップだけ買って
も500円はするが、このモジュールは、バッテリーバックアップ、それにEEPROM
まで付いている。

IMG_0804s

DS3231サンプル・プロジェクト

RL78/G13のスタートアップルーチン修正

const 領域の問題が解決したと思って、コンパイラに含む問題は解決されたと
思っていたのだが、何だか、動作が怪しい・・・

少し調べると、クラスの初期化リストが正しく動いていないように感じた。

xxxx.lst を見ながら、xxxx.mot ファイルのバイナリーを色々調査すると、明
らかに呼ばれていない関数がある事が判った。

00004c96 <__GLOBAL__sub_I__Z5wait_v>:

このアドレス「0x00004c96」は、どうやら、「.ctor」に積まれているようだ。

今まで、スタティックに定義したクラスのコンストラクターは、

extern void rl78_run_preinit_array(void);
extern void rl78_run_init_array(void);
extern void rl78_run_fini_array(void);

の3つを走らせれば良いのだと思っていたが、どうやら、「ctor」に積まれた
アドレスもコールしておく必要があるようだ・・

そこで、リンカースクリプトに「ctor」、「dtor」リストのシンボルを追加して、
「start.s」に関数を呼ぶエントリーを追加、「init.c」から呼ぶようにしてみ
た。
※どの順番で呼ぶのか不明なので、ctor を最初に呼ぶようにした。
※ctor、dtor のエントリーアドレスを得る方法が判らないので、シンボル追加。
この「無理やり」な解決方法が合っているか不明ではあるけど・・・

とりあえず、初期化が正しく行われ、正常に動作しているようだ。

まだまだ、スタートアップの方法に問題を含んでいるのかもしれない・・・

ここは、時間が出来たら、もう少し厳密な調査をしたい。