No.8 サポート・ページMission2 第4章 78Kマイコンによる温度計(3)
4-5 温度測定プログラムのI2C処理ルーチンの説明
I2C処理は,I2Cインターフェースで接続された温度センサへの送受信関係の関数です.これらのソース・コードはアプリレット・プログラムの「シリアル」メニュの「IIC0」タブでのI2Cモジュールに指定することによって,ほとんどが完成します.
この処理関数は、そのまま使用します.
●I2Cドライバのコード生成
アプリレット・プログラムでは,図4-9に示す画面のようにマイコンのI2C 処理である「シリアル」メニュの「IIC0」タブに移動し,I2C の機能を設定します.
引き続き,I2Cに関する詳細は図4-10のように転送モードをシングル・マスタに指定します.送信/受信の完了ルーチンはコールバック関数出力指定を行って,あとでコーディングを追加します.


シングル・マスタと転送速度,コールバック関数出力の指定.
●I2C ルーチンのコールバック関数にソース・コードを追加
I2C 関連のソース・コードは,UART6で使用したファイルと同じファイル,serial_user.cに作られます.追加するコードは,I2Cのデータ転送が完了したら実行されるコールバック関数となる受信完了ルーチンと送信完了ルーチンの2か所に追加します.
この追加は標準的に行われるもので,終了フラグのセットするテキスト「sensor_finish = 1; 」を1行それぞれに追加します(リスト4-4,リスト4-5 ).このグローバル変数「sensor_finish」は,あらかじめ定義しておきます.
-----------------リスト4-4serial_user.c IICの送信終了フラグ処理を追加
void CALL_IIC0_MasterSendEnd( void )
{
SPT0 = 1;
sensor_finish = 1; /* 指定バイト数のデータ送信完了*/
}
-----------------
-----------------リスト4-5serial_user.c IIC0の受信終了フラグ処理を追加
void CALL_IIC0_MasterReceiveEnd( void )
{
SPT0 = 1;
sensor_finish = 1; /* 指定バイト数のデータ受信完了*/
}
-----------------
●I2Cのデータ転送関数
I2Cのデータ転送関数は,アプリレット・プログラムが作った送信関数と受信関数をそのまま使います.途中から送受信が切り替わる機能は使用していません.また,この関数は,データ転送の完了まで待たずに戻ってきます.
データ転送関数の形式
・adr:スレーブ・アドレス(接続するLM73 のアドレス)
・txbuf, rxbuf: データ送受信バッファ・ポインタ
・txnum: データ転送バイト数
・wait:IIC バス変化待ち時間( 使用していない)
◆ データ送信関数:
IIC0_MasterSendStart(UCHAR adr, UCHAR* txbuf, UINT txnum, UCHAR wait)
◆ データ受信関数
IIC0_MasterReceiveStart(UCHAR adr, UCHAR* rxbuf, UINT rxnum, UCHAR wait)
データの転送完了をチェックするコーディングは,コールバック・ルーチンに設けた完了フラグを,送信関数/受信関数の前後に挟み,チェックするようにします(リスト4-6).
-----------------リスト4-6 送信データ転送と,その完了チェックのコーディング
sensor_finish = 0 ; /* 送信完了フラグ・クリア*/
IIC0_MasterSendStart(sensor_addr, set_ondo_13bit, 2,1);
/* 送信開始*/
while (!sensor_finish){}; /* 送信完了待ち*/
-----------------
4-6 温度測定プログラムのメイン・ルーチンの説明
温度測定のメイン処理は,空のMain.cがすでにアプリレット・プログラムで作られているので,ここに実際の処理を追加します.メイン・ルーチンのソース・コードは,UARTやI2Cなどのマイコンの周辺機能に依存するコーディングがあまりありません.
メイン・ルーチンでは,次のような処理を行い温度測定処理を行います.
◆ 受信リング・バッファの初期化
◆ 温度センサに対して温度分解能を13 ビット長とする設定
◆ UART 経由でコマンドがくるのを待つ
◆ コマンドが来ると,I2C 経由で温度センサから温度データを読む
◆ 温度値を10 倍にしてASCII 文字に変換
◆ UART 経由で10 進数の温度ASCII 数字をパソコンに送る
● プログラムの追加(メイン・ルーチン)メイン・ルーチンMain.cには,次の一連の動作を追加します.
(1)初期化-受信リング・バッファのポインタアプリレット・プログラムで指定したUART6やI2Cの初期化はSysteminit.cの中で処理が行われているので,メイン・ルーチンで行う必要がありません.
ここでは,コーディングを追加した受信リング・バッファのポインタをクリアして,UART6を開始させます(リスト4-7).
-----------------リスト4-7 受信リング・バッファのポインタをクリアする
UART6_rd_ptr=0; //受信リング・バッファのポインタをクリア
UART6_wr_ptr=0;
UART6_Start();
-------------
(2)初期化-温度センサの設定
最初は温度センサLM73が13ビット分解能になるように,レジスタ4に設定します.I2Cのデータ送信関数の前には「sensor_finish」をクリアしてデータ送信を開始します.データ転送の完了はコールバック関数に追加したグローバル変数「sensor_finish」がセットするので,それまで待ちます(リスト4-8).
----------リスト4-8温度センサを13ビット分解能に設定
unsigned char set_ondo_13bit[2]= {0x04,0x68 };
//センサの分解能を13ビットに設定する
sensor_finish = 0 ;
IIC0_MasterSendStart(sensor_addr,set_ondo_13bit, 2,1);
/* 送信開始*/
while (!sensor_finish){}; /* 送信完了待ち*/
//センサ・レジスタを0にして、温度データにポインタ設定
sensor_finish = 0 ;
IIC0_MasterSendStart(sensor_addr, &set_ondo_reg0,1,1);
/* 送信開始*/
while (!sensor_finish){}; /* 送信完了待ち*/
-----------------------------
(3)パソコンからのコマンド受信待ち
センサからの読み込み動作は,UART経由の計測開始コマンドとなるASCII文字‘M’を受信した時点で開始します.ここでは,この読み込んで結果をパソコンに送信する,大きなループを作ります.受信したデータが‘M’文字のときは温度センサからデータを読み動作し,それ以外の受信文字はすべて無視します(リスト4-9).
---------------リスト4-9 パソコンから‘M’ コマンドが送られてくるのを待つ
int c;
while(1) {
if ( (c=UART6_get1char()) == 'M') { //
UART6_rd_ptr=0; // 受信リング・バッファのポインタをクリア
UART6_wr_ptr=0;
UART6_Start();
---------------
(4)温度センサからデータを読み出す
‘M’コマンドを受信したら,温度センサからデータ2バイトを読み出します(リスト4-10).
---------------リスト4-10 センサから温度データを読み出す
//センサより温度データ2バイトを読む
sensor_finish = 0 ;
IIC0_MasterReceiveStart(sensor_addr,sensor_data,2,10); /* 受信開始*/
while (!sensor_finish) {}; /* 2 バイトの受信
完了待ち*/
----------------
(5)バイナリ温度データをASCIIへ変換
読み出した2バイトの温度データは16ビット長にし,さらに右寄せにします.このときデータのLSBは1/16℃となります.サイン・ビットを見てプラスかマイナスを判定し,絶対値に変換します.
温度値は10倍の温度整数値(バイナリのまま)へ変換し,表示有効範囲(±99.9℃) からはみ出した分は切り捨てます(リスト4-11).
(6)10倍の温度数値を10進数のASCII 3桁の数値に変換します(リスト4-12).
(7)ASCIIの温度データの送信温度データは,Windowsプログラム側(温度表示アプリケーション)の データ形式を合わせ,UART6経由で送ります.指定した文字数分データの送信完了は,グローバル変数「gUart6TxCnt」が‘0’になるまで待ちます(リスト4-13).
このようにプログラムはMission1の第4章で説明したように,このようにプロジェクト・マネージャでソース・コードを入力完了したら,ビルドして実行ファイル(I2CUARTondo.hex)を作って完成です.
この完成した温度測定プログラム(実行ファイルI2CUARTondo.hex)の書き込みは,WriteEZ3プログラムを起動して78K0/KB2マイコンに書き込みます.
おわり
後田敏
カテゴリ
78Kマイコンによる温度計トラックバック(0)
このブログ記事を参照しているブログ一覧: No.8 サポート・ページMission2 第4章 78Kマイコンによる温度計(3)
このブログ記事に対するトラックバックURL: http://www.eleki-jack.com/mt/mt-tb.cgi/2068

コメントする