マイコン電子工作あれこれ - 78K0 横丁

NECエレクトロニクス製マイコン78K0を使った工作情報サイトです。
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
ブログ カレンダー
2010年 9月
« 4月    
 1234
567891011
12131415161718
19202122232425
2627282930  
ブログ 月別過去ログ
ブログ カテゴリ一覧
オンライン状況
9 人のユーザが現在オンラインです。 (5 人のユーザが ブログ を参照しています。)

登録ユーザ: 0
ゲスト: 9

もっと...

2009年3月11日(水曜日)

78K0でラジコン

カテゴリー: - ome @ 09時58分10秒

これまでの記事78K0で無線通信(1)(2)(3)
78K0のUARTを使って簡単に無線通信できることがわかりました。
今回はその応用編として、トイラジを動かしてみたいと思います!

今回動かしたラジコン

201ラジコン外観.jpg


■■78K0でラジコンを制御することのメリット■■


短く言うと高機能化。


●メリット1●たくさんのものを制御できる

今回は前後左右のモーターのON/OFFだけを行っていますが、
もちろんソフトと回路次第でライト類の点灯・消灯など
制御対象となるものを自由に増やすことができるようになります。
●メリット2●自動操縦もできる
制御しているのが78K0なので、動作をプログラムの中に記述することで、
たとえばあるスイッチを押すと、自動で部屋を一周して戻ってくる、
というような自動操縦もできるようになります。
●メリット3●操縦される側にも自律性を持たせることができる
通常のラジコン受信機用ICは決まったことしかできません。
でも制御される側に78K0を使うことで、暗くなったら自動的に
ライトをつけたり、進む先に障害物があったら自動的にそれを
よけたりさせることができるようになります。
もちろんそれだけのプログラムを組むことが必要ですが。

いろいろ書きましたが、今回は単純に走行用モータとステアリングのON/OFFの
制御だけを行います。

■■送信機■■

■ハードウェア■

改造前の送信機です。

202送信機改造前.jpg

分解すると・・・

203送信機分解.jpg

こうなってます。基板が裏返っていてちょっとしか見えませんが、この基板の
部品面に銅板?とすずめっき線による接点が設けられていて、それがレバーで
押されてスイッチとして機能しています。回路的にはこの基板のスイッチ部分だけを
使用します。基板上のスイッチ部分とそれ以外の箇所がつながっている部分を
カッターでパターンカットします。そして下のように回路を組み、配線します。

209送信機回路図.jpg

配線し終わったのが、次の写真です。送信機の基板の上側にある蛇の目基板は
LM1117-ADJとコンデンサ、微弱無線送信モジュールが載っています。

205送信機配線.jpg

これを元の送信機のケースに戻したのがこの写真です。
トラ技78K0基板にUSBケーブルを挿せるように、ケースに切り欠きを入れています。

206送信機内部.jpg

ふたを閉めてプログラムを書き込めば、送信機として動作します。

■ソフトウェア■

今回送信機側で必要なプログラムは以下のとおりです。
・radicon_tx.c
・uart6.c
・RamStart.asm
・trgbios.h
・radicon_tx.h
・RAMAPP.dr
radicon_tx.c、radicon_tx.h以外は前々回の記事(78K0で無線通信(2))に掲載した
ものと同じものを使います。ただし、uart6.cの

#include    "wireless_test.h”

の行を

#include    "radicon_tx.h”

に変更して使ってください。

●ラジコン送信機メインプログラム radicon_tx.c●

/*
■トラ技78K0付録基板
■uPD78F0730

■radicon_tx.c
■315MHz微弱無線モジュールによるラジコン送信機

2009.2.25作成

*/

#pragma        EI                            /* 全体割り込み許可命令を使用できるようにする */
#pragma        DI
#pragma     sfr                            /* プログラム上で直接SFR名でSFRを操作できるようにする */
#include    "trgbios.h”                    /* トラ技CDのUSBの関数を使用するためにトラ技BIOSをインクルード */
#include    "radicon_tx.h”

/*
****************************************
  main 初期化
****************************************
*/
void main( void )
{
/* クロックは内部発振 16 MHz */
/* 関数の宣言 */
    unsigned char temp;                    /* データ一時保存 */
/* 入出力ポートの初期化(0:出力,1:入力) */
    PM0.0 = 0;
    PM0.1 = 0;
    PM1 = 0b11110001;
    /*    P10 スイッチ後
        
        P13 TxD6
        P15 スイッチ左
        P16 スイッチ右
        P17 スイッチ前
         */
    PM3.0 = 0;
    PM3.1 = 0;
    PM6.0 = 0;
    PM6.1 = 0;
    
    PM12.0 = 0;
    
    P6.1 = 0;/* 起動中青消灯 */
/* 通信ポートの初期化 */
    UART6_INIT( 0x09 , 13 , 0x04 );        /* UART6初期化(1200bps,8bit,none CPUユーザーズマニュアル参照) */
    UART6_MANEGE( 1 );                    /* UART6動作開始 */

/* タイマ50初期化 */
    TCL50 = 0x07;                        /* クロックは1953.125Hz */
    CR50 = 0xC3;                        /* インターバル周期は0.512mS*195 = 99.84mS */
    TMC50 = 0x00;                        /* インターバル */

/* タイマH1初期化 */
    TMHMD1 = 0b01000000;                /* タイマーH1クロックは3906.25Hz (周期0.256mS) インターバル */

/* トラ技biosに対する割り込み関数の設定 */
    trg_regintsrv( TRG_INTID_BSITM50 , READ_AND_TX );

    TMC50.7 = 1;                        /* タイマ50動作開始 */
    MK0H.5 = 0;                            /* タイマ50割り込みマスクをクリア */

    P6.1 = 1;/* 青消灯 */

/* 割り込み受付 */
    EI();
    while( 1 );/* 以後0.1Sごとにスイッチ読み込み&送信 */
}

/*
****************************************
  スイッチの読み込みと送信
****************************************
*/
void READ_AND_TX( void )        /*    0.1秒ごとにスイッチの状態を読み込み、
                                            それに応じた送信データを作る */
{
    unsigned char txdata = 0x00;
    IF1L.3 = 0;/* トラ技biosが動作しているため、割り込み要求フラグのクリアが必要 */
    if( P1.6 == 0 )                        /* 右なら2ビット目1 */
    {
        txdata = txdata | 0b00000100;
    }
    else if( P1.5 == 0 )                /* 左なら3ビット目1 */
    {
        txdata = txdata | 0b00001000;
    }
    if( P1.7 == 0 )                        /* 前なら0ビット目1 */
    {
        txdata = txdata | 0b00000001;
    }
    else if( P1.0 == 0 )                /* 後なら1ビット目1 */
    {
        txdata = txdata | 0b00000010;
    }
    txdata = txdata & 0b00001111;        /* 上位4ビットは使わないのでクリアしておく */
    if( txdata != 0b00000000 )            /* 前後左右のいずれかが押されているときのみ送信する */
    {
        P6.1 = 0;/* 送信中青点灯 */
        UART6_TX( 0x55 );                /* 受信側安定化待ち */
        UART6_TX( 0xff );
        WAIT256U( 0x26 );
        UART6_TX( 0x02 );                /* ヘッダ */
        UART6_TX( 0x0A );                /* ヘッダ */
        UART6_TX( txdata + 0x40 );        /* 無線で出力(UART6) *//* + 0x40 しているのはターミナルソフトでの表示のため */
        UART6_TX( 0x03 );                /* フッタ */
        P6.1 = 1;/* 送信後青消灯 */
    }
}

/*
****************************************
  タイマーH1を使った待ち時間生成
****************************************
*/
void WAIT256U( unsigned char c )
{
    CMP01 = c;                            /* タイマーH1リセット周期は c * 256uS */
    TMHMD1.7 = 1;                        /* タイマーH1動作開始 */
    IF0H.3 = 0;
    while( IF0H.3 != 1 );                /* タイマーH1リセットかかったらタイムアウト */
    TMHMD1.7 = 0;                        /* タイマーH1動作停止 */
    
}

●ラジコン送信機プログラム用ヘッダファイル radicon_tx.h●

/*
■トラ技78K0付録基板
■uPD78F0730

■radicon_tx.h
■315MHz微弱無線受信モジュールによるラジコン送信機のヘッダファイル

2009.2.25作成

*/

/* メイン関数の宣言 */
void main( void );
/* サブ関数の宣言 */
void READ_AND_TX( void );
void WAIT256U( unsigned char );

void UART6_INIT ( unsigned char , unsigned char , unsigned char );
void UART6_MANEGE ( unsigned char );
unsigned char UART6_RX( void );
void UART6_TX( unsigned char );

●プログラムの解説●

タイマ50で約0.1秒ごとの割り込みをつくり、そのたびに前後左右のスイッチの
ON/OFFを読み込み、前後左右のいずれかがONであれば、送信を行います。

寝ている送信モジュールを起こし、常にランダムデータを受信している
受信モジュールが正しくスタートビットを認識できるように、
前々回(78K0で無線通信(2))と同じように、0x55・0xFF・ウェイト・0x02を
送信してから、前後左右のON/OFFデータを送信しています。

今回のプログラムもトラ技BIOS上で動くものだったので、割り込みを使うためには
トラ技BIOS上のルールに従う必要がありました。
通常は78K0の開発環境でC言語を使うときはこのように、

#pragma        interrupt INTTM50 READ_AND_TX nobank

割り込みが生じたときに実行する関数を前処理指令で指定しますが、トラ技BIOS上で
割り込みを使うときには、

trg_regintsrv( TRG_INTID_BSITM50 , READ_AND_TX );

のようにトラ技BIOSの中にある割り込み関数設定用関数を使う必要があります。
また、通常の割り込みでは割り込み要求フラグは割り込みが生じると自動的に
クリアされますが、トラ技BIOS上ではこれを割り込みごとにクリアしてやる必要が
あります。クリアしないとクリアするまで次の割り込みが起こらないことになります。

また、送信時にはトラ技基板上の青LEDを点灯させています。スイッチのすきまから
青い光が見えて、送信中であることがわかります。

■■受信機■■

■ハードウェア■

まず元のラジコン受信機の基板に載っているトイラジ受信機専用ICのデータシートを
探してみてみるか、基板から回路図を起こして、基板のどこにどんな信号を入れれば
走行用モーター・ステアリング用モーターをまわせるのか調べます。
今回の基板ではモーターをドライブしているトランジスタが見つかったので、
基板のそのほかの部分に電源を供給しているパターンをカットして、それらの
トランジスタのベースにエレキジャック78K0基板のデジタル出力を接続しました。

208受信機基板.jpg

エレキジャック78K0基板側の回路もブレットボード上に組みます。

207受信機回路.jpg

回路図は下のとおりです。

210受信機回路図.jpg

■ソフトウェア■

受信機側に必要なプログラムは以下のとおりです。
・radicon_rx.c
・uart6.c
・radicon_rx.h

uart6.cは前々回(78K0で無線通信(2))と同じものを使います。ただ、
送信側と同じように、

#include    "wireless_test.h”

#include    "radicon_rx.h”

に変更してください。

●ラジコン受信機メインプログラム radicon_rx.c●

/*
■エレキジャック78K0付録基板
■uPD78F0503DA

■radicon_rx.c
■315MHz微弱無線受信モジュールによるラジコン受信機

2009.2.25作成

*/

#pragma        interrupt INTTM50 TURNOFF nobank/* タイマ50割り込み時に実行する関数 */
#pragma        DI                                    /* 全体割り込み禁止命令を使用できるようにする */
#pragma        EI                                    /* 全体割り込み許可命令を使用できるようにする */
#pragma     sfr                            /* プログラム上で直接SFR名でSFRを操作できるようにする */
#include    "radicon_rx.h”

/*
****************************************
  ハードウェアの初期化
****************************************
*/
void INIT( void )
{
/* クリスタルは 10 MHz */
/* メモリ・クロック初期化 */
    IMS  = MEMORY_IMS_SET;                /* 内部RAM,内部ROMのメモリサイズ設定 */
    AMPH = OSC_FREQ_CONT;                /* 発振周波数範囲の設定 */
    OSCCTL = CLOCK_MODE;                /* クロック動作モード設定 */

    MOC = 0x00;                            /* X1発振回路の発振開始 */
    while( OSTC != 0x1f );                /* X1入力クロック発振安定待ち(6.55ms以上) */
    MCM  = SYSTEM_CLOCK_SELECT;            /* システムクロック供給選択 */
    PCC  = 0x00;                        /* CPU動作クロック:fx(10MHz)に設定 */

/* 入出力ポートの初期化(0:出力,1:入力) */
    /* PORT0 */
    PM0.0 = 0;
    PM0.1 = 0;
    /* PORT1 */
    PM1.0 = 0;/* TxD0 */
    PM1.1 = 0;/* RxD0 */
    PM1.2 = 0;
    PM1.3 = 0;/* TxD6 */
    PM1.4 = 1;/* RxD6 *//* 受信 */
    PM1.5 = 0;/* 受信確認用 */
    PM1.6 = 0;/* 右 */
    PM1.7 = 0;
    /* PORT2 A/D兼用 */
    PM2.0 = 0;
    PM2.1 = 0;
    PM2.2 = 0;
    PM2.3 = 0;
    /* PORT3 割り込み兼用 */
    PM3.0 = 0;/* 左 */
    PM3.1 = 0;
    PM3.2 = 0;/* 前 */
    PM3.3 = 0;/* 後 */
    /* PORT6 I2C */
    PM6.0 = 0;
    PM6.1 = 0;
    /* PORT12.0 割り込み兼用 */
    PM12.0 = 0;
    
    P1.5 = 1;/* 電源投入確認のためLED点灯 */
    
/* UART初期化・動作開始 */
    UART6_INIT( 0x06 , 0x41 , 0x04 );    /* UART6初期化(1200bps,8bit,none CPUユーザーズマニュアル参照) */
    UART6_MANEGE( 1 );                    /* UART6動作開始 */
/* タイマ50初期化 */
    TCL50 = 0x07;                        /* クロックは2441.40625Hz */
    CR50 = 0xF2;                        /* 0.4096ms×242=99.1232ms */
    TMC50 = 0x00;                        /* インターバル */
    
    MK0H.5 = 0;                            /* タイマ50割り込みマスククリア */
    
    EI();                                /* 全体割り込み許可 */
}

/*
****************************************
  main 315MHz微弱無線受信
****************************************
*/

void main( void )
{
/* 変数の宣言 */
    unsigned char temp;
/* ハードウェアの初期化 */
    INIT();                                /* メモリ・クロック初期化、入出力設定 */
/* 無線受信→UART送信 */
    while( 1 )
    {
        temp = UART6_RX();
        if( temp == 0x02 )
        {
            temp = UART6_RX();
            if( temp == 0x0A )            /* 連続で0x20,0x0Aを受信したときのみ駆動 */
            {
                temp = UART6_RX();
                DRIVE( temp );
            }
        }
    }
}

/*
****************************************
  モータ駆動
****************************************
*/
void DRIVE ( unsigned char temp )
{
    if( ( temp <= 0x4A ) & ( temp >= 0x41 ) )
    {
        TMC50.7 = 0;                    /* タイマ50動作停止 */
        P1.5 = 1;/* 受信LED点灯 */
        if( ( temp & 0b00000001 ) == 0b00000001 )
            P3.2 = 1;/* 前駆動 */
        else if( ( temp & 0b00000010 ) == 0b00000010 )
            P3.3 = 1;/* 後駆動 */
        else
        {
            P3.2 = 0;/* 前後とも停止 */
            P3.3 = 0;
        }
        if( ( temp & 0b00000100 ) == 0b00000100 )
            P1.6 = 1;/* 右駆動 */
        else if( ( temp & 0b00001000 ) == 0b00001000 )
            P3.0 = 1;/* 左駆動 */
        else
        {
            P1.6 = 0;/* 右左とも停止 */
            P3.0 = 0;
        }
        TMC50.7 = 1;                    /* タイマ50動作開始 */
    }
    else
    {
            P3.2 = 0;/* 前後右左とも停止 */
            P3.3 = 0;
            P1.6 = 0;
            P3.0 = 0;
            P1.5 = 0;/* 受信LEDも消灯 */
    }
}

/*
****************************************
  一回受信につき0.1秒のみモーターを駆動
****************************************
*/
void TURNOFF ( void )
{
    TMC50.7 = 0;                        /* タイマ50動作停止 */
    P3.2 = 0;/* 前後右左とも停止 */
    P3.3 = 0;
    P1.6 = 0;
    P3.0 = 0;
    P1.5 = 1;/* 受信LED消灯 */
}

●ラジコン受信機プログラム用ヘッダファイル radicon_rx.h●

/*
■エレキジャック技78K0付録基板
■uPD78F0503DA

■radicon_rx.h
■315MHz微弱無線受信モジュールによるラジコン受信機のヘッダファイル

2009.2.25作成

*/

#define MEMORY_IMS_SET            0xC8    /* 内部RAM1KByte,内部ROM32KByteに設定 */
#define OSC_FREQ_CONT            0x00    /* 発振周波数範囲「1 MHz≦fXH≦10 MHz」 */
#define CLOCK_MODE                0x40    /* X1,X2端子をX1発振モードに設定 */
#define SYSTEM_CLOCK_SELECT        0x07    /* CPUや周辺に高速システムクロックを供給 */

/* メイン関数の宣言 */
void main( void );
/* サブ関数の宣言 */
void INIT( void );

void UART6_INIT ( unsigned char , unsigned char , unsigned char );
void UART6_MANEGE ( unsigned char );
unsigned char UART6_RX( void );
void UART6_TX( unsigned char );

void DRIVE ( unsigned char );
void TURNOFF ( void );

●プログラムの解説●

信号がなければ何もせずにただ待ちます。連続して0x02,0x0Aを受信すると
そのあとの1バイトを読み込み、スイッチが入っているモーターをスイッチが
入っている方向にON("H"を出力)します。同時にタイマを動作開始し、
その後約0.1秒以内に連続して0x02,0x0Aを受信しなければ、タイマの割り込みで
ONにしていたモーターをOFFにします。約0.1秒以内に連続して0x02,0x0Aを
受信すれば、タイマを停止してスイッチの入っているモーターをONにします。
そしてタイマを動作開始します。タイマは何かスイッチがONになっているときだけ
動作するということになります。
要は一回の受信につき約0.1秒間モーターを動かしているということです。
そして送信機のスイッチが連続してONされているときは、約0.1秒ごとに送受信
することになるので、連続してモーターも駆動されるということです。

また、電源を入れるとLEDが点灯します。最初の連続した0x02,0x0A受信以後は
モーター動作中のみ点灯します。

実はこのプログラムでは元のトイラジとは同じ動作をしません。トイラジの
ステアリングはON/OFFで、切れ角の制御をしていません。右いっぱいに切るか、
左いっぱいに切るか、切れ角0°(直進)のいずれかしかありません。
そしてステアリングの切れ角をトイラジ受信機専用ICに伝える信号線が
ステアリング部分から出ており、直進時はこの切れ角が0°でなくなったときに
反対方向にステアリングを切り、直進の状態を保ちます。

今回のプログラムでは、ステアリングのモーターを単にON/OFFさせているだけ
なので、ステアリングのレバーを戻して直進にしても、ステアリングは切れたまま
になっています。ステアリングを切ったあとは切れたままのステアリングを
切れ角0°にするために、ステアリングを短時間反対側に切って戻してやる必要が
あります。もちろん切れ角検出の線を78K0に入力して、ソフトを変えてやれば
元のトイラジと同じように、ステアリングを切ったあとに自動的に切れ角0°に
戻してくれるようにすることもできます。

■■次回予告!!!■■
次回はトラ技・エレキジャック78K0基板を使って、コンセントに挿した家電製品の
電気代を算出してパソコン上に表示する電力料金計を製作します!!!
省エネもとい、エコが叫ばれる昨今、強力な味方となるはずです!!!
そしてその電力料金計のソフトは、去年の秋にリリースされた
マイコン統合開発プラットフォーム CubeSuite を使って書こうと思います!!!
乞うご期待!!!


2009年3月4日(水曜日)

78K0で無線通信(3)

カテゴリー: - ome @ 15時52分51秒

今回が78K0で微弱無線通信シリーズの最終回です!
といっても次回の記事も78K0+微弱無線の予定で、
いきなり冒頭で次回予告ですが、78K0+微弱無線でラジコンを動かしてみます!
というか動きました!!!次回をお楽しみに!
掲載が延び延びになった送信側78K0用HEXファイル・受信側78K0用HEXファイル
このページの一番下にあります!お待たせいたしました!!

前回の予告どおり、実際に行った実験の手順をご紹介!
また、実験に必要で前回掲載できなかった、UARTの制御をするプログラム、
ヘッダファイル、プログラムの開始番地の指定ファイルも大公開!

前回(78K0で無線通信(1))、前々回(78K0で無線通信(2))の記事を
読んでおられない方はぜしあわせてお読みください!


■■プログラムを動作させて実際に微弱無線通信してみる手順■■

では実際に読者の方が78K0で無線通信(1)回路を組んだとして、実際に
わたしが行ったのと同じ微弱無線通信を行う手順を紹介します。

●受信側のプログラムの書き込み●
回路を組んでパソコンとUSB接続し、PG-FPL3を起動して受信側78K0用HEXファイル
を書き込みます。回路図の青い*の部分を書き込んだあとに動作側に切り替える
のをお忘れなく。

●送信側プログラムの書き込み●
トラ技BIOSはとても便利なので、これを消さずに動作させます。なのでPG-FPL3を
使わず、トラ技BIOSを使って書き込みます。

まず回路を組んでパソコンとUSB接続し、Teratermを起動します。
Teratermの設定は
ポート:トラ技基板が接続されているポート
ボーレート:何でもいいけど115200が速い
データ:8bit
パリティ:なし
ストップ:1bit
フロー制御:なし
にします。
Enterを押すと下のような画面になります。これでトラ技BIOSが起動しました。

101トラ技BIOS起動.JPG

ここで"load"と入力しEnterを押すと、Drop a HEX file. と表示されるので、
送信側78K0用HEXファイルをTeratermの白い部分にドラッグアンドドロップします。
すると次のような画面になります。これで送信側の書き込みも終わりです。

102HEXファイルドロップ後.JPG

●いよいよ微弱無線通信!!!●
送信側のTeratermは終了させずに、"jmp f000″と入力しEnterを押します。
すると下のような画面になり、書き込んだプログラムが動作し始めます。
これで送信側の準備はOKです。

103jmpf000.jpg

受信側はPG-FPL3を終了して、代わりに受信のためにもう一つTeratermを起動します。
その設定は
ポート:FT232RLが接続されているポート
ボーレート:19200
データ:8bit
パリティ:なし
ストップ:1bit
フロー制御:なし
にします。これで受信側の準備も終わりです。

この準備が終わった状態で送信側のTeratermをアクティブにし、
キーボードを適当に打ってみてください。送信側で"asdf"と打ったら、

104送信側.JPG

受信側のTeratermにも"asdf"と表示されました!!通信は大成功!!!

105受信側.JPG

■■次回予告!!!■■
冒頭でもいきなり次回予告してしまいましたが、来週はこれまでの無線通信実験の
応用編として78K0でラジコンを動かします!
そいでもってomeの投稿記事の次々回予告もしますが、今度は78K0を使って
さらに微弱無線でまた別なことをやりたいと思います!!!
さらにさらに!去年の秋に新しく公開されたマイコン統合開発プラットフォーム
 CubeSuite も使ってみようと思います!!!乞うご期待!!!

■■前回掲載できなかった実験に必要なそのほかのファイル■■
いっぱいスクロールしなくてもよいようにプログラム本文やHEXファイルの
フォントを小さくしてあります。メモ帳などにコピーして参照ください。

●●送信側に必要なファイル●●
送信側には以下の4つのファイルと送信側メインプログラム wireless_test.cが
必要です。
・送信側ヘッダファイル wireless_test.h
・送信側ヘッダファイル trgbios.h
・UART6制御プログラム uart6.c
・プログラムの開始番地の指定ファイル RAMAPP.dr

●送信側ヘッダファイル wireless_test.h●

/*
■トラ技78K0付録基板
■uPD78F0730

■wireless_test.h
■315MHz微弱無線受信モジュールのテスト用ヘッダ

2008.12.10作成

*/

/* メイン関数の宣言 */
void main( void );
/* サブ関数の宣言 */
void WAIT256U( unsigned char );

void UART6_INIT ( unsigned char , unsigned char , unsigned char );
void UART6_MANEGE ( unsigned char );
unsigned char UART6_RX( void );
void UART6_TX( unsigned char );

●送信側ヘッダファイル trgbios.h●
→トラ技2008年8月号付録CD-ROMからコピーしてください

●UART6制御プログラム uart6.c●

/*
■トラ技78K0付録基板
■uPD78F0730

■uart6.c
■UART6初期化・送受信

2008.12.10作成

*/

#pragma     sfr                            /* プログラム上で直接SFR名でSFRを操作できるようにする */
#include    "wireless_test.h”

/*
****************************************
  UART6 初期化
****************************************
*/
void UART6_INIT ( unsigned char u6clk , unsigned char u6rate , unsigned char u6mode )
{
//    STMK6 = 0;                             /* 割り込み処理許可 */
//    STPR6 = 0;                             /* 高優先順位レベル */

    P1.3 = 1;                            /* P13から"H"を出力 */

    CKSR6 = u6clk;                        /* UART基本クロックの選択 */
    BRGC6 = u6rate;                        /* ボーレートの設定 */
    ASIM6 = u6mode;                        /* 動作モードの設定 */
}

/*
****************************************
  UART6 動作開始・停止
****************************************
*/
void UART6_MANEGE ( unsigned char m )
{
    unsigned char i;
    if( m == 0x01 )                        /* 引数 1 なら動作開始 */
    {
        POWER6 = 1;                        /* 内部動作クロックの許可 */
        TXE6 = 1;                        /* 送信動作許可 */
        RXE6 = 1;                        /* 受信動作許可 */
    }
    else if( m == 0x00 )                /* 引数 0 なら動作停止 */
    {
        TXE6 = 0;                        /* 送信動作禁止 */
        RXE6 = 0;                        /* 送信動作禁止 */
        POWER6 = 0;                        /* 内部動作クロックの禁止 */
    }
    for( i = 0; i < 50; i++ );            /* 動作安定のためのwait */
}

/*
****************************************
  UART6 1バイト受信
****************************************
*/
unsigned char UART6_RX( void )
{
/* 変数の宣言 */
    char rx1byte;
    char rx_err;

    while( SRIF6 != 1 )                    /* UART受信完了フラグが立つまでループ */
    rx_err = ASIS6;                        /* UART受信エラー・ステータス変数"rx_err"へ代入 */
    rx1byte = RXB6;                        /* UART受信データを変数(rx_ascii)へ代入 */
    SRIF6 = 0;                            /* UART受信完了フラグをクリア */
    return rx1byte;                        /* 受信した1バイトを返す */
    
}

/*
****************************************
  UART6 1バイト送信
****************************************
*/
void UART6_TX( unsigned char tx1byte )
{
    while( ASIF6 != 0x00 );                /* 送信可になるまでループ */
    TXB6 = tx1byte;                        /* 送信バッファレジスタへ送信データの書き込み */

    P1.5 = 0;/* 通信中赤点灯 */
    while( STIF6 != 1 );                /* UART送信完了フラグが立つまでループ */
    STIF6 = 0;                            /* UART送信完了フラグをクリア */
    P1.5 = 1;
}

●プログラムの開始番地の指定ファイル RAMAPP.dr●
→トラ技2008年8月号付録CD-ROMからコピーしてください

●●受信側に必要なファイル●●
受信側には以下の3つのファイルと受信側メインプログラム wireless_test.cが
必要です。
・UART6制御プログラム uart6.c(送信側とは別物)
・UART0制御プログラム uart0.c
・受信側ヘッダファイル wireless_test.h(送信側とは別物)

●UART6制御プログラム uart6.c(送信側とは別物)●

/*
■エレキジャック78K0付録基板
■uPD78F0503DA

■uart6.c
■UART6初期化・送受信

2008.12.10作成

*/

#pragma     sfr                            /* プログラム上で直接SFR名でSFRを操作できるようにする */
#include    "wireless_test.h”

/*
****************************************
  UART6 初期化
****************************************
*/
void UART6_INIT ( unsigned char u6clk , unsigned char u6rate , unsigned char u6mode )
{
//    STMK6 = 0;                             /* 割り込み処理許可 */
//    STPR6 = 0;                             /* 高優先順位レベル */

    P1.3 = 1;                            /* P13から"H"を出力 */

    CKSR6 = u6clk;                        /* UART基本クロックの選択 */
    BRGC6 = u6rate;                        /* ボーレートの設定 */
    ASIM6 = u6mode;                        /* 動作モードの設定 */
}

/*
****************************************
  UART6 動作開始・停止
****************************************
*/
void UART6_MANEGE ( unsigned char m )
{
    unsigned char i;
    if( m == 0x01 )                        /* 引数 1 なら動作開始 */
    {
        POWER6 = 1;                        /* 内部動作クロックの許可 */
        TXE6 = 1;                        /* 送信動作許可 */
        RXE6 = 1;                        /* 受信動作許可 */
    }
    else if( m == 0x00 )                /* 引数 0 なら動作停止 */
    {
        TXE6 = 0;                        /* 送信動作禁止 */
        RXE6 = 0;                        /* 送信動作禁止 */
        POWER6 = 0;                        /* 内部動作クロックの禁止 */
    }
    for( i = 0; i < 50; i++ );            /* 動作安定のためのwait */
}

/*
****************************************
  UART6 1バイト受信
****************************************
*/
unsigned char UART6_RX( void )
{
/* 変数の宣言 */
    char rx1byte;
    char rx_err;

    P1.6 = 1;
    P1.7 = 1;
    while( (SRIF6 != 1) & (ASIS6 == 0x00) );/* UART受信完了フラグまたはエラーフラグが立つまでループ */
    if( SRIF6 == 1 )
        P1.7 = 0;
    else
        P1.6 = 0;
    rx_err = ASIS6;                        /* UART受信エラー・ステータス変数"rx_err"へ代入 */
    rx1byte = RXB6;                        /* UART受信データを変数(rx_ascii)へ代入 */
    SRIF6 = 0;                            /* UART受信完了フラグをクリア */
    SREIF6 = 0;                            /* UART受信エラーフラグをクリア */
    return rx1byte;                        /* 受信した1バイトを返す */
    
}

/*
****************************************
  UART6 1バイト送信
****************************************
*/
void UART6_TX( unsigned char tx1byte )
{
    while( ASIF6 != 0x00 );                /* 送信可になるまでループ */
    TXB6 = tx1byte;                        /* 送信バッファレジスタへ送信データの書き込み */

    while( STIF6 != 1 )                    /* UART送信完了フラグが立つまでループ */
    STIF6 = 0;                            /* UART送信完了フラグをクリア */
}

●UART0制御プログラム uart0.c●

/*
■エレキジャック78K0付録基板
■uPD78F0503DA

■uart6.c
■UART6初期化・送受信

2008.12.3作成

*/

#pragma     sfr                            /* プログラム上で直接SFR名でSFRを操作できるようにする */
#include    "wireless_test.h”

/*
****************************************
  UART0 初期化
****************************************
*/

void UART0_INIT( unsigned char u0rate , unsigned char u0mode )
{

    P1.0 = 1;                            /* P10から"H"を出力 */

    BRGC0 = u0rate;                        /* ボーレートの設定 */
    ASIM0 = u0mode;                        /* 動作モードの設定 */
}

/*
****************************************
  UART0 動作開始・停止
****************************************
*/

void UART0_MANEGE ( unsigned char m )
{
    unsigned char i;
    if( m == 0x01 )                        /* 引数 1 なら動作開始 */
    {
        POWER0 = 1;                        /* 内部動作クロックの許可 */
        TXE0 = 1;                        /* 送信動作許可 */
        RXE0 = 1;                        /* 受信動作許可 */
    }
    else if( m == 0x00 )                /* 引数 0 なら動作停止 */
    {
        TXE0 = 0;                        /* 送信動作禁止 */
        RXE0 = 0;                        /* 送信動作禁止 */
        POWER0 = 0;                        /* 内部動作クロックの禁止 */
    }
    for( i = 0; i < 50; i++ );            /* 動作安定のためのwait */
}

/*
****************************************
  UART0 1バイト受信
****************************************
*/

unsigned char UART0_RX( void )
{
/*** 変数の宣言 ***/
    char rx_1byte;
    char rx_err;

    while( IF1L.1 != 1 );                /* UART受信完了フラグが立つまでループ */
    rx_err = ASIS0;                        /* UART受信エラー・ステータス変数"rx_err"へ代入 */
    rx_1byte = RXB0;                    /* UART受信データを変数(rx_ascii)へ代入 */
    IF1L.1 = 0;                         /* UART受信完了フラグをクリア */
    return rx_1byte;                    /* 受信した1バイトを返す */
}

/*
****************************************
  UART0 1バイト送信
****************************************
*/

void UART0_TX( unsigned char tx_ascii )
{
    while( IF0H.2 != 0x00 );            /* 送信可になるまでループ */
    TXS0 = tx_ascii;                    /* 送信バッファレジスタへ送信データの書き込み */

    while( IF0H.2 != 1 );                /* UART送信完了フラグが立つまでループ */
    IF0H.2 = 0;                         /* UART送信完了フラグをクリア */
}

●受信側ヘッダファイル wireless_test.h(送信側とは別物)●

/*
■エレキジャック78K0付録基板
■uPD78F0503DA

■wireless_test.h
■315MHz微弱無線モジュールのテスト(エレキジャック基板:受信側 トラ技基板:送信側)

2008.12.3作成

*/

#define MEMORY_IMS_SET            0xC8    /* 内部RAM1KByte,内部ROM32KByteに設定 */
#define OSC_FREQ_CONT            0x00    /* 発振周波数範囲「1 MHz≦fXH≦10 MHz」 */
#define CLOCK_MODE                0x40    /* X1,X2端子をX1発振モードに設定 */
#define SYSTEM_CLOCK_SELECT        0x07    /* CPUや周辺に高速システムクロックを供給 */

/* メイン関数の宣言 */
void main( void );
/* サブ関数の宣言 */
void INIT( void );

void UART6_INIT ( unsigned char , unsigned char , unsigned char );
void UART6_MANEGE ( unsigned char );
unsigned char UART6_RX( void );
void UART6_TX( unsigned char );

void UART0_INIT ( unsigned char , unsigned char );
void UART0_MANEGE ( unsigned char );
unsigned char UART0_RX( void );
void UART0_TX( unsigned char );

■■送信側78K0用HEXファイル・受信側78K0用HEXファイル■■

送信側78K0用HEXファイル

:010080007F00
:01008100007E
:01008400007B
:10F00000B7B1891CD6710B20711B20132110710B15
:10F0100023711B23710B26711B26710A2C1B0610F2
:10F020000400B1A00DB1A0099A96F0B0B010010093
:10F030009AABF0136C40AE014D20AD429ACC1862F1
:10F04000BE01100100B1C6809AD818B01B06105539
:10F05000009AFDF010FF009AFDF01026009A83F050
:10F060001002009AFDF0100A009AFDF0AE01A00017
:10F07000309AFDF01003009AFDF01A06FAB81A064D
:10F08000B0B6AF60F21A717A6C713BE13136E102D1
:10F09000FAFA717B6CAFB7B1891CD63A0187F65684
:10F0A000AE06F657AE08F650B0B6AFB7B1B1891C90
:10F0B000D6AE0251BD0B717A50716A50715A50FA36
:10F0C0000FAE024D00BD09716B50715B50717B50EA
:10F0D000A100BE01AE014D329D07AE0141BE01FA55
:10F0E000F3B0B0B6AFB73106E105F45377FAF7F0F5
:10F0F0000A76710BE16670276131D2B6AFB7D6F4EC
:10F10000554D00BDFA66F20B5B013116E102FAFAC9
:07F11000711BE15A01B6AFCB
:00000001FF
 

受信側78K0用HEXファイル

:0200000080007E
:1000800061D0EE1CE0FE9AF6001000000354FB0362
:1000900040FB0344FB400342FB1058FB0356FB1696
:1000A0001FFEA3C0A100BB8BFD1680001478FBC609
:1000B000EA8000AD0687958684FAF41678FBC6EAD6
:1000C00078FBAD06A1009786FAF41680001478FB41
:1000D000C6EA8000AD0687958684FAF41678FBC6DA
:1000E000EA78FBAD06A1009786FAF49A9F0110000A
:1000F000009AF700FAFEAF0240FB3061013027D6CC
:1001000067616EAD129696B7C6CA00FBD68730AE51
:0B01100001B69A1901FAE9FAFE3198D5
:10011B0013F0C8710B9F139F4013A200F4A34D1F44
:10012B00BDFA13A10713FB00710B20711B20710B80
:10013B0021711A21712B21713B21714A21715B2194
:10014B00716B21717B21710B22711B22712B22711F
:10015B003B22710B23711B23712B23713B23710BDF
:10016B0026711B26710B2C7B01100400B1A041B131
:10017B00A0069AC401B0B01001009AD90110050075
:10018B00B1A0C89A6102B01001009A7602136C609C
:10019B00111AFFAFB79A1B019A130262764D02BD7B
:1001AB00F79A130262764D0ABDEE9A13026276C677
:1001BB00A1009AC802FAE1B6AFB7B1891CD63A01D1
:1001CB0087F656AE06F657AE08F650B0B6AFB7B1D7
:1001DB00B1891CD6AE0251BD0B717A50716A507148
:1001EB005A50FA0FAE024D00BD09716B50715B5046
:1001FB00717B50A100BE01AE014D329D07AE014196
:10020B00BE01FAF3B0B0B6AFB76A017A01A1003103
:10021B0006E1014172F4534D00A100BD0141615A49
:10022B00BDEB3107E1047B01FA026B01F45377F06C
:10023B000A76710BE1717BE06670276131D2B6AF44
:10024B00B7D6F4554D00BDFA66F20B3116E10571C8
:10025B001BE1FAF7B6AFB7B1891CD68730AE06D61D
:10026B000A0166F67167F670B0B6AFB7B1B1891C0B
:10027B00D6AE0251BD0B717A70716A70715A70FAF9
:10028B000FAE024D00BD09716B70715B70717B70AD
:10029B00A100BE01AE014D329D07AE0141BE01FA78
:1002AB00F3B0B0B6AFB73116E202FAFAF47377F4E3
:1002BB007276711BE26670276131D2B6AFB7D63159
:1002CB0027E102FAFA66F6743126E102FAFA712B8B
:0302DB00E1B6AFDA
:00000001FF
 


20 queries. 0.200 sec.
Powered by WordPress Module based on WordPress ME & WordPress

メインメニュー
Google Search
SiteSearch Google
Google

WWW サイト
78K0 最新ヘッドライン