忍者ブログ

Fグループ電子工作講座

秋月電子SH7125ボードで始めるマイコン開発

XBee S1で送信器を作る(受信プログラム編)

関連:シリアル通信関連記事一覧

前回データの受信内容が判明したので、マイコン用の受信プログラムを作成します。
とりあえずsh7125用にて動作確認します。
機材はXBee S1による無線化3を使用することを前提とします。

受信処理の流れ

基本受信処理
1.0xFEを受信したら受信開始(受信数カウントを1にセット)
  ※以降は受信毎に受信数カウントを1増加
2.受信数カウント2で受信予定数の上位1byteを更新
3.受信数カウント3で受信予定数の下位1byteを更新
4.受信カウント数=受信予定数+4で受信終了
5.最後の受信データでSUMチェック
  ※SUMチェックを通った場合は解析処理
  
解析処理
1.受信種別が0x83以外の場合は解析中断
2.DI設定のポート数を確認
3.DI設定のポートが1つ以上ある場合はDI情報を取得
4.AD設定のポート数を確認
5.AD設定のポートが1つ以上ある場合はAD情報を取得


プログラム

処理内容の詳細は更新済みのシリアル通信設定(intSCI.cintSCI.h)を参照してください。
主な変更点はAPI受信処理の各種関数作成と受信割込み内でのAPI基本処理を実行です。
今までintSCIにて使用した関数はそのまま利用できます。(たぶん)

使い方(intSCIとintCMT、intMTUを組み合わせた例)
いつも通り、必要なファイルをプロジェクトへ組み込んでください。

<設定>
#include "iodefine.h"
#include "io_setup.h"
#include "intCMT.h"
#include "intSCI.h"
#include "intMTU.h"

void main(void)
{
    unsigned long timer;
    char trans_buf[255];
    int recive_status;

    hardware_setup();
    init_SCI0();
    init_SCI1();
    init_CMT0(1);
    init_MTU();
    timer=getsystime()+50;

    while(1){
        if(timer<getsystime()){
            timer=getsystime()+50;

            //apiの受信状態を取得
            recive_status=check_api_receved();

            if(recive_status==1){        //正常受信時
                set_pwm2(PWM_PE0,PWM_PE1,(get_api_ad(0)-512)*2);
                sprintf(trans_buf,"%04d,%04d,%04d,%04d\n"
                    ,get_api_ad(0)
                    ,get_api_ad(1)
                    ,get_api_ad(2)
                    ,get_api_ad(3)
                );
                write_sci1(trans_buf);
           }else if(recive_status>1){    //タイムアウト(500ms)時
                set_pwm2(PWM_PE0,PWM_PE1,0);
            } //end recive_status
        } //end timer
    } //end while
} //end main

XBeeのAD変換値に応じてLED赤(PE0)、LED緑(PE1)の調光を行います。

rx220向けのシリアル通信設定:intSCI_rx220.cintSCI_rx220.hについても同様の更新を
行ったので、同様の処理方法で同じことが行えます。
※使用ポートPC2(SCI5 Rx)、PC3(SCI5 Tx)
PR

コメント

プロフィール

HN:
ぼんどF博士
性別:
男性
自己紹介:

最新コメント