ksddologo
 試作室
H8-XB基板でセンシリオン社製、デジタル温湿度センサのデータ測定

 センシリオン社製、デジタル温湿度センサSHT11のデータをXBeeがつながったH8/3694マイコンボードH8-XB基板で取得する試作、実験しました。下はアンドロイド、「Andoroid USB Serial Monitor Lite」で湿度、温度データを受信した状態です。

ANDROID_RX_650-431_img


RH測定_360-240_img

 適当な湿度センサを探していたところ、センシリオン社製のセンサSHT11があり、デジタル処理だけで済むというので実験しました。

 最初詳しく見ないで、センサの信号名が、I2Cと似た構成となっているので、I2Cと考え、ロジアナで信号見たところI2Cの手順では動いていないので、よくスペックをみるとSCL->SCK, SDA->DATAと中身は違う転送方法です。

 どちらにしろスペック通り動かせばと、トライしてみました。

RSHT拡大_300-115_img

 右の写真はその実験の様子です。センサは比較のために3個使いました。赤枠で囲んでいる、下に拡大写真があるものが今回の実験、H8-XB基板のH8/3694マイクロコンピュータにつながっていて、ロジックアナライザにも接続しています。

 右の写真の上に表示されている数値は、赤枠の下の同じSHT11センサのデータを表示しています。右側のセンサはUSBでPCにつながっているセンサで、付属アプリケーションのPCでの表示が右下のウィンドウです(バージョン等で画面、機能が違う可能性もあり得ますので、詳細は不鮮明にしてあります)。

 表示されている値は写真がそれぞれ違う時間で、表示値も違いますが、同時に見るとそれぞれ、温度は±1度、湿度は±1%前後の範囲内です。

 この、机上のセンサーの配置で、同じ値になるかどうかはわかりませんが、たまに一致するように見えても、常に多少のずれがありました。

 センサ、温湿度測定器は、株式会社ストロベリー・リナックスより購入した製品です。

USB_TH_377-378_img


 動作は、H8/3694マイコンのI2Cポートではなく、汎用I/Oポート、「タイマW」ポートの機能を利用して、センサのSCKクロックを生成する元になる、一定周期の割り込みを利用し、FPGAのプログラミングで使うステートのようなイメージで、C言語で書き、動かしました。以下これらの動作説明です。


 1.センサとマイコンとの接続

 マイコンボードは上の写真のようにXBeeも搭載しています。今回は他のXBeeからのデータも同時に受信しながら、とりあえずPCに測定データを送るという、試験的な動作ですが、ここまで出来ると、この温湿度センサのデータをXBeeのパケットデータとして他のXBeeに送るのは難しくありません。XBeeのパケットデータの送信はXBMonitor マニュアルなどを参照してください。実際に送るのは、もっと他のセンサー(例えば気圧測定)なども含めて次回以降に試作する予定です。

 H8/3694マイコンは今回、消費電力節約のため電源は3.3V、クロックは10MHzで動作させています。このH8/3694マイコンを搭載した基板は、H8-XB基板を参照してください。

 デジタル温湿度センサSHT11の接続は電源2本、クロックCLK、データDATAの4本だけです。マイコン側はタイマW(PWM信号などをつくる汎用タイマ)のポート P80, P82, P83の3本を使っています。接続は簡単なので回路図は省略しますが、以下のようにつながっています。

H8-XB基板 - デジタル温湿度センサ接続表
H8/3694側 SHT11 センサ側 番号(基板並び順) (N)チップピン番号
データ、適宜、入出力を切換 (FTCI) P80 1 DATA (2)シリアルデータ、双方向、抵抗10KΩでプルアップ
GND GND 2 GND (1)接地 (GND)
  電源電圧 3.3V VCC 3 VDD (4)電源電圧 2.4V-5.5V
プログラムでSCKを制御 (FTIOB) P82 4 SCK (3)シリアルクロック、入力のみ
Duty 50% のベースClock (FTIOC) P83 無接続 動作タイミング観測用


 2.湿度測定コマンド

 下のロジックアナライザの波形を見てください。クリックすると拡大します。

 測定コマンドはまず、データラインがHレベルの状態(プルアップ)を確認してから実行します。まずクロックを立ち上げ、データを下げ、クロックを下げ、再びクロックを上げ、データを上げ、クロックを下げると送信開始の合図信号になります。

 ロジアナの信号名がI2Cで、そのBus解析になっていますが、多少似たところもあるので参考にはなりますが、基本的には無視してください。データとクロックにだけ注目してください。SDAとSCLは、DATAとCLKに読み替えてください。

 送信開始合図信号から後ろが、相対湿度測定コマンド 00000101 の送信です。1,Highの送信は、クロックがLレベルの時、DATAラインをHレベルにし、0,LowもクロックがLレベルの時、DATAラインをLレベルにします。コマンド最後のクロックを下げたとき、DATAラインは入力に切り替え、次のクロックの立ち上げ時にDATAラインを読み込みLレベルであることを確認(センサ側からのACK)して、コマンド送信は終わりで、この後DATAラインが下がるのを待ちます。この待ち時間がセンサーが測定中であることを示しています。

RHCommand_1324-389_img


 プログラムの割り込みは、この50uSec SCKクロック(100uSec周期)の半分の間隔で発生し、クロックのH、Lレベルのそれぞれの中央のタイミングなどで、その時データを制御します。つまり現在のタイミングは25uSecで行っていることになりますが、もう少し短く出来そうです。ただし10MHzのCPUにとっては25uSecでもそれほど余裕のある長さ(マシンサイクルを考慮すると)ではないので、他のプログラムとの兼ね合いで決めることになります。

 なお、測定コマンド自体の開始は、別の1Sec毎のタイマ(TMA)の割り込みタイミングでスタートさせています。


 3.データ読み込み

 上のロジックアナライザの波形で、下の赤いラインの中央あたりの波形、これがセンサーからのデータです。ロジックアナライザでコマンド出力後からの間を測ると67.1mSecと読み取れました。つまり、これが測定時間(スペックでは12bitで最大80mSecとなっています)なのではと思われます。

 このデータ部分は、下の波形です。DATAラインがLレベルになると、センサからのデータを、マイコン側からクロックを出すことで読み込みます。読み込みはHレベルの中央でDATAライン(ポートP80)を読みます。

 ただし、8bit読むと、一旦DATAポートP80を出力ポートにしてLレベル、ACKを送る必要があります。16bit読んだ後は、ACKを送るとチェックサムが送られてきますが、今回はやっていません。

 読み込みデータの値は、16進で0x06A5、10進、1701です。

RHData_1320-389_img


 4.データの変換

 センシリオン社のデータシートには0から3500迄の値で出力されるとあり、上の例では1701という値が読み取れた訳ですが、これを相対湿度値にするにはデータシートにある公式で計算する必要があります。

 この式は、C1,C2,C3の小数点付きの係数があり、浮動小数点型変数を使った計算が必要です。しかしH8/3694マイコンには、FPU(Floating Point Unit)を内蔵していません。コンパイラのライブラリで計算させるのも、時間、メモリ容量など実用的ではないし、現実には動かないのではと思われます。無難な対応方法はこの値のまま、XBeeで送り、受信側のPC等で変換、表示させることです。XBee内蔵ADCポートの値などでは、その値しかないので、当然最初から受信側で変換するしかありません。それでもいいのですが、今回はもう一歩踏み込んで変換デーブルを使って、測定値を表すことにしました。測定した端末でも直接液晶などで表示できることになります。

 一つ問題が見つかりました。購入したセンサーに付いていたデータシートとセンシリオン社の最新の日本語データシートで式の係数が違っていることが分かりました。どちらを使えばいいか、問い合わせる必要があるかも知れませんが、日付けの新しいほうを使うのが、とりあえず常識と、しました。測定値例55.7%付近では葯1%違いがあります。他の値だとどのくらい違うか、正確な測定器との比較などありますが、今回はパスです。

 その2つの式と、マイコン内に組み込むテーブルデータを検討、生成するために作った簡単なプログラムの画面を下に示します。赤ラインは注目点、Version はデータシートに表記されたバージョンと日付、それぞれの式の内容、係数C1,C2,C3の括弧内がその値、緑の数値は計算データのステップ、つまり精度と、変換データ数が決まります。その右の数字は必要なテーブルのデータ数です。表示例ではステップ数2、つまり1bit精度を落として、データ数が半分にした状態です。テーブルは計算値を10倍した整数、2バイトで作りますので、1750×2=3500バイト必要です。

 測定値例は、正確には1701->55.8%となりますが、1ビット落とすと55.7%になります。テーブルサイズは倍の1ステップ毎でも構わない量ですが、計算値の変化量をみると、12bit11bitで処理ということになりますが、どちらでもいいような精度だと思います。

 赤枠は取得した値付近の前後値です。

SHT1X_804-550_img


 5.マイコンの動作

RHSerialData_506-348_img


 右図が今回の動作を、シリアルモニタTera Termでの受信した状態です。ページ先頭のアンドロイド、「Andoroid USB Serial Monitor Lite」で受信したものと同じ状態ですが、アンドロイドではたまたまXBeeデータが表示されていませんが、こちらではXBeeデータも表示されています。

 温度は説明していませんが、同様にコマンド送信、データ受信、変換式で計算、表示しています。また接続リセットコマンドを起動時に1回送るようにしてあります。

 マイコンのシリアル出力はPC、入力はXBeeにつなげていて(プログラムでそれぞれ切り換えられます)、周辺の複数のXBeeからのデータ16進表現値そのままと、そのコード、アナログ値、デジタル値を解析した表示値(以前に液晶に表示したもの)、と今回のセンサの温度、湿度の読み取り値を、バイナリ、16進値、10進値、変換値として表示しています。


 6.マイコンのソフトウェア

 プログラムはH8-XB基板専用なので、そのままでは他のH8/3694では動かないですが、参考になると思います。

 25uSecクロックの割り込みをswitch文でカウントしながら、コマンド送信、データ受信しています。このプログラムは、湿度と温度で殆ど同じなので共通に出来ると思いますが、今回はやっていません。変換テーブルrhval[]は、湿度%を10倍した整数値です。その他16×2液晶表示プログラムなどは、コメントにしています。開発環境の構成などは以前に紹介した、H8-XBee 端末ソフト解説 を参照してください。以下主プログラムのソースです。

H8-XB基板 - デジタル温湿度センサプログラム

/***********************************************************************/
/*                                                                     */
/*  FILE        :h8_xb_pulse.c                                         */
/*  DATE        :Wed, Mar 06, 2013                                     */
/*  DESCRIPTION :Main Program                                          */
/*  CPU TYPE    :H8/3664F                                              */
/*  Create by KSDDO  (C)2013KSDDO                                      */
/*                                                                     */
/***********************************************************************/

#ifdef __cplusplus
extern "C" {
#endif
void abort(void);
#ifdef __cplusplus
}
#endif
                 
#include "h8_xb33.h"

// シリアルデータ受信リングバッファ
unsigned char rx_buff[BUFFMAX];
int rx_top;
int rx_bot;

// XBee API データ受信バッファ
int apicnt;                    // API文字カウンタ
unsigned char rx_api[BUFFMAX]; // API受信frame文字列
int apilen;                    // API Length

// XBee API
int apirdy;                    // API受信frameレディ

// sensor data
unsigned char humi_data_bit[12];    // humidity sensor bit data
unsigned char temp_data_bit[14];    // temperature sensor bit data
int get_humi_flag;                  // humidity write flag
int get_temp_flag;                  // temperature write flag
int humi_data;                      // humidity data
int temp_data;                      // temperature data

char teststr[34];
char valstr[12];

// 
int an_dg_ff;

//// H8 Serial Input(P51,50 2bit)
//#define PC2H8 0            // -- 00     PC->                   0
//#define XB2H8 1            // -- 01     XB->             ->H8  1
//#define EX2H8 2            // -- 10     EX->                   2
//// Not connected
//#define NCH8 3            // -- 11      --                     3
//// H8 Serial Output(P53,52 2bit)
//#define H82PC 0            // 00 --          ->PC              0
//#define H82XB 4            // 01 --          ->XB   H8->       4
//#define H82EX 8            // 10 --          ->EX              8

// 2009.11.27 RS232C Direction
unsigned char scidir;

//
// RH table 2013.4.15
const int rhval[] = {
    0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,1,
    1,2,3,4,4,5,6,7,7,8,
    9,10,10,11,12,12,13,14,15,15,
    16,17,18,18,19,20,20,21,22,23,
    23,24,25,26,26,27,28,28,29,30,
    31,31,32,33,33,34,35,36,36,37,
    38,39,39,40,41,41,42,43,44,44,
    45,46,47,47,48,49,49,50,51,52,
    52,53,54,54,55,56,57,57,58,59,
    59,60,61,62,62,63,64,65,65,66,
    67,67,68,69,70,70,71,72,72,73,
    74,75,75,76,77,77,78,79,80,80,
    81,82,82,83,84,85,85,86,87,87,
    88,89,90,90,91,92,92,93,94,95,
    95,96,97,97,98,99,100,100,101,102,
    102,103,104,105,105,106,107,107,108,109,
    110,110,111,112,112,113,114,115,115,116,
    117,117,118,119,120,120,121,122,122,123,
    124,124,125,126,127,127,128,129,129,130,
    131,132,132,133,134,134,135,136,137,137,
    138,139,139,140,141,141,142,143,144,144,
    145,146,146,147,148,148,149,150,151,151,
    152,153,153,154,155,156,156,157,158,158,
    159,160,160,161,162,163,163,164,165,165,
    166,167,167,168,169,170,170,171,172,172,
    173,174,174,175,176,177,177,178,179,179,
    180,181,181,182,183,184,184,185,186,186,
    187,188,188,189,190,191,191,192,193,193,
    194,195,195,196,197,197,198,199,200,200,
    201,202,202,203,204,204,205,206,206,207,
    208,209,209,210,211,211,212,213,213,214,
    215,215,216,217,218,218,219,220,220,221,
    222,222,223,224,224,225,226,227,227,228,
    229,229,230,231,231,232,233,233,234,235,
    236,236,237,238,238,239,240,240,241,242,
    242,243,244,244,245,246,246,247,248,249,
    249,250,251,251,252,253,253,254,255,255,
    256,257,257,258,259,260,260,261,262,262,
    263,264,264,265,266,266,267,268,268,269,
    270,270,271,272,272,273,274,275,275,276,
    277,277,278,279,279,280,281,281,282,283,
    283,284,285,285,286,287,287,288,289,289,
    290,291,291,292,293,294,294,295,296,296,
    297,298,298,299,300,300,301,302,302,303,
    304,304,305,306,306,307,308,308,309,310,
    310,311,312,312,313,314,314,315,316,316,
    317,318,318,319,320,321,321,322,323,323,
    324,325,325,326,327,327,328,329,329,330,
    331,331,332,333,333,334,335,335,336,337,
    337,338,339,339,340,341,341,342,343,343,
    344,345,345,346,347,347,348,349,349,350,
    351,351,352,353,353,354,355,355,356,357,
    357,358,359,359,360,361,361,362,363,363,
    364,365,365,366,367,367,368,369,369,370,
    371,371,372,373,373,374,375,375,376,377,
    377,378,378,379,380,380,381,382,382,383,
    384,384,385,386,386,387,388,388,389,390,
    390,391,392,392,393,394,394,395,396,396,
    397,398,398,399,400,400,401,402,402,403,
    404,404,405,405,406,407,407,408,409,409,
    410,411,411,412,413,413,414,415,415,416,
    417,417,418,419,419,420,421,421,422,422,
    423,424,424,425,426,426,427,428,428,429,
    430,430,431,432,432,433,434,434,435,436,
    436,437,437,438,439,439,440,441,441,442,
    443,443,444,445,445,446,447,447,448,448,
    449,450,450,451,452,452,453,454,454,455,
    456,456,457,458,458,459,459,460,461,461,
    462,463,463,464,465,465,466,467,467,468,
    469,469,470,470,471,472,472,473,474,474,
    475,476,476,477,477,478,479,479,480,481,
    481,482,483,483,484,485,485,486,486,487,
    488,488,489,490,490,491,492,492,493,493,
    494,495,495,496,497,497,498,499,499,500,
    501,501,502,502,503,504,504,505,506,506,
    507,508,508,509,509,510,511,511,512,513,
    513,514,514,515,516,516,517,518,518,519,
    520,520,521,521,522,523,523,524,525,525,
    526,527,527,528,528,529,530,530,531,532,
    532,533,533,534,535,535,536,537,537,538,
    538,539,540,540,541,542,542,543,544,544,
    545,545,546,547,547,548,549,549,550,550,
    551,552,552,553,554,554,555,555,556,557,
    557,558,559,559,560,560,561,562,562,563,
    564,564,565,565,566,567,567,568,569,569,
    570,570,571,572,572,573,574,574,575,575,
    576,577,577,578,579,579,580,580,581,582,
    582,583,583,584,585,585,586,587,587,588,
    588,589,590,590,591,592,592,593,593,594,
    595,595,596,596,597,598,598,599,600,600,
    601,601,602,603,603,604,604,605,606,606,
    607,608,608,609,609,610,611,611,612,612,
    613,614,614,615,616,616,617,617,618,619,
    619,620,620,621,622,622,623,624,624,625,
    625,626,627,627,628,628,629,630,630,631,
    631,632,633,633,634,635,635,636,636,637,
    638,638,639,639,640,641,641,642,642,643,
    644,644,645,645,646,647,647,648,648,649,
    650,650,651,652,652,653,653,654,655,655,
    656,656,657,658,658,659,659,660,661,661,
    662,662,663,664,664,665,665,666,667,667,
    668,668,669,670,670,671,671,672,673,673,
    674,674,675,676,676,677,677,678,679,679,
    680,680,681,682,682,683,683,684,685,685,
    686,686,687,688,688,689,689,690,691,691,
    692,692,693,694,694,695,695,696,697,697,
    698,698,699,700,700,701,701,702,703,703,
    704,704,705,706,706,707,707,708,709,709,
    710,710,711,711,712,713,713,714,714,715,
    716,716,717,717,718,719,719,720,720,721,
    722,722,723,723,724,725,725,726,726,727,
    727,728,729,729,730,730,731,732,732,733,
    733,734,735,735,736,736,737,737,738,739,
    739,740,740,741,742,742,743,743,744,745,
    745,746,746,747,747,748,749,749,750,750,
    751,752,752,753,753,754,754,755,756,756,
    757,757,758,759,759,760,760,761,761,762,
    763,763,764,764,765,766,766,767,767,768,
    768,769,770,770,771,771,772,772,773,774,
    774,775,775,776,777,777,778,778,779,779,
    780,781,781,782,782,783,783,784,785,785,
    786,786,787,788,788,789,789,790,790,791,
    792,792,793,793,794,794,795,796,796,797,
    797,798,798,799,800,800,801,801,802,802,
    803,804,804,805,805,806,806,807,808,808,
    809,809,810,810,811,812,812,813,813,814,
    814,815,816,816,817,817,818,818,819,820,
    820,821,821,822,822,823,824,824,825,825,
    826,826,827,828,828,829,829,830,830,831,
    832,832,833,833,834,834,835,836,836,837,
    837,838,838,839,839,840,841,841,842,842,
    843,843,844,845,845,846,846,847,847,848,
    848,849,850,850,851,851,852,852,853,854,
    854,855,855,856,856,857,857,858,859,859,
    860,860,861,861,862,863,863,864,864,865,
    865,866,866,867,868,868,869,869,870,870,
    871,871,872,873,873,874,874,875,875,876,
    876,877,878,878,879,879,880,880,881,881,
    882,883,883,884,884,885,885,886,886,887,
    888,888,889,889,890,890,891,891,892,893,
    893,894,894,895,895,896,896,897,898,898,
    899,899,900,900,901,901,902,903,903,904,
    904,905,905,906,906,907,907,908,909,909,
    910,910,911,911,912,912,913,913,914,915,
    915,916,916,917,917,918,918,919,920,920,
    921,921,922,922,923,923,924,924,925,926,
    926,927,927,928,928,929,929,930,930,931,
    932,932,933,933,934,934,935,935,936,936,
    937,937,938,939,939,940,940,941,941,942,
    942,943,943,944,945,945,946,946,947,947,
    948,948,949,949,950,950,951,952,952,953,
    953,954,954,955,955,956,956,957,957,958,
    959,959,960,960,961,961,962,962,963,963,
    964,964,965,966,966,967,967,968,968,969,
    969,970,970,971,971,972,972,973,974,974,
    975,975,976,976,977,977,978,978,979,979,
    980,980,981,982,982,983,983,984,984,985,
    985,986,986,987,987,988,988,989,989,990,
    991,991,992,992,993,993,994,994,995,995,
    996,996,997,997,998,998,999,1000,1000,1000,
    1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,
    1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,
    1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,
    1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,
    1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,
    1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,
    1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,
    1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,
    1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,
    1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,
    1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,
    1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,
    1000,1000,1000,1000,1000,1000,1000,1000,1000,1000
};
//

// シリアル割り込み初期設定
void set_SCI3(void)
{
    int i;
    char dt;

    SCI3.SCR3.BIT.TE  = 0; // トランスミットイネーブルビット:送信動作を禁止
    SCI3.SCR3.BIT.RE  = 0; // レシーブイネーブルビット:受信動作を禁止
    SCI3.SCR3.BIT.CKE = 0; // クロックソースを内部ボーレートジェネレータに設定
    SCI3.SMR.BYTE  = 0x00; // 送受信フォーマットの設定
    SCI3.BRR = 0x20;       // ビットレートの設定(9600[bit/s]/10MHz clock)
    for (i = 0; i < 1; i++) ;  // 1ビット期間以上待つ(dummy wait)
    IO.PMR1.BIT.TXD = 1;       // P22端子をTXD出力端子機能に設定
                            /* PMR1 P22/TXD(CN2-19)TXDにセット */
    SCI3.SCR3.BIT.TE = 1;      // トランスミットイネーブルビット:送信動作を許可
    SCI3.SCR3.BIT.RE = 1;      // レシーブイネーブルビット:受信動作を許可
    dt = SCI3.SSR.BYTE;        // ダミー読み込み
    SCI3.SSR.BYTE = 0x80;      // Clear Error Flag (TDRE=1) 
    SCI3.SCR3.BIT.RIE = 1;     // 受信割り込み動作を許可
}


struct BIT {                // Bitの構造体宣言
        unsigned char B7:1;    //    Bit7
        unsigned char B6:1;    //    Bit6
        unsigned char B5:1;    //    Bit5
        unsigned char B4:1;    //    Bit4
        unsigned char B3:1;    //    Bit3
        unsigned char B2:1;    //    Bit2
        unsigned char B1:1;    //    Bit1
        unsigned char B0:1;    //    Bit0
}; 
                    // レジスタの定義
#define TMA  (*(struct BIT *)0xFFA6) // アウトプットセレクト7-5
#define TMA7     TMA.B7              // アウトプットセレクト7の定義
#define TMA6     TMA.B6              // アウトプットセレクト6の定義
#define TMA5     TMA.B5              // アウトプットセレクト5の定義
#define TMA4     TMA.B4              // reserved
#define TMA3     TMA.B3              // インターナルクロックセレクトビット3の定義
#define TMA2     TMA.B2              // インターナルクロックセレクトビット2の定義
#define TMA1     TMA.B1              // インターナルクロックセレクトビット1の定義
#define TMA0     TMA.B0              // インターナルクロックセレクトビット0の定義
#define TCA *(volatile unsigned char *)0xFFA7 // タイマカウンタAの定義
#define IENR1 (*(struct BIT *)0xFFF4)  // 割り込みイネーブルレジスタ1の定義
#define IENTA     IENR1.B6           // タイマA割り込み要求イネーブルビットの定義
#define IRR1 (*(struct BIT *)0xFFF6)   // 割り込みフラグレジスタ1の定義
#define IRRTA    IRR1.B6             // タイマA割り込み要求フラグビットの定義


// 2013.3.6 pulse source             // レジスタの定義
#define PCR8 (*(struct BIT *)0xFFEB)
#define PCR80     PCR8.B0
#define PCR81     PCR8.B1
#define PCR82     PCR8.B2
#define PCR83     PCR8.B3
#define PCR84     PCR8.B4
#define PCR85    PCR8.B5
#define PCR86    PCR8.B6
#define PCR87     PCR8.B7
#define PDR8 (*(struct BIT *)0xFFDB)
#define PDR80     PDR8.B0
#define PDR81     PDR8.B1
#define PDR82     PDR8.B2
#define PDR83     PDR8.B3
#define PDR84     PDR8.B4
#define PDR85     PDR8.B5
#define PDR86     PDR8.B6
#define PDR87     PDR8.B7

#define TMRW (*(struct BIT *)0xFF80) // タイマモードレジスタWの定義
#define PWMD    TMRW.B2              // PWMモードD出力モード選択ビットの定義
#define PWMC    TMRW.B1              // PWMモードC出力モード選択ビットの定義
#define PWMB    TMRW.B0              // PWMモードB出力モード選択ビットの定義
#define CTS        TMRW.B7           // カウンタースタートビットの定義

#define TCRW (*(struct BIT *)0xFF81) // タイマーコントロールレジスタWの定義
#define TOA        TCRW.B0           // PWMモードD出力モード選択ビットの定義
#define TOB        TCRW.B1           // PWMモードD出力モード選択ビットの定義
#define TOC        TCRW.B2           // PWMモードD出力モード選択ビットの定義
#define TOD        TCRW.B3           // タイマ出力レベルビットの定義
#define CKS0    TCRW.B4              // PWMモードD出力モード選択ビットの定義
#define CKS1    TCRW.B5              // PWMモードD出力モード選択ビットの定義
#define CKS2    TCRW.B6              // PWMモードD出力モード選択ビットの定義
#define CCLR    TCRW.B7              // カウンタクリアビットの定義
#define CKS2    TCRW.B6              // クロックセレクトビット2の定義
#define CKS1    TCRW.B5              // クロックセレクトビット1の定義
#define CKS0    TCRW.B4              // クロックセレクトビット0の定義

#define TCNT *(volatile unsigned int *)0xFF86 // タイマカウンタの定義
#define GRA *(volatile unsigned int *)0xFF88  // ジェネラルレジスタAの定義
#define GRB *(volatile unsigned int *)0xFF8A  // ジェネラルレジスタBの定義
#define GRC *(volatile unsigned int *)0xFF8C  // ジェネラルレジスタCの定義
#define GRD *(volatile unsigned int *)0xFF8E  // ジェネラルレジスタDの定義

#define TIERW (*(struct BIT *)0xFF82) // タイマインタラプトイネーブルレジスタWの定義
                                      // (pwm_test.cから追加)
#define IMIEA     TIERW.B0            // インプットキャプチャ/コンペアマッチ割り込み
                                      // イネーブルビットAの定義---(pwm_test.cから追加)
#define IMIEB    TIERW.B1             // インプットキャプチャ/コンペアマッチ割り込み
                                      // イネーブルビットAの定義---(pwm_test.cから追加)
#define IMIEC    TIERW.B2             // インプットキャプチャ/コンペアマッチ割り込み
                                      // イネーブルビットAの定義---(pwm_test.cから追加)
#define IMIED    TIERW.B3             // インプットキャプチャ/コンペアマッチ割り込み
                                      // イネーブルビットAの定義---(pwm_test.cから追加)
//#reserved TIERW.B4                  // インプットキャプチャ/コンペアマッチ割り込み
                                      // イネーブルビットAの定義---(pwm_test.cから追加)
//#reserved    TIERW.B5               // インプットキャプチャ/コンペアマッチ割り込み
                                      // イネーブルビットAの定義---(pwm_test.cから追加)
//#reserved    TIERW.B6               // インプットキャプチャ/コンペアマッチ割り込み
                                      // イネーブルビットAの定義---(pwm_test.cから追加)
#define OVIE    TIERW.B7              // インプットキャプチャ/コンペアマッチ割り込
                                      // みイネーブルビットAの定義---(pwm_test.cから追加)

#define TSRW (*(struct BIT *)0xFF83)  // タイマステータスレジスタWの定義
                                      // (pwm_test.cから追加)
#define IMFA    TSRW.B0               // インプットキャプチャ/コンペアマッチフラグビットAの定義
                                      // (pwm_test.cから追加)
#define IMFB    TSRW.B1               // インプットキャプチャ/コンペアマッチフラグビットAの定義
                                      // (pwm_test.cから追加)
#define IMFC    TSRW.B2               // インプットキャプチャ/コンペアマッチフラグビットAの定義
                                      // (pwm_test.cから追加)
#define IMFD    TSRW.B3               // インプットキャプチャ/コンペアマッチフラグビットAの定義
                                      // (pwm_test.cから追加)
// #reserved    TSRW.B4               // インプットキャプチャ/コンペアマッチ割り込み
                                      // イネーブルビットAの定義(pwm_test.cから追加)
// #reserved    TSRW.B5               // インプットキャプチャ/コンペアマッチ割り込み
                                      // イネーブルビットAの定義(pwm_test.cから追加)
// #reserved    TSRW.B6               // インプットキャプチャ/コンペアマッチ割り込み
                                      // イネーブルビットAの定義(pwm_test.cから追加)
#define OVF        TSRW.B7            // インプットキャプチャ/コンペアマッチフラグ
                                      // ビットAの定義(pwm_test.cから追加)

// タイマーI/Oコントロールレジスタ 0
#define TIOR0 *(volatile unsigned int *)0xff84
// タイマーI/Oコントロールレジスタ 1
#define TIOR1 *(volatile unsigned int *)0xff85


volatile unsigned long tmacnt;    // 変数の定義(TCAオーバーフローによる割り込み回数のカウンタ)

// テスト用タイマーA 初期設定
void set_TMA(void)
{
// タイマー A 設定
//        MOV.B   #B'10011000,R0L ;TimerA を1秒1Hzに設定
//        MOV.B   R0L,@TMA

///    TA.TMA.BYTE = 0x98;     /* TimerA を1秒1Hzに設定 */
// タイマー A 割り込みストップ ON
///    IENR1.BIT.IENTA = 1;    /* TimerAを有効にする */
//    IO.PMR1.BIT.TMOW = 1;    /* PMR1 P10/TMOW(CN1-20)TMOWにセット */

    TMA3     = 1;   // インターナルクロックセレクト3(タイマA動作モードの選択)
                    // (プリスケーラSの出力をカウントするインターバルタイマを選択)
    TMA2    = 0;    // インターナルクロックセレクト2〜0
    TMA1    = 0;    // TCAに入力するクロックを選択
    TMA0    = 0;    // 001:φ/4096  TMA3 1 000 -> 1sec
                    //
    IRRTA = 0;      // タイマA割り込み要求フラグをクリア
    IENTA = 1;      // タイマA割り込み要求をイネーブルに設定
    tmacnt = 0;     // タイマA割り込み回数を0に初期化
}

// 2013.4.4 Sensirion test program var
volatile unsigned int sensing_pos; // Sensing term timming 2 -> reset, hum, temp sense

#define HUMI_POS 2                 // Humidity sensing timming 2 sec
#define TEMP_POS 3                 // Temperature sensing timming 3 sec

volatile unsigned int scl_off;     // SCL off state 3 -> SCL one time sleep

volatile unsigned int sense_state; // 1 reset 2 humidity 3 temparature, 0 wait TIMERA
volatile int reset_step;           // reset step
volatile int humidyty_step;        // 0-> n humidity sensor reading step
volatile int temperature_step;     // 0-> n temprature sensor reading step
volatile unsigned int sdl_ack;     // read sdl data ack
volatile unsigned int sdl_ready;   // read sdl data ready

#define RESET_CMD 1       // reset command
#define HUMI_CMD 2        // humidity command
#define READ_HUMI 3       // read humidity
#define TEMP_CMD 4        // temparature command
#define READ_TEMP 5       // read temparature

// 2013.3.6 テスト用タイマーW 初期設定
void set_timerW(void) // タイマW PWMモード設定関数
{                     //
    PCR80 = 0;  // inputに設定 ポート8
    PCR81 = 0;  // inputに設定 ポート8 SDA data input/output
    PCR82 = 1;  // SCL output
    PCR83 = 1;  // base clock
    PCR84 = 0;  // SDA data input/output
    PCR85 = 0;  // SDA data input/output

    PDR82 = 0;  // SCL reset output
    PDR83 = 0;  // base clock

    PWMC = 1;   //PWM動作 H8 FTIOC端子(P83)をPWM出力モードに設定1
    TOC = 1;    // C出力1
    CCLR = 1;   // コンペアマッチAでカウンタクリア

    IMIEA = 1;
    OVIE = 0;

    TIOR0 = 0x11; //コンペアマッチ00 禁止 01 GRA FTIOA>0 10 GRA FTIOA>1 11 GRA FTIOA>togle
                         //
    CKS2     = 0;        // クロックセレクト2〜0 TCNTに入力するクロックを選択
    CKS1     = 0;        // 000 φ 001 φ/2 010 φ/4 011 φ/8 1XX FTCI count
    CKS0     = 0;        // 010:内部クロックφ/4をカウント
                         //
    TCNT     = 0x0000;   // タイマカウンタの初期値を0にする
    GRA      = 0x00FA;   // ジェネラルレジスタAの設定(周期を決める
                         //  00FA-0250 01F4-0500 03E8-1000 0FA0-4000 1FA4-8000
                         //  CKS210 000 0.1usec(10MHz) 1000 100usec
    GRC      = 0x007D;   // ジェネラルレジスタDの設定(Highレベルの幅)
                         //  007D-0125 00fA-0250 01F4-0500 07D0-2000 0FA0-4000
//    GRD      = 0;      // ジェネラルレジスタDの設定(Highレベルの幅)
                         //  01F4-0500 07D0-2000 0FA0-4000
//    GRD      = 0x01F4; // ジェネラルレジスタDの設定(Highレベルの幅)
                         //  01F4-0500 07D0-2000 0FA0-4000
    CTS      = 1;        // カウンタスタート(カウンタ動作の開始)

// 2013.4.4 Sensirion test program
    sensing_pos = 0;     // Sense term timming
    reset_step = 0;      // reset counter

}

// テスト用IRQ2初期設定
void set_IRQ2(void)
{
    IO.PMR1.BIT.IRQ2 = 1; /* PMR1 P16/IRQ2(CN2-22)IRQ2にセット */
    IEGR1.BYTE = 0x74;    /* IRQ2を立ち上がりエッジにする */
//    IENR1.BIT.IEN2 = 1; /* IENR IRQ2を有効にする */
//    IRR1.BYTE = 0x30;   /* 割り込みフラグをクリア */
}

// 1文字送信
void sci3_tx (char data)
{
    while (SCI3.SSR.BIT.TDRE == 0) ;    // 0でデータあり、1になるまで待つ
    SCI3.TDR = data;                    // 文字を送信
}

// 文字列送信
void sci3_tx_str (char *str)
{
     while(*str != '\0') {              // 文字が\0になるまで繰り返す
          sci3_tx(*str);                // 1文字送信
          str++;
     }
}

// 文字列送信 小数点付き
void sci3_tx_str_p (char *str, int pt)
{
    int cnt;

    cnt = 0;
     while(*str != '\0') {             // 文字が\0になるまで繰り返す
         if(cnt == pt){
            sci3_tx((char)0x2E);       // 小数点1文字送信
        }
         sci3_tx(*str);                // 1文字送信
         str++;
         cnt++;
     }
}

// 1文字受信関数 割り込み受信で不要
//char char sci3_rx (void)
//{
//    char data;                        // 受信データ格納変数
//    while (!(SCI3.SSR.BYTE & 0x78)) ; // 受信またはエラーフラグが立つまで待つ
//    if (SCI3.SSR.BIT.RDRF == 1) {     // 受信完了なら
//        data = SCI3.RDR;              // データ取り出し
//    } 
//    else {
//        SCI3.SSR.BYTE &= 0xC7;        // エラー発生時、エラーフラグをクリア
//        data = '\0';                  // ダミーデータとして'\0'を返す
//    }
//    return data;
//}


// メイン
void main(void)
{
    int i,j;

    int bin_dat;          // binary data

    int cnt;              // 文字カウンタ
    int rdy;              // コマンドレディ
    char rx_cmd[64];      // 受信コマンド文字列

    // XBee API
    int apiesc;           // APIEscapecode flag

    double dummy;

    set_imask_ccr(1);     /* 割り込み禁止 */

// 2009.11.27 RS232C Direction XB -> H8 -> PC
//#define XB2H8 1            // -- 01     XB            H8  1
//#define H82PC 0            // 00 --        PC          0
    scidir = XB2H8 | H82PC;

// 2013.3.14
    set_timerW();          // タイマW PWMモードを設定する

//    set_IRQ2();          // IRQ2初期化
    set_TMA();             // TMA初期化
    set_SCI3();            // SCI3初期化

// LCD 表示
//    init_lcd();    

// 2010.3.31 set direction
#define PCR5 *(volatile unsigned char *)0xFFE8 // H8 PORT5 コントロールレジスタの定義
#define PDR5 *(volatile unsigned char *)0xFFD8 // H8 PORT5 データレジスタの定義

                          // H8ポート入出力モード設定の定義
#define INPUT_BYTE  0x00  // H8ポート 入力モード設定の定義(バイト単位)
#define INPUT_BIT   0     // H8ポート 入力モード設定の定義(ビット単位)
#define OUTPUT_BYTE 0xff  // H8ポート 出力モード設定の定義(バイト単位)
#define OUTPUT_BIT  1     // H8ポート 出力モード設定の定義(ビット単位)

    PCR5        = OUTPUT_BYTE; // H8 PORT5 コントロールレジスタを出力モードに設定

    PDR5 = scidir;             //    set sci direction

    for(i = 0;i < 34;i++)      // テスト文字クリア
        teststr[i] = 0;

    for(i = 0;i < BUFFMAX;i++) // バッファクリア
        rx_buff[i] = 0;
    rx_top = 0;
    rx_bot = 0;
    cnt = 0;
    rdy = 0;

    // XBee API receive parameter
    apicnt = 0;            // API文字カウンタ
    apiesc = 0;            // APIEscapecode flag
    apilen = 0;            // API Length

    apirdy = 0;            // API受信frameレディ

//    init_lcd();                   // LCDをイニシャライズする
    sci3_tx_str("\r\n\nstart XBeeControlPulse ver.1.00H8/3694F\r\n"); // 初期文字列送信
//    lcd_puts(" XBee Controller"); // 初期文字列の表示
//    lcd_xy(1,2);                  // 2行の1桁目にアドレスを設定
//    lcd_puts("H8/3694F ver0.20"); // versionの表示

//    TMRW |= 0x80;   //タイマースタート
//    CTS = 1;

// 2013.4.8 read sensor state clear
    sensing_pos = 0;      // Sensing term timming 2 -> reset, hum, temp sense

    sense_state = 1;      // 1 reset 2 humidity 3 temparature, 0 wait TIMERA
    reset_step = 0;       // reset step
    humidyty_step = 0;    // 0-> n humidity sensor reading step
    temperature_step = 0; // 0-> n temprature sensor reading step
    get_humi_flag = 0;

    scl_off = 0;          // SCL clock off state

    set_imask_ccr(0);     /* 割り込み許可 */

    while(1) {

        if(get_humi_flag){
            sci3_tx_str("   HUMIDITY:  "); // 文字列送信
            humi_data = 0;
            bin_dat = 2048;
            for(i = 11;i > -1;i-- ) {
                if(humi_data_bit[i] == 1) {
                    humi_data += bin_dat;
                    sci3_tx_str("1"); // 文字列送信
                }
                else {
                    sci3_tx_str("0"); // 文字列送信
                }
                bin_dat = bin_dat / 2;
            }
            sci3_tx_str(" ");     //
            uint2hex(humi_data, (unsigned char *)(&valstr[0]));
            valstr[4] = 0;
            sci3_tx_str(valstr);  //
            sci3_tx_str(" ");     //
            ulong2dec((unsigned long)humi_data, (unsigned char *)(&valstr[0]));
            sci3_tx_str(valstr);  //
            sci3_tx_str(" ");     //
            ulong2dec((unsigned long)rhval[humi_data/2], (unsigned char *)(&valstr[0]));
            sci3_tx_str_p (valstr, 3);
            //sci3_tx_str(valstr); //
            sci3_tx_str("\r\n");   //
            get_humi_flag = 0;
        }
        
        if(get_temp_flag){
            sci3_tx_str("TEMPERATURE:"); // 文字列送信
            temp_data = 0;
            bin_dat = 8192;
            for(i = 13;i > -1;i-- ) {
                if(temp_data_bit[i] == 1) {
                    temp_data += bin_dat;
                    sci3_tx_str("1"); // 文字列送信
                }
                else {
                    sci3_tx_str("0"); // 文字列送信
                }
                bin_dat = bin_dat / 2;
            }
            sci3_tx_str(" ");      //
            uint2hex(temp_data, (unsigned char *)(&valstr[0]));
            valstr[4] = 0;
            sci3_tx_str(valstr);   //
            sci3_tx_str(" ");      //
            ulong2dec((unsigned long)temp_data, (unsigned char *)(&valstr[0]));
            sci3_tx_str(valstr);   //
            sci3_tx_str(" ");      //
            ulong2dec((unsigned long)(temp_data - 3966), (unsigned char *)(&valstr[0]));
            sci3_tx_str_p (valstr, 2);
            //sci3_tx_str(valstr); //
            sci3_tx_str("\r\n");   //
            get_temp_flag = 0;
        }

        if(rx_top != rx_bot) {
            if(apirdy) {
                if(rx_buff[rx_top] == 0x7D) {
                    apiesc = 1;
                }
                else {
                    if(apiesc) {
                        rx_api[apicnt] = rx_buff[rx_top] ^ 0x20; // APIEscape有効文字移動
                        apiesc = 0;
                    }
                    else {
                        rx_api[apicnt] = rx_buff[rx_top]; // API有効文字移動
                    }
                    // XBee RX Data -> PC HEX char
                    uchr2hex(rx_api[apicnt], (char *)(&teststr[0]));
                                                        //1byte 2 Hex charactors
                    teststr[2] = 0;
                    sci3_tx_str((char *)(&teststr[0])); // Test call back
                    // lcd_xy(1,2);                     // 2行の1桁目にアドレスを設定
                    //lcd_puts((char *)(&teststr[0]));  // テスト文字列の表示

                    apicnt++;
                    if(apilen == 0 && apicnt > 2) {
                        apilen = rx_api[1] * 256 + rx_api[2];
                    }
                    else {
                        if(apicnt >= (apilen + 4)) { // API frame 受信チェック
                            // XBee RX Data -> PC HEX char  Data monitor
                            sci3_tx_str("\r\n");   // received API frame
                            uchr2hex(rx_api[3], (char *)(&teststr[0]));
                            uchr2hex(rx_api[4], (char *)(&teststr[2]));
                            teststr[4] = 0;
                            //sci3_tx_str((char *)(&teststr[0])); // Test call back
                            //sci3_tx_str("\r\n"); // Test call back

                            api_proc();          // API frame を表示

                            apirdy = 0;
                            apicnt = 0;
                            apilen = 0;
                        }
                    }
                }
                rx_top++;
                if(rx_top >= BUFFMAX) {          // リングポインタを先頭へ
                    rx_top = 0;
                }
            }
            else {
                if(rx_buff[rx_top] == 0x7E) {    // check API start delimiter
                    rx_api[0] = rx_buff[rx_top]; // API有効文字移動
                    apicnt = 1;
                    apirdy = 1;
                    //
                    sci3_tx_str("\r\n7E");       // delimiter  Data monitor
                    //lcd_xy(1,1);               // 1行の1桁目にアドレスを設定
                    //lcd_puts("7E");            // delimiter文字の表示
                }
                // 以下XBeeの動作には直接関係なし
                else {
                    if(rx_buff[rx_top] == '\r') { // 改行チェック
                        rx_buff[rx_top] = '\0';   // コマンド準備完
                        rx_cmd[cnt] = '\0';
                        rdy = 1;
                    }
                    else  {
                        rx_cmd[cnt] = rx_buff[rx_top]; // 有効文字移動
                    }
                    cnt++;
                }
                rx_top++;
                if(rx_top >= BUFFMAX) {           // リングポインタを先頭へ
                    rx_top = 0;
                }
            }
            if(cnt >= 64) {                       // コマンド長チェック
                sci3_tx_str("error: buffer over!"); // コマンド文字列オーバー
                sci3_tx_str(rx_cmd);
                sci3_tx_str("\r\n");
                cnt = 0;
            }
            if(rdy == 1) {                        // コマンド準備完チェック
                 cnt = 0;
                rdy = 0;
                sci3_tx_str(rx_cmd);              // 確認用コマンド表示
                sci3_tx_str("\r\n");
                cmd_proc(rx_cmd);                 // コマンド処理へ
            }
        }
    }
}

/* TimerW割り込みデータ処理 */
void int_TimerW(void)
{
    if(scl_off == 0) {
        switch(sense_state) {
            case RESET_CMD:    // sense_state reset process
                switch(reset_step) {
                    case 0:            // start reset
                        PDR82 = 1;     // rise
                        PCR80 = 1;     // SDA ON
                        PDR80 = 1;     // SDA High
                        break;
                    case 2:
                        PDR82 = 0;     // fall
                        break;
                    case 4:
                        PDR82 = 1;     // rise 1
                        break;
                    case 6:
                        PDR82 = 0;     // fall
                        break;
                    case 8:
                        PDR82 = 1;     // rise 2
                        break;
                    case 10:
                        PDR82 = 0;     // fall
                        break;
                    case 12:
                        PDR82 = 1;     // rise 3
                        break;
                    case 14:
                        PDR82 = 0;     // fall
                        break;
                    case 16:
                        PDR82 = 1;     // rise 4
                        break;
                    case 18:
                        PDR82 = 0;     // fall
                        break;
                    case 20:
                        PDR82 = 1;     // rise 5
                        break;
                    case 22:
                        PDR82 = 0;     // fall
                        break;
                    case 24:
                        PDR82 = 1;     // rise 6
                        break;
                    case 26:
                        PDR82 = 0;     // fall
                        break;
                    case 28:
                        PDR82 = 1;     // rise 7
                        break;
                    case 30:
                        PDR82 = 0;     // fall
                        break;
                    case 32:
                        PDR82 = 1;     // rise 8
                        break;
                    case 34:
                        PDR82 = 0;     // fall
                        break;
                    case 36:
                        PDR82 = 1;     // rise 9
                        break;
                    case 38:
                        PDR82 = 0;     // fall
                        break;
                    case 40:
                        PDR82 = 1;     // rise 10
                        break;
                    case 41:
                        PDR80 = 0;     // SDA low
                        break;
                    case 42:
                        PDR82 = 0;     // fall
                        break;
                    case 44:
                        PDR82 = 1;     // rise 11
                        break;
                    case 45:
                        PDR80 = 1;     // SDA high
                        break;
                    case 46:
                        PCR80 = 0;     // SDA OFF
                        PDR82 = 0;     // fall
                        reset_step = -1;
                        sense_state = 0;
                        scl_off = 480; // SCL clock off state 3 -> one time sleep
                        break;         // 25us * 480 = 12ms
                }
                reset_step++;
                break;
            case HUMI_CMD:             // sense_state reset process
                switch(humidyty_step) {
                    case 0:            // SCL SDA ON
                        PDR82 = 1;     // SCL high TX start 1
                        PCR80 = 1;     // SDA ON  high TX 1
                        PDR80 = 1;     // SDA High
                        break;
                    case 1:            // data fall
                        PDR80 = 0;     // SDA low TX start
                        break;
                    case 2:            // fall
                        PDR82 = 0;     // SCL low TX
                        break;
                    case 4:            // rise
                        PDR82 = 1;     // SCL high TX start 2
                        break;
                    case 5:            // data rise
                        PDR80 = 1;     // SDA high TX 2
                        break;
                    case 6:            // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 7:            // data off
                        PDR80 = 0;     // SDA low TX start end
                        break;
                    case 8:            // rise
                        PDR82 = 1;     // SCL high 1 A2 0
                        break;
                    case 10:           // fall
                        PDR82 = 0;     // SCL low 
                        break;
                    case 12:           // rise
                        PDR82 = 1;     // SCL high 2 A1 0
                        break;
                    case 14:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 16:           // rise
                        PDR82 = 1;     // SCL high 3 A0 0
                        break;
                    case 18:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 20:           // rise
                        PDR82 = 1;     // SCL high 4 C4 0
                        break;
                    case 22:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 24:           // rise
                        PDR82 = 1;     // SCL high 5 C3 0
                        break;
                    case 26:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 27:           // SDA
                        PDR80 = 1;     // SDA high
                        break;
                    case 28:           // rise
                        PDR82 = 1;     // SCL high 6 C2 1
                        break;
                    case 30:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 31:           // SDA
                        PDR80 = 0;     // SDA low
                        break;
                    case 32:           // rise
                        PDR82 = 1;     // SCL high 7 C1 0
                        break;
                    case 34:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 35:           // SDA
                        PDR80 = 1;     // SDA high
                        break;
                    case 36:           // rise
                        PDR82 = 1;     // SCL high 8 C0 1
                        break;
                    case 38:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 39:           // SDA OFF
                        PDR80 = 0;     // SDA high
                        PCR80 = 0;     // SDA off
                        break;
                    case 40:           // rise
                        PDR82 = 1;     // SCL high 9 ACK
                        break;
                    case 41:           // rise
                        sdl_ack = PDR80; // SDA ACK
                        break;
                    case 42:           // fall
                        PDR82 = 0;     // SCL low
                        humidyty_step = -1;
                        sense_state++;
                        break;
                }
                humidyty_step++;       // 0-> n humidity sensor command step
                break;
            case READ_HUMI:            // sense_state temparature process
                switch(humidyty_step) {
                    case 0:            // rise
                        sdl_ready = PDR80; // SDA ACK read
                        if(sdl_ack == 0 && sdl_ready == 0) {
                            // check timer
                            PDR82 = 1; // SCL high ready go 1 idle bit 15
                        }
                        else {
                            humidyty_step--; // wait ready
                        }
                        break;
                    case 2:            // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 4:            // rise
                        PDR82 = 1;     // SCL high 2 idle bit 14
                        break;
                    case 6:            // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 8:            // rise
                        PDR82 = 1;     // SCL high 3 idle bit 13
                        break;
                    case 10:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 12:           // rise
                        PDR82 = 1;     // SCL high 4 idle bit 12
                        break;
                    case 14:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 16:           // rise
                        PDR82 = 1;     // SCL high 5 data bit 11
                        humi_data_bit[11] = PDR80;
                        break;
                    case 18:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 20:           // rise
                        PDR82 = 1;     // SCL high 6 data bit 10
                        humi_data_bit[10] = PDR80;
                        break;
                    case 22:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 24:           // rise
                        PDR82 = 1;     // SCL high 7 data bit 9
                        humi_data_bit[9] = PDR80;
                        break;
                    case 26:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 28:           // rise
                        PDR82 = 1;     // SCL high 8 data bit 8
                        humi_data_bit[8] = PDR80;
                        break;
                    case 30:           // fall
                        PDR82 = 0;     // SCL low
                        PCR80 = 1;     // SDA ON to sensor
                        PDR80 = 1;     // SDA hight ACK
                        break;
                    case 32:           // ON
                        PDR82 = 1;     // SCL high TX ACK
                        PDR80 = 0;     // SDA low
                        break;
                    case 34:           // rise
                        PDR82 = 0;     // SCL low
                        PCR80 = 0;     // SDA OFF from sensor
                        break;
                    case 36:           // rise
                        PDR82 = 1;     // SCL high 1 data bit 7
                        humi_data_bit[7] = PDR80;
                        break;
                    case 38:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 40:           // rise
                        PDR82 = 1;     // SCL high 2 data bit 6
                        humi_data_bit[6] = PDR80;
                        break;
                    case 42:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 44:           // rise
                        PDR82 = 1;     // SCL high 3 data bit 5
                        humi_data_bit[5] = PDR80;
                        break;
                    case 46:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 48:           // rise
                        PDR82 = 1;     // SCL high 4 data bit 4
                        humi_data_bit[4] = PDR80;
                        break;
                    case 50:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 52:           // rise
                        PDR82 = 1;     // SCL high 5 data bit 3
                        humi_data_bit[3] = PDR80;
                        break;
                    case 54:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 56:           // rise
                        PDR82 = 1;     // SCL high 6 data bit 2
                        humi_data_bit[2] = PDR80;
                        break;
                    case 58:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 60:           // rise
                        PDR82 = 1;     // SCL high 7 data bit 1
                        humi_data_bit[1] = PDR80;
                        break;
                    case 62:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 64:           // rise
                        PDR82 = 1;     // SCL high 8 data bit 0
                        humi_data_bit[0] = PDR80;
                        break;
                    case 66:           // fall
                        PDR82 = 0;     // SCL low
                        humidyty_step = -1;
                        sense_state = 0;
                        get_humi_flag = 1;
                //        scl_off = 480; // SCL clock off state 3 -> one time sleep
                        scl_off = 240;   // SCL clock off state 3 -> one time sleep
                        break;         // 25us * 480 = 12ms
                }
                humidyty_step++;       // 0-> n humidity sensor reading step
                break;
            case TEMP_CMD:             // sense_state temparature process
                switch(temperature_step) {
                    case 0:            // SCL SDA ON
                        PDR82 = 1;     // SCL high TX start 1
                        PCR80 = 1;     // SDA ON  high TX 1
                        PDR80 = 1;     // SDA High
                        break;
                    case 1:            // data fall
                        PDR80 = 0;     // SDA low TX start
                        break;
                    case 2:            // fall
                        PDR82 = 0;     // SCL low TX
                        break;
                    case 4:            // rise
                        PDR82 = 1;     // SCL high TX start 2
                        break;
                    case 5:            // data rise
                        PDR80 = 1;     // SDA high TX 2
                        break;
                    case 6:            // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 7:            // data off
                        PDR80 = 0;     // SDA low TX start end
                        break;
                    case 8:            // rise
                        PDR82 = 1;     // SCL high 1 A2 0
                        break;
                    case 10:           // fall
                        PDR82 = 0;     // SCL low 
                        break;
                    case 12:           // rise
                        PDR82 = 1;     // SCL high 2 A1 0
                        break;
                    case 14:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 16:           // rise
                        PDR82 = 1;     // SCL high 3 A0 0
                        break;
                    case 18:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 20:           // rise
                        PDR82 = 1;     // SCL high 4 C4 0
                        break;
                    case 22:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 24:           // rise
                        PDR82 = 1;     // SCL high 5 C3 0
                        break;
                    case 26:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 27:           // SDA
                        PDR80 = 0;     // SDA low
                        break;
                    case 28:           // rise
                        PDR82 = 1;     // SCL high 6 C2 0
                        break;
                    case 30:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 31:           // SDA
                        PDR80 = 1;     // SDA high
                        break;
                    case 32:           // rise
                        PDR82 = 1;     // SCL high 7 C1 1
                        break;
                    case 34:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 35:           // SDA
                        PDR80 = 1;     // SDA high
                        break;
                    case 36:           // rise
                        PDR82 = 1;     // SCL high 8 C0 1
                        break;
                    case 38:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 39:           // SDA OFF
                        PDR80 = 0;     // SDA high
                        PCR80 = 0;     // SDA off
                        break;
                    case 40:           // rise
                        PDR82 = 1;     // SCL high 9 ACK
                        break;
                    case 41:           // rise
                        sdl_ack = PDR80; // SDA ACK
                        break;
                    case 42:           // fall
                        PDR82 = 0;     // SCL low
                        temperature_step = -1;
                        sense_state++;
                        break;
                }
                temperature_step++;    // 0-> n temprature sensor command step
                break;
            case READ_TEMP:            // sense_state temparature process
                switch(temperature_step) {
                    case 0:            // rise
                        sdl_ready = PDR80; // SDA ACK read
                        if(sdl_ack == 0 && sdl_ready == 0) {
                            // check timer
                            PDR82 = 1; // SCL high ready go 1 idle bit 15
                        }
                        else {
                            temperature_step--; // wait ready
                        }
                        break;
                    case 2:            // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 4:            // rise
                        PDR82 = 1;     // SCL high 2 idle bit 14
                        break;
                    case 6:            // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 8:            // rise
                        PDR82 = 1;     // SCL high 3 data bit 13
                        temp_data_bit[13] = PDR80;
                        break;
                    case 10:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 12:           // rise
                        PDR82 = 1;     // SCL high 4 data bit 12
                        temp_data_bit[12] = PDR80;
                        break;
                    case 14:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 16:           // rise
                        PDR82 = 1;     // SCL high 5 data bit 11
                        temp_data_bit[11] = PDR80;
                        break;
                    case 18:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 20:           // rise
                        PDR82 = 1;     // SCL high 6 data bit 10
                        temp_data_bit[10] = PDR80;
                        break;
                    case 22:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 24:           // rise
                        PDR82 = 1;     // SCL high 7 data bit 9
                        temp_data_bit[9] = PDR80;
                        break;
                    case 26:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 28:           // rise
                        PDR82 = 1;     // SCL high 8 data bit 8
                        temp_data_bit[8] = PDR80;
                        break;
                    case 30:           // fall
                        PDR82 = 0;     // SCL low
                        PCR80 = 1;     // SDA ON to sensor
                        PDR80 = 1;     // SDA hight ACK
                        break;
                    case 32:           // ON
                        PDR82 = 1;     // SCL high TX ACK
                        PDR80 = 0;     // SDA low
                        break;
                    case 34:           // rise
                        PDR82 = 0;     // SCL low
                        PCR80 = 0;     // SDA OFF from sensor
                        break;
                    case 36:           // rise
                        PDR82 = 1;     // SCL high 1 data bit 7
                        temp_data_bit[7] = PDR80;
                        break;
                    case 38:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 40:           // rise
                        PDR82 = 1;     // SCL high 2 data bit 6
                        temp_data_bit[6] = PDR80;
                        break;
                    case 42:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 44:           // rise
                        PDR82 = 1;     // SCL high 3 data bit 5
                        temp_data_bit[5] = PDR80;
                        break;
                    case 46:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 48:           // rise
                        PDR82 = 1;     // SCL high 4 data bit 4
                        temp_data_bit[4] = PDR80;
                        break;
                    case 50:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 52:           // rise
                        PDR82 = 1;     // SCL high 5 data bit 3
                        temp_data_bit[3] = PDR80;
                        break;
                    case 54:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 56:           // rise
                        PDR82 = 1;     // SCL high 6 data bit 2
                        temp_data_bit[2] = PDR80;
                        break;
                    case 58:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 60:           // rise
                        PDR82 = 1;     // SCL high 7 data bit 1
                        temp_data_bit[1] = PDR80;
                        break;
                    case 62:           // fall
                        PDR82 = 0;     // SCL low
                        break;
                    case 64:           // rise
                        PDR82 = 1;     // SCL high 8 data bit 0
                        temp_data_bit[0] = PDR80;
                        break;
                    case 66:           // fall
                        PDR82 = 0;     // SCL low
                        temperature_step = -1;
                        sense_state = 0;
                        get_temp_flag = 1;
                        scl_off = 480; // SCL clock off state 3 -> one time sleep
                        break;         // 25us * 480 = 12ms
                }
                temperature_step++; // 0-> n temperature sensor reading step
                break;
        }
    }
    else {
        PDR82 = 0;
        if(scl_off > 0){ // SCL clock off state 3 -> one time sleep
            scl_off--;
        }
    }
    IMFA=0;
//    sci3_tx_str("#");
//    sci3_tx_str("\r\n");
}

void abort(void)
{
    
}

/* IRQ2割り込みデータ処理 */
void int_IRQ2(void)
{
//    static char flag = 0;

//    IRR1.BYTE &= 0xfb; /* IRQ2の割込みフラグをクリアする */

//    if( flag == 0 ) {
//        flag = 1;
//        sci3_tx_str("Interrupt ON\r\n"); //
//    } else {
//        flag = 0;
//        sci3_tx_str("Interrupt OFF\r\n"); //
//    }

//    sndcnt += 1;
}

/* TimerA割り込みデータ処理 */
void int_TimerA(void)
{

//    IENR1.BYTE &= 0xBF;   ;TIME_A 割り込み停止
//    IRR1.BYTE &= 0xBF;    ;TIME_A 割り込みフラグをクリアー

    IRRTA = 0;    // TIME_A 割り込みフラグをクリアー
    
    // 2013.3.29
    if(apirdy == 0) {

        // 2013.4.4 Sensirion test program var
        sensing_pos += 1;
        if(sensing_pos == 2) {      // Sensing term timming 2 -> reset, hum, temp sense
            sense_state = HUMI_CMD; // 1 reset 2 humidity 3 temparature, 0 wait TIMERA
            humidyty_step = 0;      // 0-> n humidity sensor reading step
        }
        else if(sensing_pos == 3) {
            sense_state = TEMP_CMD; // 1 reset 2 humidity 3 temparature, 0 wait TIMERA
            temperature_step = 0;   // 0-> n temprature sensor reading step
        }
        else {
            if(sensing_pos > 3) {
                sensing_pos = 0;
            }
        }

        ulong2dec(tmacnt, (unsigned char *)(&valstr[0]));
        valstr[4] = 0;
        // 2013.3.1 testtksddo
    
        sci3_tx_str((char *)(&valstr[0])); //
        sci3_tx_str("\r\n");               //
        tmacnt += 1;

    }
}

/* 受信割り込みデータ処理 */
void int_SCI3_rx(void)
{
    char data;

    SCI3.SCR3.BIT.RIE = 0;          /* 割り込み停止 */

    data = SCI3.RDR;                // 受信データ
    if ((SCI3.SSR.BIT.OER == 1) || (SCI3.SSR.BIT.FER == 1)) {
                                    // オーバーラン、フレーミングエラー
        SCI3.SSR.BYTE = 0x80;       // クリアエラーClear Error Flag (TDRE=1) 
    }
    else {
        rx_buff[rx_bot] = data;     // 受信データをリングバッファへ
        rx_bot++;
        if(rx_bot >= BUFFMAX) {
            rx_bot = 0;
        }
    }
    SCI3.SCR3.BIT.RIE = 1;          /* 割り込み再開 */
}

/* 受信コマンド処理 */
cmd_proc(char *cmd)
{

}


/* XBeeAPIFrame受信処理 */
api_proc(void)
{
    unsigned int i,j;

    unsigned char frm_id;
    unsigned char frm_dt;

    unsigned char ch_mask;
    unsigned char dig_dt;

    unsigned long an_dt;

    frm_id = rx_api[3];    // API frame id
    switch(frm_id) {
        case 0x8A:         // (共通) Modem status
            //lcd_clear();                    // LCDをクリアする
            //        0123456789ABCDEF
            //lcd_puts("[8A]Modem Status");   // Modem status
            //lcd_xy(1,2);                    // 2行の1桁目にアドレスを設定
            sci3_tx_str("[8A]Modem Status\r\n"); //
            frm_dt = rx_api[4];
            switch(frm_dt) {
                case 0:    // Hardware reset
                    //lcd_puts("Hardware reset  "); // Hardware reset
                    sci3_tx_str("Hardware reset  \r\n"); //
                    break;
                case 1:    // Watchdog timer reset
                    //lcd_puts("WatchdogTimerRst"); // Watchdog timer reset
                    sci3_tx_str("WatchdogTimerRst\r\n"); //
                    break;
                case 2:    // Associated
                    //lcd_puts("Associated      "); // Associated
                    sci3_tx_str("Associated      \r\n"); //
                    break;
                case 3:    // Disassociated
                    //lcd_puts("Disassociated   "); // Disassociated
                    sci3_tx_str("Disassociated   \r\n"); //
                    break;
                case 4:    // Synchronization Lost
                    //lcd_puts("Sync. lost      "); // Synchronization Lost
                    sci3_tx_str("Sync. lost      \r\n"); //
                    break;
                case 5:    // Coordinator realignment
                    //lcd_puts("Coordin. realign"); // Coordinator realignment
                    sci3_tx_str("Coordin. realign\r\n"); //
                    break;
                case 6:    // Coordinator started
                    //lcd_puts("Coordin. started"); // Coordinator started
                    sci3_tx_str("Coordin. started\r\n"); //
                    break;
            }
            break;
        case 0x88:    // (共通) AT command Responce
            //lcd_clear();                     //  LCDをクリアする
            //        0123456789ABCDEF
            //lcd_puts("[88]ATCmd Resp  ");    // AT command Responce
            //lcd_xy(1,2);                     // 2行の1桁目にアドレスを設定
            //lcd_puts("No support      ");    // 未サポート
            sci3_tx_str("[88]ATCmd Resp  No support      \r\n"); //
            break;
        case 0x90:    // (Series2) Zigbee Receive Packet(AO=0)
            //lcd_clear();                    // LCDをクリアする
            //        0123456789ABCDEF
            //lcd_puts("[90]ZB RX Packet");   // Zigbee Receive Packet
            sci3_tx_str("[90]ZB RX Packet\r\n"); //
            //lcd_xy(1,2);                    // 2行の1桁目にアドレスを設定
            j = 0;
            for(i = 15;i < (apilen + 3);i++) {
                if(i > 30) {
                    break;
                }
                teststr[j] = rx_api[i];
                j++;
            }
            teststr[j] = 0;
            sci3_tx_str("RX:");
            sci3_tx_str((char *)(&teststr[0])); // Display RX data
            sci3_tx_str("\r\n");
            //lcd_puts((char *)(&teststr[0]));  // Display RX data
            break;
        case 0x92:    // (Series2) Zigbee IO Data Sample RX Indicator
            //lcd_clear();                      // LCDをクリアする

             //           0123456789ABCDEF
               sci3_tx_str("[92]ZB IO Data Sample RX Indicator\r\n"); //
            if(an_dg_ff) {
                an_dg_ff = 0;
                //                  0123456789ABCDEF
                my_strncpy(teststr,"3:    mV2:    mV",16);      // Display RX data
                teststr[16] = 0;
                //                       0123456789ABCDEF
                my_strncpy(&teststr[17],"1:    mV0:    mV",16); // Display RX data
                teststr[33] = 0;
                //lcd_xy(1,2);
                ch_mask = rx_api[18];
                i = 21;
                if(ch_mask & 0x01) {
                    an_dt = rx_api[i++] * 256 + rx_api[i++];
                    an_dt = an_dt * 1173;
                    an_dt = an_dt / 1000;
                    ulong2dec(an_dt, (unsigned char *)(&teststr[27]));
                }
                if(ch_mask & 0x02) {
                    an_dt = rx_api[i++] * 256 + rx_api[i++];
                    an_dt = an_dt * 1173;
                    an_dt = an_dt / 1000;
                    ulong2dec(an_dt, (unsigned char *)(&teststr[19]));
                }
                if(ch_mask & 0x04) {
                    an_dt = rx_api[i++] * 256 + rx_api[i++];
                    an_dt = an_dt * 1173;
                    an_dt = an_dt / 1000;
                    ulong2dec(an_dt, (unsigned char *)(&teststr[10]));
                }
                if(ch_mask & 0x08) {
                    an_dt = rx_api[i++] * 256 + rx_api[i++];
                    an_dt = an_dt * 1173;
                    an_dt = an_dt / 1000;
                    ulong2dec(an_dt, (unsigned char *)(&teststr[2]));
                }
                //lcd_clear();                      // LCDをクリアする
                //lcd_puts((char *)(&teststr[0]));  // Display RX data
                sci3_tx_str((char *)(&teststr[0]));
                sci3_tx_str("\r\n");
                //lcd_xy(1,2);
                //lcd_puts((char *)(&teststr[17])); // Display RX data
                sci3_tx_str((char *)(&teststr[17]));
                sci3_tx_str("\r\n");
            }
            else {
                //lcd_clear();                  // LCDをクリアする
                an_dg_ff = 1;
                //        0123456789ABCDEF
                //lcd_puts("2 1098 7654 3210"); // Zigbee IO Data Sample RX Indicator
                sci3_tx_str("2 1098 7654 3210\r\n");
                for(i = 0;i < 16;i++) {
                    teststr[i] = 0x20;
                }
                teststr[16] = 0;
                ch_mask = rx_api[16];
                dig_dt = rx_api[19];
                if(ch_mask & 0x10){
                    if(dig_dt & 0x10) {
                        teststr[0] = '1';
                    }
                    else {
                        teststr[0] = '0';
                    }
                }
                if(ch_mask & 0x08){
                    if(dig_dt & 0x08) {
                        teststr[2] = '1';
                    }
                    else {
                        teststr[2] = '0';
                    }
                }
                if(ch_mask & 0x04){
                    if(dig_dt & 0x08) {
                        teststr[3] = '1';
                    }
                    else {
                        teststr[3] = '0';
                    }
                }
                ch_mask = rx_api[17];
                dig_dt = rx_api[20];
                if(ch_mask & 0x80){
                    if(dig_dt & 0x80) {
                        teststr[7] = '1';
                    }
                    else {
                        teststr[7] = '0';
                    }
                }
                if(ch_mask & 0x40){
                    if(dig_dt & 0x40) {
                        teststr[8] = '1';
                    }
                    else {
                        teststr[8] = '0';
                    }
                }
                if(ch_mask & 0x20){
                    if(dig_dt & 0x20) {
                        teststr[9] = '1';
                    }
                    else {
                        teststr[9] = '0';
                    }
                }
                if(ch_mask & 0x10){
                    if(dig_dt & 0x10) {
                        teststr[10] = '1';
                    }
                    else {
                        teststr[10] = '0';
                    }
                }
                if(ch_mask & 0x08){
                    if(dig_dt & 0x08) {
                        teststr[12] = '1';
                    }
                    else {
                        teststr[12] = '0';
                    }
                }
                if(ch_mask & 0x04){
                    if(dig_dt & 0x40) {
                        teststr[13] = '1';
                    }
                    else {
                        teststr[13] = '0';
                    }
                }
                if(ch_mask & 0x02){
                    if(dig_dt & 0x02) {
                        teststr[14] = '1';
                    }
                    else {
                        teststr[14] = '0';
                    }
                }
                if(ch_mask & 0x01){
                    if(dig_dt & 0x01) {
                        teststr[15] = '1';
                    }
                    else {
                        teststr[15] = '0';
                    }
                }
                //lcd_xy(1,2);                //     2行の1桁目にアドレスを設定
                //lcd_puts((char *)(&teststr[0])); // Display Digital data
                sci3_tx_str((char *)(&teststr[0]));
                sci3_tx_str("\r\n");
            }
            break;
        case 0x82:    // (Series1) RX(Receive) Packet:64-bit address I/O 
            //lcd_clear();                    //     LCDをクリアする
            //        0123456789ABCDEF
            //lcd_puts("[82]1RX 64bAD IO");   //     RX(Receive) Packet:64-bit address I/O
            //lcd_xy(1,2);                    //     2行の1桁目にアドレスを設定
            sci3_tx_str("[82]1RX 64bAD IO\r\n");
            //        0123456789ABCDEF
            //lcd_puts("No support      ");   //     未サポート
            sci3_tx_str("No support      \r\n");
            break;
        case 0x83:    // (Series1) RX(Receive) Packet:16-bit address I/O 
            break;
            //lcd_clear();                    //     LCDをクリアする
            //        0123456789ABCDEF
            //lcd_puts("[83]1RX 16bAD IO");   //     RX(Receive) Packet:16-bit address I/O
            //lcd_xy(1,2);                    //     2行の1桁目にアドレスを設定
            sci3_tx_str("[83]1RX 16bAD IO\r\n");
            //lcd_puts("No support      ");   //     未サポート
            sci3_tx_str("No support      \r\n");
            break;
        case 0x95:    // (Series2) Node Identification Indicator(AO=0)
            //lcd_clear();                    //     LCDをクリアする
            //        0123456789ABCDEF
            //lcd_puts("[95]2ND ID Indic");   //     Node Identification Indicator
            //lcd_xy(1,2);                    //     2行の1桁目にアドレスを設定
            sci3_tx_str("[95]2ND ID Indic\r\n");
            //lcd_puts("No support      ");   //     未サポート
            sci3_tx_str("No support      \r\n");
            break;
        default:
            //lcd_clear();                    //     LCDをクリアする
            uchr2hex(rx_api[3], (unsigned char *)(&teststr[0]));
            teststr[2] = 0;
            //lcd_puts("[");
            //lcd_puts((char *)(&teststr[0]));
            //lcd_puts("]");
            //lcd_xy(1,2);                    //     2行の1桁目にアドレスを設定
            sci3_tx_str("[");
            sci3_tx_str((char *)(&teststr[0]));
            sci3_tx_str("]\r\n");
            //        0123456789ABCDEF
            //lcd_puts("No support      ");   //     未サポート
            sci3_tx_str("No support      \r\n");
            break;
    }
    tmacnt = 0;     //    タイマA割り込み回数を0に初期化
    ;
}

/* unsigned char -> 2 hex character */
uchr2hex(unsigned char cdt, unsigned char *ptr)
{
    char ch;

    ch = (cdt & 0xF0) >> 4;
    if(ch < 10) {
        *ptr = ch | '\x30';
    }
    else {
        *ptr = ch + '\x37';
    }
    ptr++;
    ch = (cdt & 0x0F);
    if(ch < 10) {
        *ptr = ch | '\x30';
    }
    else {
        *ptr = ch + '\x37';
    }
}

/* unsigned int -> 4 hex character */
uint2hex(unsigned int idt, unsigned char *ptr)
{
    char ch;

    ch = (idt & 0xF000) >> 12;
    if(ch < 10) {
        *ptr = ch | '\x30';
    }
    else {
        *ptr = ch + '\x37';
    }
    ptr++;
    ch = (idt & 0x0F00) >> 8;
    if(ch < 10) {
        *ptr = ch | '\x30';
    }
    else {
        *ptr = ch + '\x37';
    }
    ptr++;
    ch = (idt & 0x00F0) >> 4;
    if(ch < 10) {
        *ptr = ch | '\x30';
    }
    else {
        *ptr = ch + '\x37';
    }
    ptr++;
    ch = (idt & 0x000F);
    if(ch < 10) {
        *ptr = ch | '\x30';
    }
    else {
        *ptr = ch + '\x37';
    }
}

/* unsigned long -> 4 decimal character */
ulong2dec(unsigned long data, unsigned char *ptr)
{
    unsigned char temp;             //
    char strtemp[16];               // 文字コードの格納変数を定義
    int i, j, k;                    //
    i=0;
    do {
        temp = data % 10;           // 下位の桁から数字を抽出
        strtemp[i++] = temp + '0';  // 数字を文字コードに変換
    } while (( data /= 10 ) != 0);  //  数値の桁数までループ
    i--;
    j = 3 - i;
    while(j--) {
        *ptr = ' ';                 // 桁あわせ
        ptr++;
    }
    for( k=i; k>=0; k-- ) {         // 上位の桁から順次
        *ptr = strtemp[k];          // 桁あわせ
        ptr++;
    }
}

/* strncpy の代わりの関数 */
/* extern char *strncpy(char *, const char *, size_t); */
int my_strncpy(char *s1, char *s2, int n)
{
    int i;

    for(i = 0;i < n;i++) {
        *s1 = *s2;
        s1++;
        s2++;
    }
    return 0;
}

/* strncmp の代わりの関数 */
/* extern int  strncmp(const char *, const char *, size_t); */
int my_strncmp(char *s1, char *s2, int n)
{
    int i;

    for(i = 0;i < n;i++) {
        if(*s1 != *s2)
            return 1;
        s1++;
        s2++;
    }
    return 0;
}

				


 以上。

  質問などあればお問い合せください。