MC9S08QG8デモンストレーション・ボード

3年前、ある雑誌用に書いたけど、なぜかボツになった原稿です。
もったいないので、抜粋したものをここに載せておきます。

(古い記事なので、現在の仕様と違っているかも)

、、、、、、
「MC9S08QG8デモンストレーション・ボード(DEMO9S08QG8)」
使用レポート

 フリースケール・セミコンダクタの「MC9S08QG8デモンストレーション・ボード(DEMO9S08QG8)」というマイコンボードを使ってみました。

このマイコンボードには同社が製造している「MC9S08QG8」という8bitマイコンが使われています。製品名に「デモ」とありますが、Cコンパイラなど必要なものは全てそろっていますので、開発用のボードとしてそのまま使用できます。
 「MC9S08QG8デモンストレーション・ボード」はツクモロボット王国などで販売されています(2006年現在)。メーカー純正のマイコンボードがCコンパイラ付きでこの値段というは、かなり安いと思います。ちなみにCコンパイラには有名な「CodeWarrior Development Studio」をカスタマイズしたものが使われています。


 マイコンボードの主なスペックは次のとおりです。

・搭載マイコン:「MC9S08QG8」(フリースケール・セミコンダクタ製8bitマイクロコントローラ)

・インターフェース:
 プッシュ・スイッチ×3個(SW1/SW2/RESET)
 LED×3個(LED1/LED2/VDD)
 アナログ入力×2つ(光センサ、VR抵抗)
 USBポート×1つ
 RS232シリアルポート×1つ
 拡張端子32pinピンソケット×1つ


 マイコン「MC9S08QG8」の主なスペックは次のとおりです。

・フラッシュROM:8Kバイト
・RAM:512バイト
・タイマ:2個
・10bitのAD変換入力×8チャンネル
・シリアル入出力機能、PWM出力機能


◆インストール方法

マイコンボードに付属する「Quick Start Guide」を元にプログラムの開発環境を構築します。
ただし、この資料がすべて英語です。英語が苦手な人にはかなり戸惑うと思います。「Quick Start Guide」だけは、WEBサイトに日本語版が用意されているようです。

まずCコンパイラを含む統合開発環境をインストールします。HCS08用とHCS12用のCDROMが入っていすが、このうちHCS12用は使いません。インストールが完了すると、ハードディスク上の“Program Files\Freescale”フォルダに「CodeWarrior Develop Studio Version 5.0 for HC(S)08」が展開されます。ちなみに語尾の「HC(S)08」とは、「HCS08」コアのことです。今回使用しているマイコン「MC9S08QG8」をさらに分類するとHCS08Qファミリに属しています。

 続いて、サービスパック用のCDROMに収録されているCodeWarrior V5.0用のインストーラを実行します。“start_here.htm”を実行後、「CW08 V5.0 Patch 1」を実行します。
CDROMには「CW08 V5.0 LT8 Service Pack」と「CW08 V5.0 LV8 Service Pack」も入っていますが、それらはHCS08Lファミリ用ですのでインストールする必要はありません。その他、CodeWarrior V3.1用のサービスパックも必要ありません。

それから、マイコンボード側に付属する「Axiom」と書かれたCDROMの“Examples”フォルダにあるサンプルプログラムを展開します。サンプルは次の2つです。それぞれ圧縮されていますので、ハードディスク上に展開します。


“DEMO9S08QG8_Test.zip”
簡単な動作テストを行うプログラムです。
スイッチ1(SW1)を押すと、LED1の点灯/消灯が切り替わります。
タイマ割り込みでLED2が点滅します。


“DEMO9S08QG8_APP.zip”
マイコンの機能を一通り確認できるプログラムです。タイマ割り込み、PWM出力、AD変換入力などが行えます。プログラムの操作には「ハイパーターミナル」などの通信ソフトを使います。このため別途シリアルケーブル(ストレート)が必要です。


マイコンボードの接続

では実際に動かしてみます。

 USBケーブルを使って、マイコンボードとパソコンを接続します。パソコン側の対応OSはWindows 98SE/2000/XPです。
パソコン側にマイコンボードを接続した時点で、「新しいハードウェアの検出ウィザード」は立ち上がります。デバイスドライバは「ソフトウェアを自動的にインストールする」を選択することでインストールが行われます。


 マイコンの仕様書は、WEBサイトからダウンロードしました。

http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC9S08QG8.pdf?srch=1

 仕様書にはレジスタの情報が書かれています。これを独自にプログラムを作成するさいに必要になります。
 マイコンボード内でのポートの割り振りについては、次のとおりです。

SW1(スイッチ):PTA2
SW2(スイッチ):PTA3
LED1:PTB6
LED2:PTB7
RV1(可変抵抗):PTA0
RZ1(光センサ):PTA1

詳しくは付属のマニュアルに書かれています(CDROMの“Documents\Board Manuals\DEMO9S09QG8”フォルダに同様のpdfが入っています)。


 ファイル「DEMO9S08QG8_Test.mcp」を開くと、統合開発環境CodeWarrior)が実行されます。
 F5キーを押すと、プログラムのビルドが行われます。プログラムライタが起動しますので、Enterを押してフラッシュROMに書き込みます。
続いて、ソースコードデバッガが起動します。F5キーを押すと、プログラムが実行されます。

 これで、スイッチ1(SW1)を押すとLED1が点灯/消灯するだけの簡単なプログラムが動きます。ソースを見たところ、スイッチ入力はトリガ(立ち下り)による割り込みで検出していました。たとえば、スイッチ1の検出には、PTA2と兼用になっているKBI1P2を使っています。「KBI」は「Key Board Interrupt(キーボード割り込み)」の略です。この割り込みを許可する場合、KBIPE_KBIPE2に1を書き込みます。
 ウインドウを閉じるとデバッグは終了です。

◆デモンストレーション

 ファイル「DEMO9S08QG8_APP.mcp」を開くと、統合開発環境CodeWarrior)が実行されます。
 先のDEMO9S08QG8_Testとは違いこちらは多機能なプログラムになっています。

 プログラムの実行前にあらかじめシリアルケーブル(ストレート)を使い、マイコンボードとパソコンをつないでおきます。マイコンボードにはLCDなどの表示装置はありませんので、このプログラムではシリアル通信でデータの表示/入力を行っています。
 通信ソフトにはWindowsに標準で搭載されている「ハイパーターミナル」を使用しました。通信速度(ボーレート)は4800bps、データ8ビット、パリティなしに設定します。


◆AD変換入力

 AD変換は「アナログ-デジタル変換」のことです。アナログ的な電圧値をデジタルなカウント値に変換します。カウント値の範囲は0〜0x3FF(10ビット)です。
 マイコンボードにはAD変換用としてボリューム(RV1)が搭載されています。ボリュームはADC1P0につながっていますので、AD変換のチャンネル0を入力すればボリュームの位置を検出できることになります。



メニュー画面から「7:ADC test」を選択します。続いて「1:Meas RV1 & RZ1」を選択するとカウント値が表示されます。

Value of RV1」がボリュームのカウント値です。ボリュームを時計方向に回すとカウント値が増えていきます。

 なお、「Value of RZ1」は光センサ(RZ1)によるカウント値です。センサに多く光が当たることでカウント値が下がります。感度が弱めに設定されているせいか、光センサにライトを思いきり近づけないと変化しませんでした。


◆タイマ割り込み

次の操作でタイマ割り込みを発生させることができます。

・「3:MTIM」を選択します。
・「2:Set prescaler」を選択して、プリスケーラ値を「128」に設定します。
・「3:Set modulo」を選択して、moduloを「ff」に設定します。
・「4:Set clock source」を選択して、クロックソースを「XCLK」に設定します。
・「5:Start MTIM」でタイマのスタート。

 これで、マイコンボード上のLED1が約2秒おきに点灯/消灯しました。LED1が点灯→消灯、消灯→点灯に転じた瞬間に割り込みが発生してるということになります。この間隔が早すぎると目で確認できないので、moduloの値を大きくしたのはそのためです。

 では、約2秒という周期がどうやって発生したのか考えてみます。
この設定ではクロックソースであるXCLKが128回発生するとカウンタが1増え、そのカウンタがff(255)に達すると、割り込みが発生します。

XCLKとは「Fixed system clock」の略です。ソースコードによるとXCLKの周波数は16.384kHzとのことでしたので、XCLKの周期は1[秒]÷16384[Hz] = 61.03515625[μ秒]となります。
この値にプリスケーラ値とカウンタ値を掛けます。

XCLK×255×128 = 1.9921875[秒]

、、、結果、約2秒となりました。
これで設定どおりに割り込みが発生していることがわかります。


◆PWM(その1)

 PWM(Pulse Width Modulation)とはパルス幅変調、パルス出力を制御する技術のことです。先ほど紹介したMTIMは割り込み発生時のポート出力によってパルスを作り出していましたが、PWMではこの処理をマイコンが自動的に行います。パルスの周期だけでなく、HighとLowの比率まで設定できます。
 PWM出力用の端子にはTPM1CH0とTPM1CH1の2つがあります。このうちのTPM1CH0にはすでに可変抵抗のRV1が接続されています(PTA0/ADC1P0と兼用)。このため出力するには、RV1のジャンパを外すか、TPM1CH1から出力することになります。

「DEMO9S08QG8_APP」を実行することでPWM出力を行うことができます。
 メニュー画面で「2:TPM PWM setup」を選択。続いて「2:XCLK source」を選択します。この時点でTPM1CH1という端子からパルスが出力されます。

パルスが出力されている確認として、J1コネクタにLEDと抵抗を接続します。J1の23番ピン(TPM1CH1)をLEDのアノード側、J1の3番ピン(GND)をLEDのカソード側に繋ぎます。これでLEDの点滅によって、パルスの発生を目で確認することができます。

ソースコードを確認したところ、TPMMODH/TPMMODL(Timer Counter Modulo Registers)というレジスタに代入してる値は0x03E7。10進数だと999です。
計算すると、XCLK×999 = 60.97412109375[m秒]。1秒間に約16回点滅を繰り返していることになります。

TPMC1SCはPWMのモード設定用のレジスタです。0x24を書き込むことでモードが「Edge-aligned」「Low-true pulses」に設定されます。
「Edge-aligned」はパルスのHigh/Lowを調節できるモードという意味です。
「Low-true pulses」とはカウンタとTPMC1VH/Lを比較して、一緒になった時にHighが出力されるという設定です。逆に「High-true pulses」の場合では、一致した時点でLowが出力されます。


 そして、TPMC1VH/TPMC1VL(Timer Channel Value Registers)に
代入されている値は0x01F4。10進数に変換すると500です。パルス周期の約半分ですので、HighとLowの比率がほぼ同じに調節されたことになります。


 たとえば、1秒周期に点滅(点灯0.5秒、消灯0.5秒)させたい場合には、次のようにプログラムを書き換えればいいわけです。
TPMMODH = 0x40;
TPMMODL = 0x00;
TPMC1SC = 0x24;
TPMC1VH = 0x20;
TPMC1VL = 0x00;

◆PWM(その2)

続いて、PWMを使ってサーボモータを制御する方法を考えてみます。
サーボモータをPWMで動かしたい場合、パルスの標準的な周期は16ms、Highの期間は1.5m±x秒です。

16m秒÷61.03515625μ秒 = 262.144 ≒ 0x106
(16m-1.5m)÷61.03515625μ秒 = 237.568 ≒ 0xED

TPMMODH = 0x01;
TPMMODL = 0x06;
TPMC1SC = 0x24;
TPMC1VH = 0x00;
TPMC1VL = 0xED;

計算しやすくさせるためにパルスの論理を逆にすると次のようになります。

1.5m秒÷61.03515625μ秒 = 24.576 ≒ 0x18

TPMMODH = 0x01;
TPMMODL = 0x06;
TPMC1SC = 0x28;
TPMC1VH = 0x00;
TPMC1VL = 0x18;

これで、サーボモータを0度の位置にするためのパルスが出力されます。
 サーボモータの軸を動かすには、TPMC1VH/Lの値を書き換えてあげればいいわけです。