三値表示よりも、 もっと詳しく明るさを表現するには、数値で表現できると便利です。 DEMO9S08QG8評価ボードに7セグメントLEDという部品を拡張して、 0から9の十段階の数値で明るさを表現してみましょう。 もちろん、Processor Expertの出番です。
このアプリケーションは、 DEMO9S08QG8評価ボードに7セグメントLEDと 抵抗8本を拡張して製作します。
アプリケーションに必要な部分の回路は、 以下のようになっています。
マイコンの右側にある部分が拡張した部分です。 評価ボード以外の部分の部品は、以下の通りです。
品名 | 型番 | 個数 | 調達先 |
---|---|---|---|
評価ボード | DEMO9S08QG8 | 1 | Freescale |
ブレッドボード | EIC-801 | 2 | 秋月電子 |
7セグメントLED | LN516RA | 1 | 秋月電子 |
抵抗 | 220Ω 1/6W | 8 | 秋月電子 |
両端オスピンソケット | 6604P-20G-121 | 1 | 秋月電子 |
拡張部分は、ブレッドボードに作りました。 ブレッドボードは、EIC-801を二枚連結して使っています。
評価ボードには、2×16構成のコネクタが搭載されています。 このアプリケーションでは、 LEDと抵抗を配置したブレッドボードを評価ボードのコネクタと 接続して機能を拡張します。
評価ボードのコネクタは、以下のように2列構成になっています。
Pin Name | Pin# | Pin# | Pin Name | |
---|---|---|---|---|
VDD | 1 | 2 | PTA5/RESET/IRQ | |
VSS | 3 | 4 | PTA5/RESET/IRQ | |
PTB1/TXD1 | 5 | 6 | PTA4/BKGD/MS | |
PTB0/RXD1 | 7 | 8 | PTB7/EXTAL | |
PTA2 | 9 | 10 | PTB6/XTAL | |
PTA3 | 11 | 12 | - | |
PTA5/RESET/IRQ | 13 | 14 | - | |
PTA0/ACMP1+ | 15 | 16 | - | |
PTB3 | 17 | 18 | PTA1/ACMP1- | |
PTB4 | 19 | 20 | PTA0/ACMP1+ | |
PTB2 | 21 | 22 | - | |
PTB5 | 23 | 24 | - | |
PTA1/ACMP1- | 25 | 26 | - | |
PTB6/XTAL | 27 | 28 | - | |
PTB7/EXTAL | 29 | 30 | - | |
PTA4/BKGD/MS | 31 | 32 | - |
このため、すべての端子をブレッドボード上に接続しただけでは、 コネクタの奇数番と偶数番の信号線がショートしてしまいます。 幸い、奇数番のコネクタにすべての端子が接続されていますので、 奇数番のコネクタのみを用いてブレッドボードと接続することにします。
接続する位置は、ブレッドボードの下の端にある 1番から16番までの穴です。
ブレッドボードには、7セグメントLEDを一個と 抵抗を8本並べて配線します。 まず、部品を配置します。
部品を並べたら、次は配線です。 配線には、ブレッドボード用のジャンパ線を使うことも可能ですが、 配線の長さの合う線を探す手間を嫌って、 オーダーメードで配線してみました。
まず、配線の経路を確かめて、 経路の長さにあわせてエンパイアチューブを切ります。
次に切り出したエンパイアチューブにスズめっき線を通します。 私が使っているスズめっき線は、直径0.5mmの線ですが、 ブレッドボードに使うときには、 もう少し太目の線のほうが使いやすいようです。
線の先端は、15mm程度の長さのところで折り曲げて エンパイアチューブが抜けないようにします。
スズめっき線の反対側も折り曲げて、15mm程度の長さのところで切ります。 これで、ジャンパ線の完成です。
ジャンパ線をブレッドボードに差し込むときには、 先端の細いラジオペンチ、または、ピンセットをつかいます。
配線が終わったら、ブレッドボードは完成です。
あとは、ブレッドボードと評価ボードをつなぐだけです。
評価ボードのコネクタは、メスコネクタです。 これに対して、ブレッドボードもメスになっています。 このため、これらの間を両端がオスのピンソケットで接続します。
気をつけなくてはならないのは、 評価ボードのコネクタが期待しているピンの太さと ブレッドボードが期待しているピンの太さが違うということです。
ピンソケットを16Pの長さにカットしてブレッドボードと 評価ボードを接続します。 最初に評価ボードにピンソケットの太いピンを差し込みます。
さらに細いピンをブレッドボードに差し込んで接続します。
プログラムの開発には、CodeWarriorを使います。 CodeWarriorでは、 一つのプログラムの単位を「プロジェクト」と呼んでいます。 ここでは、新規にプロジェクトを作成します。 ここでは、V5.0を使って説明します。
スタートメニューからCodeWarriorを起動するとCodeWarriorが起動します。
初めてCodeWarriorを起動したときには、 下のような"Startup"ダイアログが出てきますが、 今はこのダイアログは使用しませんので、 をクリックしてダイアログを閉じます。
この後、"Tip of the Day"ダイアログが出てくるかも知れませんが、 これも をクリックして閉じてしまいましょう。
メニューから"File → New Project..."を選ぶと、 "HC(S)08 New Project"ダイアログが開きます。 まずは、"Project Parameters"(プロジェクトのパラメータ)を設定します。
使用する言語に"C"を選び、 プロジェクトを作成する場所を設定します。 この例では、"C:\Projects\CW\TaiyouKei2"というディレクトリに "TaiyouKei2.mcp"というプロジェクトファイルを作成しています。 設定を終えたら、「次へ」をクリックします。
画面が変わって、 "Device and Connection"(デバイスと接続方法)の設定に移ります。
デバイスには"HCS08 → HCS08QG Family → MC9S08QG8"を選び、 デフォルトの接続方法には"P&E Multilink/Cyclone Pro"を選び、 「次へ」をクリックします。
3枚目の画面は、 "Add Additional Files"(追加するファイル)の設定です。 プロジェクトで使用するソースコードなどがあれば、 ここで設定します。
今回は、追加するファイルはありませんので、 そのまま「次へ」をクリックします。
4枚目の画面は、 "Processor Expert"(プロセッサエキスパート)の設定です。
"Processor Expert"を選んでこの機能の使用を宣言します。 さらに、「次へ」をクリックします。
5枚目の画面は、"C/C++ Options"の設定です。
すべて、デフォルトのままの設定にします。
startup code | ANSI |
memory model | Small |
floating point format | None |
設定を確認して 「次へ」をクリックします。
最後の画面は、"PC-Lint"の設定です。 PC-lint™というのは、 プログラムの書式を検査するためのプログラムです。 今回は使用しません。
"No"をチェックして 「完了」をクリックすると、 新規プロジェクトの作成が始まります。
MC9S08QG8マイコンには、 いくつかの異なる種類のパッケージが存在します。 その中から、今から使おうとしているパッケージが どのパッケージなのかを指定するのが次のウィンドウです。
今回は、評価ボードに搭載されている 16PIN-DIPパッケージを使いますので、 "MC9S08QG8_16"だけを選択して「OK」をクリックします。
これが、新規プロジェクトのための 最後の設定です。 "Select Configurations"(設定を選べ)というのは、 実にあいまいですが、 ここでは、アプリケーション開発の結果を何に使うかを指定します。 もちろん、独立した製品に仕上げるのが最終目的には 違いないのですが、 プログラムの開発中には、デバッガを接続した状態で プログラムを実行する必要もあります。
"Debug"設定は、このようなデバッガを接続した状態を考慮した 設定を行います。 このため、BKGD端子には、デバッガが接続されアプリケーションでは 使用できなくなります。
一方、"Release"設定は、最終製品での使用を考慮した設定を行うため、 すべての端子がアプリケーションに開放されます。
今回は、デバッグ環境である評価ボードでアプリケーション開発を 行いますので、 "Debug"だけを選択して「OK」をクリックします。
以上で、プロセッサエキスパートを使用する 新規プロジェクトができました。
ここから、 プロセッサエキスパートのプロパティを設定していきます。 設定方法については、 三値デジタル太陽計でも詳細に説明をしましたので、 ここでは、設定箇所だけ示します。
ADCビーンを呼び出したら、以下の項目について設定します。
項目名 | 設定する値 |
---|---|
A/D Channels → Channel0 → A/D Channel (pin) | PTA1_KBIP1_ADP1_ACMPMINUS |
Conversion Time | 64µs |
ADCビーンの設定が終了すると、属性は以下のようになります。
このアプリケーションでは、PORT-Bの全8本を汎用ポートとして使い、 7セグメントLEDを駆動しています。 ここでは、汎用ポートの設定を行います。
呼び出すビーンは、ByteIOです。 ByteIOビーンを呼び出したら、以下の項目について設定します。
項目名 | 設定する値 |
---|---|
Direction | Output |
ByteIOビーンの設定が終了すると、属性は以下のようになります。
プロセッサエキスパートの設定が終わったら、 プログラムのコーディングを行います。
CodeWarriorのウィンドウの左側にあるプロジェクトペインの ボタンをクリックして、 ソースコードを生成させます。
コード生成では、"TaiyouKei2.c"というファイルも同時に生成されています。
このファイルには、 マイコンがリセットされた後で実行される "main()"関数が記述されています。 ここをダブルクリックすると、 "TaiyouKei2.c"ファイルを編集するテキストエディタが開きます。
メインルーチンのうち、変更する箇所は、 以下の通りです。
最初に7セグメントLEDに数字を表示させるための パターンが定義されています。 7セグメントLEDは、小数点を含む8つの発光ダイオード素子で 一桁の数字を表現します。
それぞれの発光ダイオード素子は、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 (;;) { : }
このアプリケーションでも、変換開始指令と結果の受け取りを 続けて記述しています。 この部分は、三値デジタル太陽計と同じです。
(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から得た値は、以下のように変換されます。
value | level | 明るさ | |
---|---|---|---|
最小値 | 最大値 | ||
0 | 6553 | 9 | 明るい |
6554 | 13107 | 8 | |
13108 | 19661 | 7 | : |
19662 | 26215 | 6 | |
26216 | 32769 | 5 | |
32770 | 39323 | 4 | |
39324 | 45877 | 3 | |
45878 | 52431 | 2 | |
52432 | 58985 | 1 | 暗い |
58986 | 65535 | 0 |
表示すべき数値が決まったら、そのコードをLEDが接続されている"PORTB"に 出力します。
Byte1_PutVal(~digitPattern[level]); // Show a digit on the LED.
digitPattern[level]でパターンを選びますが、 そのままポートに設定するのではなく演算子"~"を適用しています。 これは、"0"と"1"を反転させる演算子です。 この演算子が必要な理由は、 ポート出力に"0"を出力すると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評価ボードをUSBケーブルで接続します。
ドロップダウンリストが"P&E Multilink/Cyclone Pro"になっているのを 確認して、 アイコンをクリックすると コンパイル、リンクの後、デバッガが立ち上がります。
USBインターフェースの設定を確認したら、 "Connect"をクリックします。
「Yes」をクリックして、マイコンに書き込みます。
ツールボタンの
下の写真のように、 フォトダイオードにあたる光の強さによって LEDの数値表示が変わったら、完成です。
このプログラムは、無限ループの中で実行されているため、 常にフルスピードでプログラムを実行しています。
LEDの表示を見るのは人間なので、そんなに忙しくLEDの表示を 更新する必要はありません。 どのようにしたら、適当にサボりながら表示を更新していくことが できるでしょうか。
このアプリケーションは、0から9までの十状態で明るさを表現しています。 もっと、多くの状態を表現するためには、 桁数を増やすと細かい表示ができます。
2006-02-17 コードの記述を追加。
2006-02-14 発行。