ものづくりBLOG blog page

H8サンプルプログラム-その5

2010-05-28 (Fri) 09:17

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;
        }
    }
}


---この前まで---

 

ものづくりBLOG

Blog Category

Blog Calendar

RSS 2.0