忍者ブログ

Fグループ電子工作講座

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

I2Cの設定(3)関数化

前回正しい回路にて通信を行いましたが、通信制御を1bitづつ記述して処理したため
すさまじく長く読みづらいプログラムになってしまいました。

関連
I2Cとは
I2Cの設定(1)無理矢理動かす
I2Cの設定(2)もう少し真面目に動かす
I2Cを試してみる

今回はまともに使える様に整理して関数化します。
まず、動作を「開始:ST」、「停止:SP」、「リスタート:RS」、「待機:W*」、「受信:RD」、「送信:**」に
分けます。

スタートとストップが3カウント、それ以外が4カウントをベースに制御していましたが、
共通化のためすべて4カウント=1クロックをベースに制御します。
 開始、停止、リスタート:1クロック
 受信、送信:9クロック
 待機:1~16クロック
にて制御を行います。
0,1,2,3の該当するサイクルでSCL,SDA出力を変化させます。

また、送信開始からの内部カウントをベースに制御していましたが、各動作の開始からの
カウントをベースに制御します。

制御は文字列で指定してみます。
例えば前回の受信処理であれば
 "STC801RSC9RDSP"
の様に指定するものとします。
また、受信データをshort型配列に格納するものとし、実際には
    static short recive_data[10]={0};
    write_i2c(recive_data,"STC801RSC9RDSP");
の様に実行するものとします。
受信する予定が無い場合は格納番地にNULLを指定してください。
通信完了を待機すると他の処理を行いにくいので、CMT割り込みを利用して自動実行させます。

作成したファイルを公開しておきます。
余裕が出来たら内容の詳細を説明します。
ソース:intI2C.c、ヘッダ:intI2C.h
あまりテストを行っていないので不具合なり対応できない状況なりがあると思います。

例によってCMT割込みを利用するために、
CMT1_INT_CMI_I2Cintprg.cINT_CMT1_CMI1へ登録してください。
また、resetprg.c
#define SR_Init    0x000000F0

#define SR_Init    0x00000000
へ変更する必要があります。

使い方

I2CとAD変換、タイマー、シリアル通信を組み合わせて使ってみます。
・AD変換設定:ADConv.cADConv.h
・タイマ設定:intCMT.cintCMT.h
・シリアル通信設定:intSCI.cintSCI.h
・I2C通信設定:intI2C.cintI2C.h
いつも通りに各ファイルをプロジェクトへ取り込んで、割り込みを有効にしてください。
参考:PWM機能を試す回

<設定>
#include <stdio.h>
#include "ADconv.h"
#include "intCMT.h"
#include "intI2C.h"

main(){
    unsigned long timer;
    int out_put;
    char trans_buf_i2c[255];
    char trans_buf_sci[255];
    static short recive_data[10];
    init_ADC();
    init_CMT0(1);
    init_SCI1();
    init_I2C();

    timer=getsystime()+50;
    while(1){
        if(timer<getsystime()){//50ms周期で実行
            timer=getsystime()+50;

            check_ai();    //AD変換処理
            out_put=(get_ai(0)/0x10)*0x04+0x01;    //電圧+正転

            /*書込み読出しを別々に行う場合*/
            //モーターの回転設定を書込み
            sprintf(trans_buf_i2c,"STC800%02XSP",out_put);    //I2Cコマンド組み立て(書込み)
            write_i2c(NULL,trans_buf_i2c);                    //I2C送信

            //モーターの回転設定を読出し
            sprintf(trans_buf_i2c,"STC800RSC9RDSP");        //I2Cコマンド組み立て(読出し)
            write_i2c(recive_data,trans_buf_i2c);            //I2C送信

            /*書込み読出しを連続して行う場合*//*
            sprintf(trans_buf_i2c,"STC800%02XSPSTC800RSC9RDSP",out_put);    //I2Cコマンド組み立て(書込み)
            write_i2c(recive_data,trans_buf_i2c);            //I2C送信
            /**/
            while(!check_i2c_fin());                        //通信完了待ち
            sprintf(trans_buf_sci,"%04X\n",recive_data[0]);
            write_sci1(trans_buf_sci);
        } //end timer
    } //end while
} //end main

何か所かwhileで待機しているためCMT割り込みの意味が薄いですが気にしないでください。
前回の回路に追加でPF0に可変抵抗を接続して操作すればモーターの回転数が変わるはずです。
また、書込んだ設定値を読出してシリアル通信で吐き出しています。
書込みコマンドと読出しコマンドは別々に設定することも、一度に設定することもできます。
PR

コメント

プロフィール

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

最新コメント