数値表示太陽計

三値表示よりも、 もっと詳しく明るさを表現するには、数値で表現できると便利です。 DEMO9S08QG8評価ボードに7セグメントLEDという部品を拡張して、 0から9の十段階の数値で明るさを表現してみましょう。 もちろん、Processor Expertの出番です。

完成写真

アジェンダ

ハードウェア

このアプリケーションは、 DEMO9S08QG8評価ボードに7セグメントLEDと 抵抗8本を拡張して製作します。

回路図

アプリケーションに必要な部分の回路は、 以下のようになっています。

太陽計回路図(STEP2)

マイコンの右側にある部分が拡張した部分です。 評価ボード以外の部分の部品は、以下の通りです。

太陽計(STEP2)部品表
品名型番個数調達先
評価ボードDEMO9S08QG81Freescale
ブレッドボードEIC-8012秋月電子
7セグメントLEDLN516RA1秋月電子
抵抗220Ω 1/6W8秋月電子
両端オスピンソケット6604P-20G-1211秋月電子

拡張部分は、ブレッドボードに作りました。 ブレッドボードは、EIC-801を二枚連結して使っています。

使用したブレッドボード

評価ボードのコネクタについて

評価ボードには、2×16構成のコネクタが搭載されています。 このアプリケーションでは、 LEDと抵抗を配置したブレッドボードを評価ボードのコネクタと 接続して機能を拡張します。

評価ボードのコネクタ

評価ボードのコネクタは、以下のように2列構成になっています。

DEMO9S08QG8評価ボードのコネクタ接続表
Pin NamePin#Pin#Pin Name
VDD12PTA5/RESET/IRQ
VSS34PTA5/RESET/IRQ
PTB1/TXD156PTA4/BKGD/MS
PTB0/RXD178PTB7/EXTAL
PTA2910PTB6/XTAL
PTA31112-
PTA5/RESET/IRQ1314-
PTA0/ACMP1+1516-
PTB31718PTA1/ACMP1-
PTB41920PTA0/ACMP1+
PTB22122-
PTB52324-
PTA1/ACMP1-2526-
PTB6/XTAL2728-
PTB7/EXTAL2930-
PTA4/BKGD/MS3132-

このため、すべての端子をブレッドボード上に接続しただけでは、 コネクタの奇数番と偶数番の信号線がショートしてしまいます。 幸い、奇数番のコネクタにすべての端子が接続されていますので、 奇数番のコネクタのみを用いてブレッドボードと接続することにします。

接続する位置は、ブレッドボードの下の端にある 1番から16番までの穴です。

ブレッドボード接続位置

ブレッドボード上の配線

ブレッドボードには、7セグメントLEDを一個と 抵抗を8本並べて配線します。 まず、部品を配置します。

部品の配置

部品を並べたら、次は配線です。 配線には、ブレッドボード用のジャンパ線を使うことも可能ですが、 配線の長さの合う線を探す手間を嫌って、 オーダーメードで配線してみました。

まず、配線の経路を確かめて、 経路の長さにあわせてエンパイアチューブを切ります。

エンパイアチューブを切り出す

次に切り出したエンパイアチューブにスズめっき線を通します。 私が使っているスズめっき線は、直径0.5mmの線ですが、 ブレッドボードに使うときには、 もう少し太目の線のほうが使いやすいようです。

スズめっき線を通す

線の先端は、15mm程度の長さのところで折り曲げて エンパイアチューブが抜けないようにします。

スズめっき線を切る

スズめっき線の反対側も折り曲げて、15mm程度の長さのところで切ります。 これで、ジャンパ線の完成です。

ジャンパ線をブレッドボードに差し込むときには、 先端の細いラジオペンチ、または、ピンセットをつかいます。

ブレッドボードに配線する

配線が終わったら、ブレッドボードは完成です。

ブレッドボード完成図

あとは、ブレッドボードと評価ボードをつなぐだけです。

評価ボードとブレッドボードの接続

評価ボードのコネクタは、メスコネクタです。 これに対して、ブレッドボードもメスになっています。 このため、これらの間を両端がオスのピンソケットで接続します。

両端オスピンソケット

気をつけなくてはならないのは、 評価ボードのコネクタが期待しているピンの太さと ブレッドボードが期待しているピンの太さが違うということです。

ピンソケットを16Pの長さにカットしてブレッドボードと 評価ボードを接続します。 最初に評価ボードにピンソケットの太いピンを差し込みます。

評価ボードとの接続

さらに細いピンをブレッドボードに差し込んで接続します。

ブレッドボードとの接続
ブレッドボードとの接続

プロジェクト作成

プログラムの開発には、CodeWarriorを使います。 CodeWarriorでは、 一つのプログラムの単位を「プロジェクト」と呼んでいます。 ここでは、新規にプロジェクトを作成します。 ここでは、V5.0を使って説明します。

CodeWarriorの起動

スタートメニューからCodeWarriorを起動するとCodeWarriorが起動します。

初めてCodeWarriorを起動したときには、 下のような"Startup"ダイアログが出てきますが、 今はこのダイアログは使用しませんので、 X をクリックしてダイアログを閉じます。

CodeWarrior起動画面

この後、"Tip of the Day"ダイアログが出てくるかも知れませんが、 これも X をクリックして閉じてしまいましょう。

使用言語とディレクトリの設定

メニューから"File → New Project..."を選ぶと、 "HC(S)08 New Project"ダイアログが開きます。 まずは、"Project Parameters"(プロジェクトのパラメータ)を設定します。

新規プロジェクト画面1

使用する言語に"C"を選び、 プロジェクトを作成する場所を設定します。 この例では、"C:\Projects\CW\TaiyouKei2"というディレクトリに "TaiyouKei2.mcp"というプロジェクトファイルを作成しています。 設定を終えたら、「次へ」をクリックします。

デバイスと接続法の設定

画面が変わって、 "Device and Connection"(デバイスと接続方法)の設定に移ります。

新規プロジェクト画面2

デバイスには"HCS08 → HCS08QG Family → MC9S08QG8"を選び、 デフォルトの接続方法には"P&E Multilink/Cyclone Pro"を選び、 「次へ」をクリックします。

追加するファイルの設定

3枚目の画面は、 "Add Additional Files"(追加するファイル)の設定です。 プロジェクトで使用するソースコードなどがあれば、 ここで設定します。

新規プロジェクト画面3

今回は、追加するファイルはありませんので、 そのまま「次へ」をクリックします。

プロセッサエキスパートの設定

4枚目の画面は、 "Processor Expert"(プロセッサエキスパート)の設定です。

新規プロジェクト画面4

"Processor Expert"を選んでこの機能の使用を宣言します。 さらに、「次へ」をクリックします。

C/C++のオプションの設定

5枚目の画面は、"C/C++ Options"の設定です。

新規プロジェクト画面5

すべて、デフォルトのままの設定にします。

startup codeANSI
memory modelSmall
floating point formatNone

設定を確認して 「次へ」をクリックします。

PC-Lintの設定

最後の画面は、"PC-Lint"の設定です。 PC-lint™というのは、 プログラムの書式を検査するためのプログラムです。 今回は使用しません。

新規プロジェクト画面6

"No"をチェックして 「完了」をクリックすると、 新規プロジェクトの作成が始まります。

パッケージを選ぶ

MC9S08QG8マイコンには、 いくつかの異なる種類のパッケージが存在します。 その中から、今から使おうとしているパッケージが どのパッケージなのかを指定するのが次のウィンドウです。

パッケージ選択画面

今回は、評価ボードに搭載されている 16PIN-DIPパッケージを使いますので、 "MC9S08QG8_16"だけを選択して「OK」をクリックします。

使用する設定を選ぶ

これが、新規プロジェクトのための 最後の設定です。 "Select Configurations"(設定を選べ)というのは、 実にあいまいですが、 ここでは、アプリケーション開発の結果を何に使うかを指定します。 もちろん、独立した製品に仕上げるのが最終目的には 違いないのですが、 プログラムの開発中には、デバッガを接続した状態で プログラムを実行する必要もあります。

"Debug"設定は、このようなデバッガを接続した状態を考慮した 設定を行います。 このため、BKGD端子には、デバッガが接続されアプリケーションでは 使用できなくなります。

一方、"Release"設定は、最終製品での使用を考慮した設定を行うため、 すべての端子がアプリケーションに開放されます。

今回は、デバッグ環境である評価ボードでアプリケーション開発を 行いますので、 "Debug"だけを選択して「OK」をクリックします。

新規プロジェクト最終画面

以上で、プロセッサエキスパートを使用する 新規プロジェクトができました。

新規プロジェクト最終画面

リソース設定

ここから、 プロセッサエキスパートのプロパティを設定していきます。 設定方法については、 三値デジタル太陽計でも詳細に説明をしましたので、 ここでは、設定箇所だけ示します。

A/Dコンバータの設定

ADCビーンを呼び出したら、以下の項目について設定します。

ADCビーンの設定
項目名設定する値
A/D Channels → Channel0 → A/D Channel (pin) PTA1_KBIP1_ADP1_ACMPMINUS
Conversion Time 64µs

ADCビーンの設定が終了すると、属性は以下のようになります。

ADCビーンの設定終了

ポート出力の設定

このアプリケーションでは、PORT-Bの全8本を汎用ポートとして使い、 7セグメントLEDを駆動しています。 ここでは、汎用ポートの設定を行います。

呼び出すビーンは、ByteIOです。 ByteIOビーンを呼び出したら、以下の項目について設定します。

ByteIOビーンの設定
項目名設定する値
Direction Output

ByteIOビーンの設定が終了すると、属性は以下のようになります。

ByteIOビーンの設定終了

A/D入力とLED表示のプログラム

プロセッサエキスパートの設定が終わったら、 プログラムのコーディングを行います。

コードの生成

CodeWarriorのウィンドウの左側にあるプロジェクトペインの Makeボタンをクリックして、 ソースコードを生成させます。

Makeボタン

ソースコードの修正

コード生成では、"TaiyouKei2.c"というファイルも同時に生成されています。

メインコード

このファイルには、 マイコンがリセットされた後で実行される "main()"関数が記述されています。 ここをダブルクリックすると、 "TaiyouKei2.c"ファイルを編集するテキストエディタが開きます。

テキストエディタを開く

メインルーチンのうち、変更する箇所は、 以下の通りです。

メインルーチンの変更

表示パターン配列

最初に7セグメントLEDに数字を表示させるための パターンが定義されています。 7セグメントLEDは、小数点を含む8つの発光ダイオード素子で 一桁の数字を表現します。

7セグメントLEDによる数値表示

それぞれの発光ダイオード素子は、PORTB端子の一つがつながっていて、 その出力の状態によって点灯と消灯を制御し、 数字をして見せることができます。 例えば、数字の"5"を表示したいときには、 a, c, d, f, g の五つのセグメントを光らせるため、 $01+$04+$08+$20+$40=$6D のコードを使います。 PORTBに"$6D"に相当する値を出力すると数字の"5"が表示される という仕組みです。

const byte digitPattern[10] = { // Pattern for 7-segment LED
  0x5C, 0x06, 0x5B, 0x4F, 0x66,
  0x6D, 0x7D, 0x27, 0x7F, 0x6F
};

変数の宣言

このプログラムでは、二つの変数が宣言されています。 一つ目は、A/Dコンバータから16ビットのデータを受け取る変数 valueです。 この変数の使い方は、三値デジタル太陽計と同じです。

二つ目は、表示すべき数値を保持する変数levelです。 この変数には、0から9までの数値が入り、 LEDに表示すべき数値を示します。

word value;  // Value from ADC.
byte level;  // Level of Brightness.

無限ループ

このプログラムの処理は、 繰り返し処理を続ける無限ループで出来ています。 無限ループを記述するには、for文を使います。

  /* Write your code here */
  for (;;) {
    :
  }

A/D変換指令

このアプリケーションでも、変換開始指令と結果の受け取りを 続けて記述しています。 この部分は、三値デジタル太陽計と同じです。

 (void)AD1_Measure(TRUE);       // wait for a conversion.
 (void)AD1_GetValue16(&value);  // get a converted value.

数値化

ここでは、ADCから得たアナログ電圧を数値表現に変換します。

 level = 9 - (value / 6554);   // translate to brightness level.

この計算式によって、ADCから得た値は、以下のように変換されます。

アナログ値と明るさの対応表
valuelevel明るさ
最小値最大値
065539明るい
6554131078
13108196617:
19662262156
26216327695
32770393234
39324458773
45878524312
52432589851暗い
58986655350

数値パターンの出力

表示すべき数値が決まったら、そのコードをLEDが接続されている"PORTB"に 出力します。

 Byte1_PutVal(~digitPattern[level]);  // Show a digit on the LED.

digitPattern[level]でパターンを選びますが、 そのままポートに設定するのではなく演算子"~"を適用しています。 これは、"0"と"1"を反転させる演算子です。 この演算子が必要な理由は、 ポート出力に"0"を出力するとLEDが点灯するような回路になっているためです。

この文書で使った7セグメントLEDは、アノードコモンと呼ばれる素子で、 すべてのセグメントのアノードが共通端子につながっています。

7セグメントLEDによる数値表示

このような構造から、 "0"を出力したときにセグメントに電流が流れて点灯します。

主要部分のプログラムは、以下のようになりました。

const byte digitPattern[10] = { // Pattern for 7-segment LED
  0x5C, 0x06, 0x5B, 0x4F, 0x66,
  0x6D, 0x7D, 0x27, 0x7F, 0x6F
};
word value;   // Value from ADC.
byte level;   // Level of Brightness.

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

  /* Write your code here */
  for (;;) {
    (void)AD1_Measure(TRUE);      // wait for a conversion.
    (void)AD1_GetValue16(&value); // get a converted value.
    level = 9 - (value / 6554);   // translate to brightness level.
    Byte1_PutVal(~digitPattern[level]);  // Show a digit on the LED.
  }

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

アプリケーションの確認

プログラムが完成したら、いよいよ自律制御をさせます。

マイコンにプログラムを書き込む

三値デジタル太陽計の時と同じようにマイコンにプログラムを書き込みます。

DEMO9S08QG8評価ボードを接続する

DEMO9S08QG8評価ボードをUSBケーブルで接続します。

デバッガ兼書き込みプログラムを呼び出す

ドロップダウンリストが"P&E Multilink/Cyclone Pro"になっているのを 確認して、 DEBUGアイコンをクリックすると コンパイル、リンクの後、デバッガが立ち上がります。

デバッガの呼び出し

USBインターフェースの設定

接続方法の指定

USBインターフェースの設定を確認したら、 "Connect"をクリックします。

マイコンに書き込む

消去確認

「Yes」をクリックして、マイコンに書き込みます。

プログラムを実行させる

ツールボタンの Start/Continueボタンをクリックすると マイコンは自律走行を始めます。

下の写真のように、 フォトダイオードにあたる光の強さによって LEDの数値表示が変わったら、完成です。

明るいときの表示
ほの明るいときの表示
暗いときの表示

課題

マイコンを休ませながら使う

このプログラムは、無限ループの中で実行されているため、 常にフルスピードでプログラムを実行しています。

LEDの表示を見るのは人間なので、そんなに忙しくLEDの表示を 更新する必要はありません。 どのようにしたら、適当にサボりながら表示を更新していくことが できるでしょうか。

二桁の数値で表現する

このアプリケーションは、0から9までの十状態で明るさを表現しています。 もっと、多くの状態を表現するためには、 桁数を増やすと細かい表示ができます。

2006-02-17 コードの記述を追加。
2006-02-14 発行。
Copyright (C) 2006 noritan.org ■