HC08シリーズマイコンMC68HC908QT4を使ったLED点滅器、 だから「キューティーフラッシュ」です。 このアプリケーションは、 いかにコーディングをしないでLEDを点滅させるかを追及したものです。 CodeWarriorのある機能を使うことで、Zeroコーディングを 達成しました。
このアプリケーションのハードウェアは、きわめて簡単です。 マイコンのほかには、抵抗一本、LED一本、3V電源で構成されます。
品名 | 型番 | 個数 | 調達先 |
---|---|---|---|
マイコン | MC68HC908QT4CP | 1 | Freescale |
LED | OSDR5113A | 1 | 秋月電子 |
抵抗 | 100Ω ¼W | 1 | 手持ち在庫 |
電池ボックス | 単3×2本 | 1 | 秋月電子 |
片面ガラスユニバーサル基板 | 72mm×48mm | 1 | 秋月電子 |
ICソケット | 8P | 1 | 手持ち在庫 |
ラッピングソケット | - | 適量 | 手持ち在庫 |
簡単にラッピングでくみ上げました。
プログラムの開発には、CodeWarriorを使います。 ここでは、V5.0を使って説明します。
スタートメニューからCodeWarriorを起動するとCodeWarriorが起動します。 初めてCodeWarriorを起動したときには、 下のような"Startup"ダイアログが出てきますが、 今はこのダイアログは使用しませんので、 をクリックしてダイアログを閉じます。
この後、"Tip of the Day"ダイアログが出てくるかも知れませんが、 これも をクリックして閉じてしまいましょう。
CodeWarriorでは、 一つのプログラムの単位を「プロジェクト」と呼んでいます。 ここでは、新規にプロジェクトを作成します。
メニューから"File → New Project..."を選ぶと、 "HC(S)08 New Project"ダイアログが開きます。 まずは、"Project Paramters"を設定します。
使用する言語に"C"を選び、 プロジェクトを作成する場所を設定します。 この例では、"C:\Projects\CW\qtflash"というディレクトリに "qtflash.mcp"というプロジェクトファイルを作成しています。 設定を終えたら、「次へ」をクリックします。
画面が変わって、"Device and Connection"の設定に移ります。
デバイスには"HC08 → Q Family → MC68HC908QT4"を選び、 デフォルトの接続法には"Full Chip Simulation"を選び、 「次へ」をクリックします。
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"をチェックして 「完了」をクリックすると、新規プロジェクトが出来上がります。
ここから、 プログラムをコーディングする代わりに プロセッサエキスパートのプロパティを設定していきます。
まず、 プログラム可能パルス生成器 (Programmable Pulse Generator: PPG) というブロックの設定をします。 実は、PPGというブロックは、 HC908QT4の仕様書には記載がありません。 このプロセッサエキスパートでは、 具象的なPulse Width Modulation (PWM)ブロックを 抽象的なPPGブロックとして定義しています。
CodeWarriorのウィンドウの中央下には、 "Bean Selector"というサブウィンドウがあります。
PPGを設定するためには、 このウィンドウの "CPU Internal Peirpherals → Timer → PPG"を見つけ出して、 ダブルクリックします。 すると、右側にある"Bean Inspector"というサブウィンドウに PPGの設定項目が現れます。
PPGを呼び出しただけでは、PPGの出力はPTA0に出てきます。 もちろん、PTA0に出しても良いのですが、 PTA0は、MON08の通信線としても使用されるため、 避けておきたいところです。 この例では、PTA1に出力します。
"Bean Inspector"の項目"Output pin"を"PTA1_TCH1_AD1_KBI1"に設定すると、 画面中央上の"Target CPU"の"PTA1"にPPGが移動します。
必須設定項目あるいは問題のある設定には、 マークが現れます。 この例では、二つのマークが 表示されていますので、これらについて設定を行います。
まず、パルス周期を設定します。 "Bean Inspector"の項目"Period"のを クリックすると、パルス周期設定ダイアログが現れます。
このマイコンの場合、設定可能なPPGの周期は、 ダイアログの下の方の"Possible settings:"(可能な設定)の "Possible values:"(可能な値)に 書いてあるように、最大1310.700msです。 ここでは、"Requested value"(要求値)を"1310.7"、 "Units"(単位)を"ms"(ミリ秒)と指定します。 これで、1.3秒周期で点滅する設定になります。 値を書き込んだら、「OK」をクリックします。
次に、パルス幅を設定します。 具体的には、LEDが転倒している時間です。 "Bean Inspector"の項目"Starting Pulse Width"の を クリックすると、パルス幅設定ダイアログが現れます。
このダイアログの使い方は先のパルス周期の設定とまったく同じです。 ここでは、10%デューティにするため、 "131.07ms"を入力しますが、 実際に設定可能な値は、PWMの時間分解能に依存するため、 "131.060ms"または"131.080ms"になります。 この情報は"Possible settings:"の "Closest value"(最も近い値)に書いてあります。
ここで、「OK」をクリックすると、 "Bean Inspector"ウィンドウは、 「131.07msに設定しようとしたけど、実際には131.080msになっているよ」と いう表示になります。
以上で、プロセッサエキスパートの設定は終わりです。 また、一行もコーディングはしていませんが、 プログラム開発も終わりです。
出来上がった、アプリケーションが正しく動作するかを シミュレーションで確認することができます。
画面左側のプロジェクトペインを見てください。
このペインの上のほうには、いくつかのアイコンが並んでいます。 アイコンの左のドロップダウンリストが"Full Chip Simulation"に なっているのを確認して、 アイコンをクリックします。 すると、コード生成、コンパイル、リンクの後にシミュレータが起動してきます。
このシミュレータは、画面上に仮想的なLEDを表示させることができます。 メニューから"Component → Open..."を選ぶと "Open Window Component"(ウィンドウ部品を開く)ダイアログが現れます。
このダイアログから、"Visualizationtool"(視覚化ツール)を選んで 「OK」をクリックすると、 "Visualization Tool"という新しいウィンドウが開きます。
このウィンドウ内で右クリックをすると、 ドロップダウンメニューが現れます。 このメニューから、"Add New Instrument → LED"を選択します。 すると、マウスカーソルの位置に破線の四角形が現れます。 マウスをウィンドウの真ん中でクリックすると、 緑色のLEDが表示されます。
このままでは、LEDはどのデータを表示すればよいのかがわかりません。 これを指定するのがプロパティダイアログです。 LEDの上で右クリックして、 ドロップダウンメニューから"Properties"(属性)を選択すると "Properties of LED"というダイアログが開きます。
ここで設定しなくてはならないのは、 "Port to Display"(表示するポート)と "Bitnumber to display"(表示するビット番号)です。 PPGの出力として指定したのは、"PTA1"端子です。 この端子の状態は、$0000番地の"PTAD"レジスタのビット1を 通じて知ることができます。 このため、 "Port to Display"には、"PTAD"レジスタのアドレス"0x0000"を "Bitnumber to display"には、"1"を指定します。 これで、LEDは、PTA1の状態を表示することが出来るようになりました。
視覚化ツールは、周期的に更新しないと最新の状態の表示になりません。 この更新方法を指定するため、 "visualization Tool"の"LED"の無い部分で右クリックし、 現れたドロップダウンメニューから"Properties"を選択します。
このダイアログでは、"Refresh Mode:"(画面更新モード)を "Periodical"(周期的)に設定します。 すると、"Refresh Mode:"の下に新たに "Refresh Time (100ms):"(画面更新時間)という項目が出現します。 ここでは、すばやい反応を期待するために"1"を設定します。
以上でシミュレーションの準備は完了です。 "True-Time Simulator & Real-Time Debugger"ウィンドウに戻って、 アイコンを クリックすると、シミュレータが動作を始め、 "Visualization Tool"の"LED"が赤と緑で点滅を始めます。
デフォルトの状態では、 "LED"は、0を緑で1を赤で表現しますので、 緑の状態がLEDが点灯している状態に相当します。
さて、いよいよマイコンにプログラムを書き込みます。 この例では、HC08のデータシートにいくつか記述のある モニタモードのうち、"Normal Monitor"モードを使用します。 ハードウェアには、 DEMO908LB8評価ボードを開発ツールとして使用しました。
CodeWarriorのプログラム書き込み機能は、 デバッガやシミュレータと兼用のツールから利用します。
ドロップダウンリストを"Mon08 Interface"に変更して、、 シミュレータを起動したときと同じように、 アイコンをクリックすると コード生成、コンパイル、リンクの後、 デバッガが立ち上がります。
デバッガの初期化が終わると "P&E Connection Manager"(P&E社の接続マネージャ)画面が現れます。 ここでは、MON08インターフェースの設定を行います。
まずは、"Interface Details"(インターフェースの詳細)から設定します。 新規に接続方法を指定するために、 "Add A Connection"(接続を追加する)をクリックすると、 "Interface Selection"(インターフェースの選択)という画面が 現れます。
MON08インターフェースを使用したマイコンへの書き込みでは、 その途中で、何度かリセットをかける必要があります。 この画面では、どのような方法でリセットをかけるかを指定します。
今回は、データシートに記載されたままのハードウェアを使用しますので、 "Class 3 - Custom Board (no ICS) with MON08 serial port circuitry built in" (クラス3-ICS機能の無い独自ボードに MON08シリアルポート回路を組み込んだもの)を 選択します。
次に"Interface Details..."(インターフェースの詳細...)の "Baud Rate"(データ転送速度)を9600に設定します。 ここで指定すべき数値は、データシートに記載があります。
HC08は、モニタモードに入ると中のプログラムなどがすべて 見えてしまいます。 このため、ある鍵コードを与えないとモニタモードに入ることが 出来ないような仕組みになっています。 この画面の右側にある "Security Options"(セキュリティのオプション)では、 モニタモードに入るための鍵コードを指定します。
とは言うものの、使い古しのマイコンを消去してから使いたい場合などは、 鍵コードがわからないので、この機能が障害になってしまいます。 そこで、鍵コードを与えずにモニタモードに入って、 FLASHの全面消去だけを許可する"Ignore Security"(セキュリティ無視)という 方法も用意されています。 この例では、こちらの方法を使用します。
最後に書き込みハードウェアの電源を入れてから "Contact Target These Settings..." (これらの設定でターゲットに接続する) ボタンをクリックすると、 書き込みハードウェアとのやりとりが始まります。
文章を書いていて疑問に思ったのですが、 CodeWarriorの画面では、 "connect"と"contact"という単語が使い分けられています。 どちらも他動詞用法なのですが、 "connect"の方は"connect A and B"「AとBをつなぐ」という意味で、 "contact"の方は"contact A"「Aにつながる」という意味だそうです。 どちらも主語が省略されているのでわかりにくいですね。
先の画面でボタンをクリックすると、 "Power Cycle Dialog"(電源入れなおしダイアログ)という画面が 現れます。
これから先、何度かこの画面が出てきます。 その時には、
という動作を行います。
デバッガの画面が初期化されると "Erase and Program Flash?"(フラッシュを消去、書き込みするか?)という 画面が現れます。
今回は、プログラムの書き込みが目的ですので、 「Yes」をクリックします。 もし、デバッグだけの目的でしたら、 「No」をクリックします。
今度は、"CPROG08SZ Programmer"(CPROG08SZプログラマ)という ウィンドウが現れます。
このプログラムは、 実際にマイコンにプログラムを書き込むためのプログラムで、 CodeWarriorから受け取った情報を基に個々のマイコン独自の設定ファイルと 書き込みプログラムを読み出してプログラムを行います。 このため、CodeWarriorでは、正しいマイコン名を与える必要があります。
しばらくして、 FLASHの消去が終わると、 再び"Power Cycle Dialog"(電源入れなおしダイアログ)という画面が 現れます。
電源を入れなおして「OK」をクリックすると、 FLASHへのプログラムの書き込みが始まります。
書き込みと確認が終わったら、 "CPROG08SZ Programmer"画面は自動的に消滅します。 これで、マイコンへの書き込みは終了です。 マイコンの電源を切ってから、 マイコンを取り外してアプリケーションボードに載せます。
実は、この文書を書いている時にモニタモードに入れない事態が 発生しました。
こんな時には、ウィンドウの下の方にある "Status:"(状態)の のあたりをクリックすると、 なぜモニタモードに入れなかったかという説明を見ることができます。
もちろん、すべて英語なので大変でしょうが、 解決の糸口はつかめると思います。
で、私の場合ですが、 /IRQ(PTA2)端子に与える電圧が不足していたのが原因でした。 普通のモニタモードに入るためには、 この端子に最低でもVDD+2.5[V]の電圧を与えなくては なりません。 私の使っていた書き込みハードウェアでは、 この電圧を定格9Vの006P積層乾電池からツェナーダイオードを使って 作っています。 そのため、この乾電池の電圧がVDD+2.5[V]を下回ると モニタモードへ入れなくなってしまうのです。
同じ乾電池から5.0Vのレギュレータでマイコンへの VDDも作っています。 5.0VのVDDは供給することが出来るので、 マイコン自体は正常に動作しているように見えます。 見つけにくい問題ですね。 乾電池を交換したらプログラムできるようになりました。
アプリケーションボードにマイコンを載せて、電源をつなぐと、 LEDが点滅を始めます。 これで、完成です。
点滅の周期を変えるなどの設定の変更は、 プロセッサエキスパートの属性を変更して書き込むだけです。
このマイコンの場合には、マイコンの制約上、 周期を1.3秒より長くすることは出来ません。 もっと長い周期を手軽に実現するためには、 最近発表された"MC68HC908QT4A"がお勧めです。 このAバージョンは、無印バージョンの機能に加えて、 バスクロックを可変することができるため、 周期を3.2倍長くすることができます。
2006-01-15 発行。