☆'s R8C/Tiny との語らい

☆☆ もくじ ☆☆
0. はじめに
1. システム構成
2. トラブルシューティング

戻る

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 プログラム書き込み。(→拡大図

1-2. R8C/16 からのデータ読み込み
    USB-to-I2C Pro を介して、I2C 通信(IIC 通信)によりデータを読み込む。
    PC は常にマスターとして動作し、マイコンのスレーブアドレスを指定して通信を行う。
    (UART によるデータ取得は短講資料「Tiny マイコンを使ってみよう!」参照)
    
    図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++;
         }


戻る

公開: 2007/01/20
更新: 2007/07/21
Takayuki Hoshi: star(at)alab.t.u-tokyo.ac.jp