No.8 サポート・ページMission2 第4章 78Kマイコンによる温度計(3)

| | トラックバック(0)
 引き続きプログラムの説明です。

4-5 温度測定プログラムのI2C処理ルーチンの説明

 I2C処理は,I2Cインターフェースで接続された温度センサへの送受信関係の関数です.これらのソース・コードはアプリレット・プログラムの「シリアル」メニュの「IIC0」タブでのI2Cモジュールに指定することによって,ほとんどが完成します.
 この処理関数は、そのまま使用します.

I2Cドライバのコード生成
 アプリレット・プログラムでは,図4-9に示す画面のようにマイコンのI2C 処理である「シリアル」メニュの「IIC0」タブに移動し,I2C の機能を設定します.

 引き続き,I2Cに関する詳細は図4-10のように転送モードをシングル・マスタに指定します.送信/受信の完了ルーチンはコールバック関数出力指定を行って,あとでコーディングを追加します.

 

08928G4-9.jpg
図4-9 I2Cを「使用する」に設定


08928G4-10.jpg
図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).

08928GLIST111213.JPG

 このようにプログラムはMission1の第4章で説明したように,このようにプロジェクト・マネージャでソース・コードを入力完了したら,ビルドして実行ファイル(I2CUARTondo.hex)を作って完成です.

 この完成した温度測定プログラム(実行ファイルI2CUARTondo.hex)の書き込みは,WriteEZ3プログラムを起動して78K0/KB2マイコンに書き込みます.

 

おわり

後田敏

カテゴリ

トラックバック(0)

このブログ記事を参照しているブログ一覧: No.8 サポート・ページMission2 第4章 78Kマイコンによる温度計(3)

このブログ記事に対するトラックバックURL: http://www.eleki-jack.com/mt/mt-tb.cgi/2068


エレキジャック
エレキジャックのトップに戻る


雑誌 No.