H8サンプルプログラム-その5
CPUボード:RY3048Fone を使って、
制御対象回路として「ものづくり kumamoto Ver.01」を制御するサンプルプログラムを作ります。
7セグメントLED(LED1、LED2)の点灯、スイッチ入力、モーターを制御します。小さなテーマの集まりですが、対象としているハードウェアの接続(ケーブル、回路内のすべて)を確認しながら進めてください。その一つひとつがプログラムの力になります。
■テーマ概要
テーマは、「モーターを制御する」です。
初期状態では、モーターは停止している。
SW1(トグルスイッチ)がオンだと、モーターは回転し、オフだと停止(ストップモード)とする。
SW2(プッシュスイッチ)を一回押下すると、モーターは逆転する。
SW2の操作は、SW1がオンの時のみ有効とする。オフの時に押下しても状態は変わらない。
更に、SW2をもう一回押下すると、モーターは更に反転して、正転する。
以後、この操作を繰り返す。
モーターが反転する際、500msecのストップを挿入する事。
SW2のチャタリング防止の為、1秒間のアイドル時間を設けておく事。
注:実際のモーターの正転/逆転は、動いている様子から明示的に分かればよい。特に(ここでは)規定しない。
------
モーターコントローラ:東芝製 TA7257
H8の出力とモーターコントローラの制御端子の関係は次の通り。
--信号の接続状況---- --駆動モード--
PB.DR.BIT.B3 → モーター駆動信号1:TA7257.IN1(Pin1)1 0 1 0
PB.DR.BIT.B1 → モーター駆動信号2:TA7257.IN2(Pin2)1 1 0 0
│ │ │ └ストップモード
│ │ └逆転/正転モード
│ └正転/逆転モード
└ブレーキモード
■接続
制御対象回路 CPUボード:RY3048Fone
CN1 → J2
CN2 → J3
J1 → トグルスイッチ、プッシュスイッチ、透過センサー、モーター
■開発環境
ルネサスエレクトロニクス社 High-performance Embedded Workshop を使います。
最新版をルネサスエレクトロニクス社のホームページよりダウンロードしてセットアップしてください。
■準備-その1
ヘッダファイルを用意します。
ファイル名:ry3048fone.h
フォルダー:自分の開発環境に合わせる。
ヘッダファイルの内容は、次の通り。
---この次から---
void InitializeIO(void);
int GetSW1(void);
int GetSW2(void);
int GetSW3(void);
void Wait1msec(void);
void WaitMsec(int msec);
#define COUNT_START 1
#define COUNT_STOP 0
#define LED_AL_OFF 0xff
#define LED_AL_ON 0x00
#define OE_ENABLE 0
#define OE_DISABLE 1
#define FET_ENABLE 1
#define FET_DISABLE 0
#define LED7SEG_ALL PA.DR.BYTE
#define OE_7SEG PB.DR.BIT.B7
#define OE_LED PB.DR.BIT.B6
#define A 0x01
#define B 0x02
#define C 0x04
#define D 0x08
#define E 0x10
#define F 0x20
#define G 0x40
#define SW1 P7.DR.BIT.B1
#define SW2 P7.DR.BIT.B3
#define SW3 P7.DR.BIT.B5
#define SW_ON 0
#define SW_OFF 1
#define True 1
#define False 0
const char LEDSegData[10] = {
~(A+B+C+D+E+F),
~(B+C),
~(A+B+G+E+D),
~(A+B+G+C+D),
~(F+G+B+C),
~(A+F+G+C+D),
~(A+F+G+C+D+E),
~(A+B+C),
~(A+B+C+D+E+F+G),
~(A+B+C+D+F+G) };
void InitializeIO(void)
{
/* 入出力端子の定義 */
PA.DR.BYTE = 0;
PA.DDR = 0xff;
PA.DR.BYTE = LED_AL_OFF;
PB.DR.BYTE = 0;
PB.DDR = 0xff;
/* タイマーの定義 */
ITU1.TCR.BYTE = 0x23;
ITU1.GRA = 0x0c00;
ITU.TSTR.BIT.STR1 = COUNT_START;
}
void Wait1msec(void)
{
for(;;){
if( ITU1.TSR.BIT.IMFA != 0 ) break;
}
ITU1.TSR.BIT.IMFA = 0;
}
void WaitMsec(int msec)
{
int iCnt;
if( msec < 0 ) return;
for( iCnt = 0 ; iCnt < msec ; iCnt++ ) Wait1msec();
}
int GetSW1(void)
{
return( SW1 );
}
int GetSW2(void)
{
return( SW2 );
}
int GetSW3(void)
{
return( SW3 );
}
---この前まで---
■準備-その2
サンプル用のスタータプログラム(アセンブラ)を用意します。
ファイル名:demo05start.src
フォルダー:プロジェクト指定のフォルダー
---この次から---
.CPU 300HA:20
STACK_BASE: .EQU H'FFFF10 ; スタック基底アドレス(モード7)
.IMPORT _main ; 外部参照(main関数)
.SECTION V ; H'000000
.DATA.L RESET_START
.SECTION P ; H'000100
RESET_START:
MOV.L #STACK_BASE,ER7 ; スタックの設定
JSR @_main ; C言語のmain()関数へジャンプ
OWARI:
BRA OWARI
.END
---この前まで---
注:このファイル(拡張子が「src」)は、これまで作成してきた中に入っています。それをそのまま、ファイル名を変えて利用されても構いません。先に作成したファイル「demo01start.src」のファイル名称を「demo05start.src」変更して流用してもよいです。
■準備-その3
サンプル用のソースプログラムファイル(C言語)を用意します。
ファイル名:demo05.c
フォルダー:プロジェクト指定のフォルダー
---この次から---
#include "3048f.h"
#include "ry3048fone.h"
void main(void);
#define MTR1 PB.DR.BIT.B3
#define MTR2 PB.DR.BIT.B1
#define CTR0 0
#define CTR1 1
void main(void)
{
/* ローカル変数の定義 */
int IsCW;
int MotorOn;
/* 処理 */
InitializeIO();
OE_7SEG = OE_DISABLE;
OE_LED = OE_DISABLE;
IsCW = True;
for(;;){
if( GetSW1() == SW_ON ){
if( GetSW2() == SW_ON ){
WaitMsec(1000);
if( IsCW == True ) IsCW = False;
else IsCW = True;
MTR1 = CTR0;
MTR2 = CTR0;
WaitMsec(500);
}
if( IsCW == True ){
MTR1 = CTR0;
MTR2 = CTR1;
} else {
MTR1 = CTR1;
MTR2 = CTR0;
}
} else {
MTR1 = CTR0;
MTR2 = CTR0;
}
}
}
---この前まで---