マイコン 工作入門 インドア・プレーン 玄箱PRO   オーディオ工房   100均   イベント

2007年08月16日 アーカイブ

2007年08月16日

USBSPYDER08を使ってみよう(独立したアプリケーションを作成-後編) (連載7回 最終回)

 今回は、小型ディジタル温度計のアプリケーションを完成させます。

= メイン・プログラムを書く =

 前回まででビーンが準備できたので、これらビーンを使ってメイン・プログラムを書きます。
 まず、前回作成した"SPY3"プロジェクトを開きます。

左の"Project Panel"(プロジェクト・パネル)の
"User Modules"(ユーザ・モジュール)という場所に
"SPY3.c"というプロジェクト名と同じ名前のソース・コード・ファイルが作成されています。
 このファイルをダブル・クリックしてエディタを開き、メイン・プログラムを書きます。

 最初に7セグメントLEDに数字を表示させるため、パターンを定義しています。

// 7セグメントLEDの表示パターン
const byte digit_pattern[16] = {
0x78, 0x41, 0x3B, 0x5B, 0x4D, 0x5E, 0x7E, 0x47,
0x7F, 0x5F, 0x6F, 0x7C, 0x38, 0x79, 0x3E, 0x2E
};

 宣言部に"const"指示子が付いているため、この配列はFlash ROM領域に配置されます。

 このアプリケーションでは、16通りのパターンを用意していますが、実際には数字部分の10通りのパターンしか使っていません。
 
7セグメントLEDによる数値表示
 
 次に記述するのは、MC9S08QG8のデータシートから抜き出してきた定数値です。
 これらの値は、厳密にはMCUによるばらつきがあると考えられます。そのため、精度の良い温度計を作るためにはマイコンごとに個別に調整する必要があります。
 

温度測定に使用される定数

const double vbandgap = 1.2; // バンド・ギャップ電圧 1.2V
const double vtemp25 = 0.7012; // 25度のときの温度センサ出力 701.2mV
const double m_low = 0.0001646; // 低温での温度勾配 1.646mV/degC
const double m_high = 0.0001769; // 高温での温度勾配 1.769mV/degC

 
 このアプリケーションでは、デバッグを容易にするために、すべての変数を大域変数として定義しています。
 
// 大域変数の宣言
word ad_value[2]; // A-D変換の結果を格納します。
unsigned long ad_bandgap; // バンド・ギャップ電圧のA-D変換値の総和を格納します。
unsigned long ad_temp; // 温度センサ出力のA-D変換値の総和を格納します。
double vtemp; // 計算により求めた温度センサ出力電圧を格納します。
double vdiff; // 25度のときの温度センサ出力電圧からの偏移を格納します。
word temp; // 温度を1/10度単位で計算した値を格納します。
byte i; // A-D変換回数を数えるカウンタです。

 
 メイン・プログラムで使用する関数の定義が続きます。
 
// 温度を1/10度単位で返します。
// A-D変換を合計8192回行って、分解能を上げています。
word get_temp(void) {
// 分解能を上げるため、A-D変換を128回繰り返します。
ad_bandgap = 0; // バンドギャップのA-D変換結果の総和をリセットします。
ad_temp = 0; // 温度センサのA-D変換結果の総和をリセットします。
for (i = 0; i < 128; i++) { // A-D変換を128回繰り返します。
(void)AD1_Measure(TRUE); // A-D変換を開始し、変換終了まで待ちます。
(void)AD1_GetValue16(ad_value); // A-D変換の結果を受け取ります。
ad_bandgap += ad_value[0]; // バンド・ギャップ変換値を加えます。
ad_temp += ad_value[1]; // 温度センサ出力変換値を加えます。
}
// 温度センサ出力の電圧値を計算します。
vtemp = (double)ad_temp / (double)ad_bandgap * vbandgap;
// 温度センサ出力の25度のときの値からの偏移を求めます。
vdiff = vtemp - vtemp25;
// 温度センサの出力にしたがって、温度を計算します。
if (vdiff >= 0) {
// 25度よりも低いときには、温度係数 m_low を使って計算します。
return 250 - (int)( vdiff / m_low);
} else {
// 25度よりも高いときには、温度係数 m_high を使って計算します。
return 250 + (int)(-vdiff / m_high);
}
}

// LEDに数値を表示します。
// パラメータ"dot"で小数点の表示・非表示を決めます。
void put_digit(byte number, bool dot) {
// 出力端子の値を決定します。
Byte1_PutVal(~(digit_pattern[number] | (dot?0x80:0x00)));
}

// LEDを消灯します。
void wipe_digit(void) {
Byte1_PutVal(0xFF);
}


 
 最後は、メイン関数です。
 フローチャートに従って、処理を記述します。
 
// 小型ディジタル温度計のメイン・プログラム
void main(void)
{
/* Write your local variable definition here */

/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
PE_low_level_init();
/*** End of Processor Expert internal initialization. ***/

/* Write your code here */
for (;;) {
temp = get_temp(); // 温度を測定します。
put_digit((temp / 100) % 10, FALSE); // 10の位を表示します。
Cpu_Delay100US(10000); // 1秒待ちます。
put_digit((temp / 10) % 10, TRUE); // 1の位を小数点と共に表示します。
Cpu_Delay100US(10000); // 1秒待ちます。
put_digit((temp ) % 10, FALSE); // 1/10の位を表示します。
Cpu_Delay100US(10000); // 1秒待ちます。
wipe_digit(); // LEDを消灯します。
Cpu_Delay100US(10000); // 1秒待ちます。
}

/*** 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!!! ***/


 
 以上で、メイン・プログラムは完成です。
 メニュー・バーから"Project" - "Make"を選択するか、F7ボタンを押してコンパイルを行います。

= プログラムを実行する =

 ソフトウェアの準備ができましたので、マイコンに書き込みます。
 最初にUSBSPYDER08からMC9S08QG4CPAマイコンを取り外します。これは、USBSPYDER08を開発ツールとして使用するためです。取り外したマイコンは、いずれ使用することがあるかもしれませんから、導電性のスポンジに挿して保管しておきます。
 
USBSPYDER08からマイコンを取り外す
 
 PCにUSBSPYDER08を接続し、さらにUSBSPYDER08にアプリケーション基板を接続します。
 このとき、電源を切るためにボタン電池ホルダに紙切れをはさんでおきます。
 
USBSPYDER08とアプリケーション基板を接続する
 
 メニュー・バーの"Project" - "Debug"を選ぶか、F5キーを押すと、デバッガが呼び出されます。

 最初に現れるのは、"Target Connection"(ターゲットへの接続)ダイアログです。
 
Target Connection ダイアログ
 
 このダイアログでは、"Hardware Model:"(ハードウェアの種類)に"USBSPYDER8"を選び、"Device code"(デバイスの型式)に"MC9S08QG8"を選んで、"Connect"(接続)をクリックします。

 次に"softec_bdc08"という名前のダイアログが現れます。
 このダイアログは、マイコンの電源を切る操作が必要な場合に現れます。電源をいったん切る操作は、マイコンをデバッグ・モードに導入するために必要です。
 
Power On Reset ダイアログ
 
 BDM通信を有効にするアクティブ・バックグラウンド・モードに導入するために、あなたのターゲット・ボードをPower On Reset (POR : パワー・オン・リセット)する必要があります。
  (1) ターゲット・ボードの電源を切ります。
  (2) ターゲット・ボードの電源を入れます。
  (3) 「OK」ボタンをクリックします。

 紙切れをはさんだことで、すでに電源は切れているので、紙切れを抜いて電源を入れます。
 そして、画面上の「OK」ボタンをクリックすると、"Target in progress..."(ターゲットとの接続の進捗)ダイアログが開き、プログラムが書き込まれます。
 
Target in progress ダイアログ
 
 デバッガ・ウィンドウが開いたら、メニュー・バーから"Run" - "Start/Continue"を選ぶか、F5キーを押すとプログラムが実行され、1秒おきに1桁ずつゆっくりと温度が表示されていきます。

 デバッガの大域変数ウィンドウを見ると、測定値の状況をリアルタイムに知ることができます。
 
大域変数ウィンドウ
 
 vtempにA-D変換の結果得られた温度センサの出力電圧が格納されています。また、tempには計算により求められた温度が1/10度の単位で格納されています。

 このプログラムは、常にフルスピードでCPUが走り続けます。そのため、駆動しているボタン電池が消耗してしまうことが考えられます。実用的なアプリケーションにするには、押しボタンを押したら温度表示を始めて、しばらくしたら低消費電力モードに移行するように改造するとよいでしょう。




 いかがだったでしょうか。
 USBSPYDER08を使ったアプリケーション開発を駆け足で解説してきました。この開発ツールを使えば、マイコンが動作している状態でデバッグを行うことができます。
 ぜひ、この優れたデバッグ機能を体験していただきたいと思います。

田中範明



この連載は、まとめて読めるように、初歩のマイコンのほうに、複製を置く予定です。<システム管理者>

タグ:  

投稿日時: 2007年08月16日 10:02 | | コメント (0) | トラックバック (0)

新製品 2MビットMRAMデバイス

フリースケール・セミコンダクタ・ジャパン(株)は、2Mビットの磁気抵抗ランダム・アクセス・メモリ(MRAM)デバイス・シリーズ「MR1A16A」を発表、2007年9月に出荷開始する予定。

MRAMは、磁気素材を従来のシリコン回路に組み合わせることで、SRAMのスピードとFlashの不揮発性を単独デバイスで両立させた、無限の書き込み耐久性をもつメモリ製品で、商用、産業用、拡張温度範囲(-40℃~+105℃)のオプションを提供する。

タグ:  

投稿日時: 2007年08月16日 19:04 | | コメント (0) | トラックバック (0)

新製品 携帯電話向け大容量NAND型フラッシュメモリ

東芝セミコンダクター社は、携帯電話向けに、同一デバイス内にプログラムなどを格納する二値記憶セルとデータ保存用の多値記憶セルを一体化し、任意に容量比率を設定できる大容量NAND型フラッシュメモリ「mobileLBA-NAND」を製品化、8月からサンプル出荷する。

特徴
・二値記憶領域と多値記憶領域を任意の容量で設定可能、二値記憶領域は用途に応じて最大8Gビットまで設定可能
・汎用的なNANDインターフェースを採用
・論理アドレス・アクセス方式の制御機能やエラー訂正(ECC)処理など一連の制御を行う
・メモリ容量 2、4、8、16、32Gビット

mobileLBA-NAND

タグ:    

投稿日時: 2007年08月16日 21:03 | | コメント (0) | トラックバック (0)