/** ################################################################### ** Filename : IICT001.C ** Project : IICT001 ** Processor : MC9S08QG8CPB ** Version : Driver 01.10 ** Compiler : CodeWarrior HCS08 C Compiler ** Date/Time : 2008/07/10, 20:18 ** Abstract : ** Main module. ** Here is to be placed user's code. ** Settings : ** Contents : ** No public methods ** ** (c) Copyright UNIS, spol. s r.o. 1997-2006 ** UNIS, spol. s r.o. ** Jundrovska 33 ** 624 00 Brno ** Czech Republic ** http : www.processorexpert.com ** mail : info@processorexpert.com ** ###################################################################*/ /* MODULE IICT001 */ /* Including used modules for compiling procedure */ #include "Cpu.h" #include "IIC73.h" #include "Inhr1.h" #include "Inhr2.h" #include "AS1.h" /* Include shared modules, which are used for whole project */ #include "PE_Types.h" #include "PE_Error.h" #include "PE_Const.h" #include "IO_Map.h" /* LM73の内部定義 */ // 内部レジスタ アドレスの定義 #define Temperature_RegAddr (0x00) #define Configuration_RegAddr (0x01) #define THIGH_RegAddr (0x02) #define TLOW_RegAddr (0x03) #define Control_Status_RegAddr (0x04) #define Identification_RegAddr (0x07) #define TemperatureData_MAG (128) // 温度データレジスタのデータ倍率 typedef int Temperature_Reg_TYPE; // 温度データレジスタのデータ型 /* CONTROL/STATUS REGISTER のBit構造を定義 */ #define TimeOut_Disable (0x80) #define ALERT_Pin_Status (0x08) #define Temperature_High_Flag (0x04) #define Temperature_Low_Flag (0x02) #define Data_Available_Flag (0x01) #define Temperature_Resolution_11 (0x00) #define Temperature_Resolution_12 (0x20) #define Temperature_Resolution_13 (0x40) #define Temperature_Resolution_14 (0x60) /* システムの諸定義 */ #define SC_PseudoPoint (10) // 通信コマンドで返信する温度DATAの擬似的小数点位置の重み #define SC_BuffSize (16) // シリアル通信用 文字バッファの文字数 enum { CommandPrompt, M_Command }SystemStatus; // main関数のステータス グローバル変数で定義しておく /* 関数 itoa      * * * * int型符号付整数を10進文字列で返す関数 * * RAMエリアの少ないMCUでは再帰的アルゴリズムの使用は * * スタック・オーバーフローの危険があるので使用しない */ void itoa(int num, char str[]) { bool sign; // 符号フラグ int i,j; // 内部LOOPカウンタ&ポインタ char c; i = 0; if (num < 0) { // 入力整数の符号の判定 sign = TRUE; // 負の場合はフラグセット num = -num; // 絶対値化 } else { sign = FALSE; // 正の場合はフラグクリア } do{ str[i++] = num%10 + '0'; // 十進数 最小位桁から 文字定数に変換 num = num/10; // 次の桁へ }while(num != 0); // 残りの桁がなくなるまで続ける if (sign == TRUE){ // 符号が負ならば"-"記号を挿入 str[i++] = '-'; } str[i] = '\0'; // 文字列のおわりを最後につける for(j=0,i-=1; i>j; i--,j++){ // 生成した文字列の桁の順序が逆なので c = str[j]; // 一気に入れ換える str[j] = str[i]; // コンパイラの最適化によって str[i] = c; // コンパクト化される } } /* 関数 AS1_puts      * * * * 文字列 s をシリアルポートへ送信する * * 改行文字の自動付加はしない。  * * 送信が終わるまでこの関数は終了しない */ void AS1_puts(char* s) { while(*s){ // 文字列の終りまで繰り返す while(AS1_GetCharsInTxBuf()); // シリアル送信が可能になるまで待つ (void)AS1_SendChar(*s++); // 1文字送信して次の文字へ移る } // Loop } /* MAIN 関数      * * * * 本体処理部分 * * 周辺I/O、変数の初期化後に通信コマンドの  * * 受付LOOPを回って逐次コマンドを処理する */ void main(void) { /* Write your local variable definition here */ byte lm73_cmd[] = { Control_Status_RegAddr, (TimeOut_Disable + Temperature_Resolution_14) // LM73に送るコマンドコード、14Bit分解能にセット }; byte I2c_RcvData[sizeof(Temperature_Reg_TYPE)]; // LM73のレジスタサイズに合わせた配列を作る word rcv_src; // Bean通信モジュールの関数引数 long Temperature; // LM73の温度DATAを格納する変数 char Sci_StrBuff[SC_BuffSize]; // 通信用 文字バッファ char Sci_CmdPtr; // 通信コマンドを格納する変数 /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/ PE_low_level_init(); /*** End of Processor Expert internal initialization. ***/ /* Write your code here */ /* For example: for(;;) { } */ /*   ↑のコメントは Processor Experで生成されたコメント文 * * ここよりユーザープログラムを記述する */ (void)IIC73_SendBlock(lm73_cmd,sizeof(lm73_cmd),&rcv_src); // I2CでLM73に初期化コマンドを送る (void)IIC73_SendChar(0x00); // LM73のレジスタ・ポインタを温度DATAレジスタにセットする SystemStatus = CommandPrompt; // ステータスをコマンド待ちに移行 for(;;){ if(SystemStatus != CommandPrompt){ //  のチェック、ここでは必ずCommandPromptなっている SystemStatus = CommandPrompt; // CommandPrompt以外のとき本来はエラー処理をする。 } // 受信文字があるか調べる if(AS1_RecvChar(&Sci_CmdPtr) != ERR_OK){ continue; // なにも受信していない場合はふりだしへ戻る } switch (Sci_CmdPtr){ // コマンド文字を判別して処理を振り分ける case 'M': // Mコマンドの処理 SystemStatus = M_Command; // ステータスをセット /* LM73から温度DATAを取得 */ (void)IIC73_RecvBlock(I2c_RcvData, sizeof(Temperature_Reg_TYPE), &rcv_src); // LM73より温度DATAを受け取る Temperature = I2c_RcvData[0]*256 + I2c_RcvData[1]; // 2Byteの受信値を重みをつけて加算し1つの数にする /* フォーマット変換 */ Temperature = (Temperature * SC_PseudoPoint) // 通信返答値フォーマットにあわせるため、 // 予め擬似的固定小数点の / TemperatureData_MAG; // 重みをかけてから、LM73の温度DATAのビット重みで割る /* 返信電文の作成 */ AS1_puts(".M="); // 返電 ヘッダを送信 itoa((int)Temperature,Sci_StrBuff); // 計算された通信返答値を文字列に変換する AS1_puts(Sci_StrBuff); // 温度DATAを文字で返信 AS1_puts("\r\n"); // デリミタの送信 SystemStatus = CommandPrompt; // ステータスをCommandPromptにもどす。 break; } } /* これより下は Processor Experで生成されるので * *        ユーザーはさわってはいけない */ /*** Don't write any code pass this line, or it will be deleted during code generation. ***/ /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/ for(;;){} /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/ } /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/ /* END IICT001 */ /* ** ################################################################### ** ** This file was created by UNIS Processor Expert 2.98 [03.80] ** for the Freescale HCS08 series of microcontrollers. ** ** ################################################################### */