夏休み自由研究〜Freescale HC08マイコンの検討

以前から、子供におもちゃでも作ってやるのに適当な安価で小さいマイコンがないかと探していたが、FreeScaleのHC08で少し遊んでみた

■小型マイコンについて

これまでいろいろなマイコンを使ってみた。以前はZ80を多用していたがこれはRAM、ROM、クロック発振器をつけないと動いてくれず、ちょっとおもちゃを作る感じではなかった。その後出た6303Rは、電源とクリスタルをつけるととりあえず動くので少しの間つかっていた
HD6303Rを使った電子オルゴールの製作
しかしこのマイコンも、ピン数が少ないとはいえ40Pinなので、電子工作としてはかなり大層。その後出た、H8-Tinyもピンが多い
こういうとき、普通の人はPICを使うのだろう。私も、会社でPICの開発キットをこっそり購入し検討したことがあるが、どうも仲良くなれなかった。いろいろとトリッキーな使い方をする必要があるのが、ちょっと肌に合わないかなと感じていた(これはこれで優れたものだと思うし、使いこなしている人が大勢いるのはよく知っているけど)。
そんなわがままをかなえてくれるかどうかわからないけど、Freescale社(旧モトローラ社)のHC08マイコンは、ピンも少ないし、クロックも内蔵しており、Cコンパイラは有名なCodeWarrierが使える(というより傘下に収めてしまっている)ので、以前から気になっていたが、たまたま子供の夏休みの宿題の準備のついでにマルツ無線に立ち寄ったところ、「HC08スターター・ボード・キット Ver.2」が2800円で入手できたので、少し遊んでみることにした。

■Freescale HC08というマイコンについて

Freescale社は、モトローラのマイコン部門が独立してできた会社であり、本MC68HC908マイコンも、かのMC6800の流れを汲むCPUコアを持っている。すなわち、
・最初に、汎用のMC6800が登場した
このリンクを参照 ・その後いろいろなバリエーションが登場するが、アキュームレータを1個に減らして組み込み用にコストダウンをはかったMC6805が登場した
このリンクを参照 このあたりが、HC08(CPU08コア)のご先祖様ということになる。
さらにこのCPUコアに、以下のペリフェラル(MC68HC908QY/QTの場合)が集積されている
・クロック発振器(精度5%程度であれば内蔵発振器だけでOK
・キーボードインタラプトモジュール(6キーまでのキー入力処理機能
・割り込みコントローラ
・オートウェイクアップモジュール(周期的に割り込みをかけCPUを起動する)
・低電圧時インヒビット機能(電源電圧監視機能)
・2CH×16bitタイマ
・6チャンネル×10bitA/D
・I/Oポート
・デバッグ用インターフェース
これだけ入って、8pin/16pinパッケージで、市価200円程度である。さらに、開発環境はANSI準拠のCodeWarriorの無償版が使用可能であるので、普通にC言語での開発が可能である

■開発の実際〜スタータキットの製作

川野亮輔さんが開発されたスタータキットが下記より購入できる
川野氏のショップ たまたま、マルツ無線で2800円で入手できた


このキットは、HC08の評価用ボードとしても、RS232CでPCと接続する書き込み器としても機能し、MC68HC908QY4Aデバイスが1個付属するので、すぐに試すことができる

電池2個をつけて、こんなに手軽な開発環境

■開発の実際〜開発環境の入手

開発には、有名なCodeWarriorを使う。このツールは、以前よりPDAの開発等で使われていたが、なんと開発元のメトロワークス社をFreeScaleが傘下に収めてしまったので、FreeScaleの純正ツールである。下記のリンクよりダウンロードできた
CodeWarriorのダウンロード
なお、複数の版が存在するが、Special Edition版が、機能限定無償版のようで、Evaluation版のような期間限定が無いらしい
インストールを実行する。
(1)プロジェクトの新規作成

プロジェクトの新規作成を行う。デバイス名は実際に使用するデバイス名を選択する。接続は、このスタータキットを書き込み器として使う場合は、「Mon08」を選択する
言語とプロジェクト名を設定する
ここで、[Device Initialization]を選択すると、初期化コードを生成するツールが出てくる。今回は初期化無し(自分で初期化コードを書く)とする
メモリモデルとしてTinyを選ぶと変数がゼロページ(64Byte)に確保され、高速で小さなコードが生成されるのではないかと思われる
その他はデフォルトでOKと思われる
(2)デモプログラムの組み込み
川野さんのWebサイトにある、LEDをPWMで点灯するプログラムを利用させていただく。(1)で作ったプロジェクトのmain.cを、川野氏のページにあるコードで置き換える

このままだと、日本語フォントが化けているので、[Edit]/[Preferrence]メニューで日本語系のフォント(MSゴシックとか)に変更する
(3)make
[Project]/[make]メニューでビルドを実行する。
(4)書き込み
[Project]/[debug]メニューで書き込み画面が出てくる。

9600Bpsに設定すると、PCと通信を行って書き込みが行われる
こうして書き込んだ状態では、評価ボード上の可変抵抗の電圧をA/Dで読み取り、電圧に比例したデューティでLEDを点灯するデモを行っていた
■注意
・書き込み時のジャンパ設定はデフォルトにする必要がある。そうでないと、送受信信号が接続されなかったり、CPUに9MHzのクロックが供給されなかったり(9600Bpsの伝送にはこれが必要)する

■感想

MC6800系ということで、ソフトを各立場では安心して使え、クセが無い。ちょっとしたロボット等を作るのにはよいのではないか。あまり知られていないが、小規模組み込み用途でPICより便利に使える、優れたマイコンだと感じた

■LED点滅器の製作

クリスマスなので、簡単なLED点滅器を作ってみた

8ピンのMC68HC908QT1CPに簡単なプログラムを書いて、LED4個と電池2本で超簡単なLEDチカチカマシンを作ってみた
中枢部はこれだけ

回路は、PortPA0,1,3,4にLEDをつなぎ、抵抗を介してプルアップしただけ
メインのソースはこれだけ
#include /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
void main(void) {
int x,y,z,r0,r1,r2,r3,r4,rr;
EnableInterrupts; /* enable interrupts */
/* include your code here */
PTAPUE = 0x08;
DDRA = 0xFF;
r0 = 6;
r1 = 1;
r2 = 4;
r3 = 8;
r4 = 2;

for(;;) {
for(z = 0;z < 8;z++) {
/* wait */
for(x = 0;x < 5000;x++) {
__RESET_WATCHDOG(); /* feeds the dog */
for(y = 0;y < 10;y++);
}

/* M-random */
rr = r4;
r4 = r0 ^ r2;
r0 = r1;
r1 = r2;
r2 = r3;
r3 = rr; /*old r4*/

/*LED drive*/
PTA_PTA0 = r4 & 1;
PTA_PTA1 = (r4 >> 1) & 1;
PTA_PTA3 = (r4 >> 2) & 1;
PTA_PTA4 = (r4 >> 3) & 1;

}
} /* loop forever */
/* please make sure that you never leave main */
}
4次のM系列ノイズ発生アルゴリズムである。最初に変数R0-R4を初期化しておき、0.5秒周期ぐらいで、M系列ノイズを発生させながら、各ビットの状態をPA1,2,3,4に出力しているだけである。

「この程度の装置でマイコン使うなんてもったいない」と言われそうですが、この程度の装置をマイコン使わないで作ったら、けっこうな部品点数になってしまう。また、C言語で普通にコーディングが可能なので、こんな使い方でも元が取れてしまいそうである

このデバイスについていたマルツ無線のラベル。細かなスペックを記載してくれているので買うとき迷わなくて済むのでありがたいのですが、A/Dが16Bit2CHになっているのはドキドキしてしまいました(これはタイマのスペックですね)。シリアルのスペルもご愛嬌です
ホームページに戻る