目次

H8/3052マイコンボード

 MCRの指定マイコンは、H8/3048FでしたがMCR-VCでは
 マイコンとモータの指定はないので、AVR、ARM等を
 使ってきました。

 知り合いの先生から、H8/3052ボードをたくさん貰えたので
 これらのボードを利用し、カメラとモータドライバのテスト
 をします。



 すべて秋月電子のキットで、学生が半田付けしたものです。
 このボードで、組込み関係の講義・演習をしたそうで、ファーム
 ウエアの書込み限界回数(100回)までは、達していないとか。

 ボードだけでは、ファームウエアを開発できない
 のでアセンブラ、Cコンパイラを入手しました。



 H8シリーズのファームウエアは、シリアルインタフェースを
 利用してダウンロードします。手持ち部品で、ダウンロード
 用ハードウエアを作成です。



 H8/3048と異なり、H8/3052では+5V電圧で、内蔵フラッシュROM
 にプログラムコードを書き込めます。あり合わせ部品で、即席
 のダウンローダを組み上げました。

 配線は、以下。



 H8/3052ボードとは、10ピンケーブルで接続します。

 ファームウエアのダウンロード時には、006P電池で
 PWR、GNDに9Vを与えます。

 ハードウエアテストのファームエアを記述しました。

#include <3052.h>

typedef unsigned char  UBYTE ;
typedef unsigned short UWORD ;
typedef unsigned long  ULONG ;
typedef   signed char  SBYTE ;
typedef   signed short SWORD ;

#define FALSE 0
#define TRUE  FALSE+1

#define OFF 0
#define ON  OFF+1

#define MASKFF 0xff
#define MASK0F 0x0f
#define MASKF0 0xf0

#define P1DDR P1.DDR
#define P1DAT P1.DR.BYTE
#define P2DDR P2.DDR
#define P2DAT P2.DR.BYTE
#define P3DDR P3.DDR
#define P3DAT P3.DR.BYTE
#define P4DDR P4.DDR
#define P4DAT P4.DR.BYTE
#define P5DDR P5.DDR
#define P5DAT P5.DR.BYTE
#define P6DDR P6.DDR
#define P6DAT P6.DR.BYTE
#define P7DAT P7.DR.BYTE
#define P8DDR P8.DDR
#define P8DAT P8.DR.BYTE

#define PADDR PA.DDR
#define PADAT PA.DR.BYTE
#define PBDDR PB.DDR
#define PBDAT PB.DR.BYTE

#define DAC1 DA.DADR1
#define DAC0 DA.DADR0

#define BSIZE 16

/* prototype */
void initialize_user(void);

void SCI1_INIT(TBaudRate, char *, short, char *, short);

/* */
volatile UBYTE tflag ;
volatile UBYTE cnt ;
volatile UBYTE dcnt ;

/* SIO buffer */
char txbuf[BSIZE] ;
char rxbuf[BSIZE] ;

int main(void)
{
  /* initialize port */
  initialize_user();
  /* enable interrupt */
  EI ;
  /* endless loop */
  while ( TRUE ) {
    /* timer handling */
    if ( tflag == ON ) {
      tflag = ON ;
      /* increment */
      cnt++ ;
      dcnt++ ;
      /* impress data */
      DAC1 = MASKFF - dcnt ;
      DAC0 = dcnt ;
      /* impress */
      P5DAT = cnt ;
      P6DAT = cnt ^ MASKFF ;
      PADAT = cnt ;
      PBDAT = cnt ^ MASKFF ;
      if ( cnt & ON ) {
        P1DAT = MASKF0 ;
        P2DAT = MASKF0 ;
        P3DAT = MASKF0 ;
        P4DAT = MASKF0 ;
      } else {
        P1DAT = MASK0F ;
        P2DAT = MASK0F ;
        P3DAT = MASK0F ;
        P4DAT = MASK0F ;
      }
    }
  }
  /* dummy */
  return 0 ;
}

void initialize_user(void)
{
  /* power save */
  MSTCR.BYTE = 0x93 ;
  /* set initial I/O values */
  P1DAT = 0x00 ;
  P2DAT = 0x00 ;
  P3DAT = 0x00 ;
  P4DAT = 0x00 ;
  P5DAT = 0x00 ;
  P6DAT = 0x00 ;
  P8DAT = 0x00 ;
  PADAT = 0x00 ;
  PBDAT = 0x00 ;
  /* set initial I/O directions */
  P1DDR = 0xff ;
  P2DDR = 0xff ;
  P3DDR = 0xff ;
  P4DDR = 0xff ;
  P5DDR = 0xff ;
  P6DDR = 0xff ;
  P8DDR = 0xff ;
  PADDR = 0xff ;
  PBDDR = 0xff ;
  /* set initial I/O directions */
  cnt = 0 ;
  dcnt = 0 ;
  /* clear flags */
  tflag = OFF ;
  /* initialize ITU0 */
  {
    /* clear with compare match , OSC / 8 */
    ITU0.TCR.BYTE = (1 << 5) | (3 << 0) ;
    /* enable compare match interrupt */
    ITU0.TIER.BYTE = (1 << 0) ;
    /* initialize GR */
    ITU0.TCNT = 0 ;
    /* initialize GR */
    ITU0.GRA = 3124  ; /* 25 x 1000 / 8 */
    ITU0.GRB = 10000 ;
    /* start ITU0 */
    ITU.TSTR.BYTE = (1 << 0) ;
  }
  /* initialize DAC */
  DA.DACR.BYTE = 0xe0 ;
  /* initialize SIO_1 */
  SCI1_INIT(br9600, txbuf, sizeof(txbuf), rxbuf, sizeof(rxbuf));
}

/* ITU0 interrupt */
void int_imib0(void)
{
  UBYTE dummy ;
  /* clear interrupt flag */
  dummy = ITU0.TSR.BYTE ;
  ITU0.TSR.BYTE = 0 ;
  /* set flag */
  tflag = ON ;
}

 動作テスト用のファームウエアの仕様は、単純です。

 ITU0のタイマー割込みで、出力に設定したポートに
 カウンタの値を出力します。また、タイマー割込み
 が発生する度に、D/Aコンバータの出力値を更新する
 だけにしました。

 省エネを考え、初期化時に以下の内部モジュールを
 使わない設定にしてみました。

 H8/3052で画像処理させ、移動処理の負担軽減に
 指示を与えたなら動くハードを用意しました。
 H8からCPLDに指示を与えると、モータ制御します。



 H8/3052のI/Oピンの内容を見てみます。
 CN1は、以下です。

 H8はポート9にシリアルインタフェース
 を割当てしているので、利用しません。

 RES0は、リセットなので、プッシュスイッチ
 を接続します。

 CN2は、以下です。A/D、D/Aインタフェース
 を、このピンにまとめています。

 AVssは、アナログ回路のGNDなので
 1点アースで、GNDに接続します。

 AVcc、AREFは、5Vに接続します。

 CN3は、以下です。

 CKを、CPLDのCLOCKに接続します。

 CPLDには、XilinxのXC9572を使います。
 XC9572のピンアサインは、以下となっています。

 回路情報をPCから与えるため、JTAGケーブルを
 利用します。XC9572には、クロック入力を3本
 あるので、5ピンをH8のCKと接続します。

 VccINTは、内部回路の動作電圧を決定するので
 5Vを与えます。VccIOは、インタフェース電圧
 を決めるので、3.3Vか5Vを指定できるように
 回路組みます。

 実験のため、TL431を利用して3.9Vをつくり
 トランジスタで3.3Vを出力します。



---------------------------------------------------
 この後は、ある程度ファームウエア、デジタル回路の
 テストが済むまで、塩漬け(冬眠状態)に。
---------------------------------------------------

目次

inserted by FC2 system