前回正しい回路にて通信を行いましたが、通信制御を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_I2Cを
intprg.cの
INT_CMT1_CMI1へ登録してください。
また、
resetprg.cの
#define SR_Init 0x000000
F0
を
#define SR_Init 0x000000
00
へ変更する必要があります。
使い方
I2CとAD変換、タイマー、シリアル通信を組み合わせて使ってみます。
・AD変換設定:
ADConv.c、
ADConv.h
・タイマ設定:
intCMT.c、
intCMT.h・シリアル通信設定:
intSCI.c、
intSCI.h・I2C通信設定:
intI2C.c、
intI2C.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に可変抵抗を接続して操作すればモーターの回転数が変わるはずです。
また、書込んだ設定値を読出してシリアル通信で吐き出しています。
書込みコマンドと読出しコマンドは別々に設定することも、一度に設定することもできます。