本文へスキップ

未来の科学技術を子供たちに託す。 ジュニロボ <JRO>

〒619-0237 京都府相楽郡精華町光台8丁目

TEL. 070-5263-2200

jun@kinet-tv.ne.jp

SHマイコンを使った組込ソフトの勉強( 上級者用 )                       RECRUI


  初めに!!

    高機能・高性能のロボット開発を求める人のために、高機能・高性能・高速処理が可能なマイコンチップの1種の RENESAS製・SH-3 マイコンを
   使ってプログラム体験をしてもらいます。 プログラムは、アセンブラ・C言語・RTOS( μTRON )を使います。
   ロボット操作とは直接関係しませんが、ロボットで使用するマイコンを使いこなして行く上では、是非とも理解してもらいたい内容です。
   開発環境は、RENESASの標準統合開発環境であるHEWを使用しますが、インストール等は、後半「参考」で紹介していますので、参考にしてください。



 左記教材は、ダイセン電子工業から提供されています。

 デバッガは、オリックスレンテックより提供されています。

 < 使用機材 >

 1.CPU関連 : SH-2002 シリーズ

 2.OS : Linux + μITORON

 3.デバッガ : PALMiCE3( CSIDE )











 1.CPU基板+周辺基板 をばらした写真です。

   CPU本体基板 : SH-2002 Rev

   IO基板    : EMB-DIO104-02

   映像出力基板
   VGA/LCD  : MS104-VGA/ LCD
   LVDS/DVI  : MS104-LVDS/DVI







 2.拡張周辺機器

   上記の周辺装置の拡張機能として、左記機材を追加して
   います。( 追加機能としては、下記の通りです。)

  2-1:ステッピング・モータ

  2-2:DCモータ(フォトセンサ付き)

  2-3:アナログVR( 電圧可変 : 0V~+2.5V )

  2-4:トグルSW

  2-5:7SEG・LED( 2桁 )

  2-6:SWレジスタ( 4桁 )

  2-7:ブザー

  2-8:光センサ/音入力/温度センサ

  2-9:LED 4個







  入出力アドレスの定義

    ロボット等での組込マイコンを使う場合、マイコンで色々な周辺機器を操作する事がおこなわれます。その時に周辺機器を使う方法を説明します。
   ロボットなどでマイコンの周辺機器( 入出力機器 )を操作する時は、ポインタを使います。

   例えば、

     char *p;

   は、キャラクタ型整数変数を示すポインタ p の定義です。つまり p は、実際の値のある場所のアドレスを格納・保持している変数です。
   そして、

     *p

   は、整数変数の中身そのものです。

   いま仮に、

     p = 1000;

   というステートメントがあったとすると、理論的には 1000 番地が、変数の実際の場所という指定になります。
   そして、

     *p = 10;

   が変数に、すなわち 1000 番地に 10 という整数値を代入しなさいということになります。

   しかし、上記の p = 1000;という行は実際にコンパイルすると、「変数のレベルが違う」という warning( 警告 )がでたり、コンパイラによっては、
   エラー扱いになります。そこで、どうしてもポインタに数値を代入したい場合は、型を強制的に( 一時的に )変換するキャスト演算子を使います。
   そして、

     p = ( char* ) 1000;

   という記述にすれば、ポインタに強制的に数値が代入できます。

   これと同様な方法を使って、入出力のアドレスも定義します。
   毎回、キャスト演算子とポインタを指定して代入するのは大変なので、マクロ定義の #define を使えば便利です。
   例えば、内蔵 A ポートのディレクション・レジスタ paddr について、

     #define paddr ( *( unsigned char * ) 0xfffd3 )

   としたらどうでしょう。これで paddr はキャラクタ型( 8 ビット )のポインタ変数で、その値( アドレス )は、16 進で、fffd3 と定義する事が出来
   ます。そして、

     psddr = 10 ;

   という、直接、値を代入する記述も出来るようになります。
    しかし、ここでまた問題が起こります。 最適化の問題です。 最適化されない様にするためには、volatile ということを指示して、実際には以下の
   記述とします。

     #define  paddr ( *( volatile unsigned char *) 0xfffd3 )


  I / O ボード制御プログラミング

  1.DIO ボード EMB-DIO104 の概要

    このボードは、SH2002 CPU ボードの外部バス( PC104 互換 )に接続し、CPU から下記のモジュール や I/O を制御するために必要な各種インター
   フェース回路を実装しています。

    @ 押しボタンスイッチ
    A LED
    B 7セグメントLED
    C LCD キャラクタディスプレイモジュール
    D CMOS カメラユニット
    E 拡張I/O : AB10-EXE を接続します。


  2.内蔵 I / O レジスタのメモリマップ

    EMB-DIO104 ボード上に実装されている CPLD 内の 内部 I/O レジスタのイメージ図が下記の様に配置されています。



   上記注意書きがある様に、DIO ボードはバス幅 8Bit でアクセスする必要があり、アドレスは下記の割り振りとしています。



























   ここで、プログラムを作る上で、注意点があります。
   < 注 意 >
    プログラム上でこれらのレジスタをアクセスするためには、論理アドレスを使います。
    I/O は、キャッシング不可、MMUのアドレス変換対象外の領域としてアクセスしなければなりません。
    したがって、P2 領域の H'A000,000 ~ H'BFFF,FFF となります。

    この領域には、CPU内蔵の I/O も割り付けてありますので、外部 I/O は下記の様にします。

    上位3Bit は、B'101 とし、物理アドレスの下位 29 Bit と組み合わせるて、H'B800,000 ~ H'B800,000 とします。


    それでは、以上の事を頭に置いて、プログラムを作っていきましょう。< 次ページへ >