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コンバータの出力値を更新する
だけにしました。
省エネを考え、初期化時に以下の内部モジュールを
使わない設定にしてみました。
- SCI0
- Refresh controller
- A/D converter
H8/3052で画像処理させ、移動処理の負担軽減に
指示を与えたなら動くハードを用意しました。
H8からCPLDに指示を与えると、モータ制御します。
H8/3052のI/Oピンの内容を見てみます。
CN1は、以下です。
- 1 GND 2 GND
- 3 P80 4 P81
- 5 P82 6 P83
- 7 P84 8 PA0
- 9 PA1 10 PA2
- 11 PA3 12 PA4
- 13 PA5 14 PA6
- 15 PA7 16 PB0
- 17 PB1 18 PB2
- 19 PB3 20 PB4
- 21 PB5 22 PB6
- 23 PB7 24 RES0
- 25 P90 26 P91
- 27 P92 28 P93
- 29 P94 30 P95
- 31 P40 32 P41
- 33 P42 34 P42
- 35 5V 36 5V
- 37 GND 38 GND
- 39 POWER 40 POWER
H8はポート9にシリアルインタフェース
を割当てしているので、利用しません。
RES0は、リセットなので、プッシュスイッチ
を接続します。
CN2は、以下です。A/D、D/Aインタフェース
を、このピンにまとめています。
- 1 GND 2 GND
- 3 STBY 4 RES
- 5 NMI 6 P63
- 7 P64 8 P65
- 9 P66 10 AVcc
- 11 AREF 12 P70
- 13 P71 14 P72
- 15 P73 16 P74
- 17 P75 18 P76
- 19 P77 20 AVss
AVssは、アナログ回路のGNDなので
1点アースで、GNDに接続します。
AVcc、AREFは、5Vに接続します。
CN3は、以下です。
- 1 GND 2 GND
- 3 P44 4 P45
- 5 P46 6 P47
- 7 P30 8 P31
- 9 P36 10 P33
- 11 P34 12 P35
- 13 P36 14 P37
- 15 P10 16 P11
- 17 P12 18 P13
- 19 P14 20 P15
- 21 P16 22 P17
- 23 P20 24 P21
- 25 P22 26 P23
- 27 P24 28 P25
- 29 P26 30 P27
- 31 P50 32 P51
- 33 P52 34 P53
- 35 P60 36 P61
- 37 P52 38 CK
- 39 GND 40 GND
CKを、CPLDのCLOCKに接続します。
CPLDには、XilinxのXC9572を使います。
XC9572のピンアサインは、以下となっています。
- 1 2
- 3 4
- 5 GCLK1 6 GCLK2
- 7 GCLK3 8
- 9 10 GND
- 11 12
- 13 14
- 15 TDI 16 TMS
- 17 TCK 18
- 19 20
- 21 VccINT 22
- 23 GND 24
- 25 26
- 27 28
- 29 30 TDO
- 31 GND 32 VccIO
- 33 34
- 35 36
- 37 38
- 39 nRESET 40
- 41 VccINT 42
- 43 44
回路情報をPCから与えるため、JTAGケーブルを
利用します。XC9572には、クロック入力を3本
あるので、5ピンをH8のCKと接続します。
VccINTは、内部回路の動作電圧を決定するので
5Vを与えます。VccIOは、インタフェース電圧
を決めるので、3.3Vか5Vを指定できるように
回路組みます。
実験のため、TL431を利用して3.9Vをつくり
トランジスタで3.3Vを出力します。
---------------------------------------------------
この後は、ある程度ファームウエア、デジタル回路の
テストが済むまで、塩漬け(冬眠状態)に。
---------------------------------------------------
目次
前
次