0. はじめに |
現在、研究で Renesas Technology 株式会社のマイコン R8C/16 を使っています※。 このページは、その使い方や注意点をまとめた自分用メモです。 センサ出力をマイコンで A/D 変換して PC に取り込みたかったので、通信がメインになっています。 内容の正しさは保証できませんが、ちょっと困ったときにでも参考にしていただければ幸いです。 ※ 書き換え可能回数を考えると、機能の同じ R8C/17 のほうが実験にはよいかも。(R8C/16 : 100 回、R8C/17 : 1,000 回) |
1. システム構成 |
1-1. R8C/16 へのプログラム書き込み
開発環境 HEW4 から、UART 通信により動作プログラムを書き込む。(具体的な操作は「R8C/Tiny 開発環境」参照)
シリアルポートが PC にない場合は、USB - シリアル変換ケーブルを使用する。
図1 プログラム書き込み。(→拡大図)
- RESET 端子の 4.7μF は、電源投入時に RESET を Vcc より遅れて立ち上がらせるため。
数 ms の時間を稼げればよいので、0.1μF 程度でも十分。100Ω は保護抵抗。
これらは用心のためで、実はパワーオンリセット機能(プルアップのみ)で十分かも知れない。- P3_7、P4_5 はプログラム書き込みに使われる通信用端子。
P3_7 のプルアップは、プログラム書き込みを安定して行うために必要。- MAX3380ECUP はラインドライバ。
マイコンの 0V 〜 3.3V(or 5V)とシリアルポートの -12V 〜 12V を相互に変換するため。- 波線より下は、プログラム書き込み時以外に切り離してよい部分。
- プログラム書き込み時、20MHz クロックを接続しておく必要があった。
外部で生成したクロック波形を入れる場合は、XIN に接続し、XOUT を開放にする。
スタンドアローンで使うときには、8MHz 内部クロックに設定すれば 20MHz は必要ない。- プログラム書き込み時、RESET を一旦 Vss に落として人為的にリセットする必要があった。
(リセットするまで 20MHz クロックが発振しないため)
スタンドアローンで使うときには、単に電源投入するだけでよい。- この構成で 3.3V 駆動したとき、消費電流は 10mA 程度。
スタンドアローンのときは、3mA 程度だった。
1-2. R8C/16 からのデータ読み込み
USB-to-I2C Pro を介して、I2C 通信(IIC 通信)によりデータを読み込む。
PC は常にマスターとして動作し、マイコンのスレーブアドレスを指定して通信を行う。
(UART によるデータ取得は短講資料「Tiny マイコンを使ってみよう!」参照)
図2 データ読み込み。(→拡大図)
- SCL はクロックライン、SDA はデータライン。I2C 通信は複数のデバイスを接続することができる。
- SCL、SDA はオープンドレインなので、適当な抵抗でプルアップしておく必要がある。
一応、USB-to-I2C の回路内でもプルアップされている。- マイコン動作プログラムのサンプルが R8C/Tiny シリーズページの "アプリケーションノート" からダウンロードできる。
- USB-to-I2C には DLL が付属しており、
PC 側のプログラムでは(1)通信速度の設定と(2)読み出しの関数を実行するだけでよい。
2. トラブルシューティング |
2-1. "通信エラーが発生しました。ターゲットにデータを転送できません。(16013)"
HEW4 でマイコンと接続しようとしたときに出るエラー。
通信路が LOW 状態になっていると考えられる。(デバイスが接続された通信路の定常状態は HIGH)
マイコン・ラインドライバの電源は入っているか、配線の接触が悪くなってないか、などを調べる。
2-2. "通信エラーが発生しました。ターゲットよりデータを受信できません。(16014)"
HEW4 でマイコンと接続しようとしたときに出るエラー。
マイコンからのデータ受信が失敗したと考えられる。
20MHz クロックが発振していないか、消費電流が 10mA を超えていないときは注意。
RESET 端子を一旦 Vss に落とし、マイコンを人為的にリセットすると解決することがある。
また、RESET = HIGH、MODE = LOW になっているかをチェックする。
2-3. "0x01: Address not Acknowledged"
USB-to-I2C の付属 DLL の関数からの返り値。
指定した ID のマイコンから応答 (ACK) がないときこれが返される。
正しく配線されているかをチェックする。
また、正しく ID の設定、指定ができているかをチェックする。
1. R8C/16 の ID は 8bit の SAR レジスタに対して sar = 0x0A; のように設定するが、
sar の最下位ビットは「フォーマット選択ビット」であり、
0 のとき I2C 通信、1 のときクロック同期式通信を表す。
つまり、sar の最下位ビットを 0 に固定し、上位 7bit で ID を設定する。(奇数は使えない)
また、試したところ 0x00 は使えないような雰囲気。
よって設定できる値は小さいほうから、0x02、0x04、0x06、・・・、0xFE。
2. USB-to-I2C の DLL では、ID を 8bit で指定する(例 : 0x0A)。
最下位ビットを無視した 7bit が実際に信号として送信される。(奇数も偶数も同じ)
結局、上記で sar レジスタに設定した ID と同じ値にすればよい。
2-4. "0x08: I2C Time Out"
USB-to-I2C の付属 DLL の関数からの返り値。
マイコンの ID は一致したものの、一定時間データが送られてこないときこれが返される。
マイコンのプログラムに問題がないかをチェックする。
1. icdrt レジスタに 8bit データをセットする前に余計な処理を入れない。
下の例では A/D 変換がタイムロスになる。A/D 変換はあらかじめやっておく必要がある。
【悪い例】 ad_data[0] = my_AD(0); /* A/D 変換結果を返す自作関数 */
icdrt = ad_data[0];
while(tdre_icsr == 0);
while(tend_icsr == 0);
ad_data[1] = my_AD(1); /* A/D 変換結果を返す自作関数 */
icdrt = ad_data[1];
while(tdre_icsr == 0);
while(tend_icsr == 0);
2. for 文は使用不可。(while 文は大丈夫らしい)
【悪い例】 int i;
for(i=0; i<2; i++){
icdrt = ad_data[i];
while(tdre_icsr == 0);
while(tend_icsr == 0);
}
【良い例】 int i=0;
while(i<2){
icdrt = ad_data[i];
while(tdre_icsr == 0);
while(tend_icsr == 0);
i++;
}