マイコンを使えるようになるためには、それがどのような仕組みで動くのかを知っておく必要があります。あまり詳しく知らなくてもよいのですが、ある程度は知っておいてからプログラミングの学習を始めると、効率よく理解することができます。
一般的なマイコンのお話に入る前に、QY4Aマイコン の中身を模式的に表した図を以下に示しておきます。後でまた見てください。
◆ 一般的な知識としてのマイコンの中身
一口にマイコンといっても、いろいろあります。 PICマイコン、AVRマイコン、HCS08マイコン、78Kマイコン、MSP430マイコン・・・・・。この 五つは エレキジャックNo.8 で特集が組まれていますので、ぜひ参考にしてみてください。 PIC以外の 各マイコンが一つずつと温度センサ、それにブレッド・ボードが付録で付いています。詳しい説明も読みやすく、非常にお買い得といえるでしょう。
これらのほかによく使われているマイコンとしては、H8、M16C、R8C、8051系、古くからあるZ80系、それからちょっと毛色が違いますが PSoC などがあります。
コンピュータの仕組みを良く理解している人は、各マイコンの仕組みをあらためて説明されなくても、いきなり新しいマイコンを使い始めて大丈夫なはずです。もちろん参考書やデータシート、解説のあるWebサイトなどを見ながら、ということにはなるでしょう。
一方、コンピュータの仕組みを良く知らないという方の場合、いきなりマイコンの使い方から勉強を始めても、予備知識がないためにチンプンカンプン・・・ということになりかねません。 そこで、今回は 「マイコンの仕組み」 についてお話をしようというわけなのです。
下に示したのは、一般化したマイコンの内部要素を模式的に表した図です。先に挙げたいろいろなマイコンは、すべてこの図で表現できます(細かいことを言い出すと、あれがない、これがない、ということになってしまう)。
もっといえば、マウスやキーボード、何らかのディスプレイ装置、あるいはイーサネット・ポートによるネット接続された何かということもあり得ます。この連載で説明している QY4A ではちょっとイーサネットは無理ですが、同じフリースケールの製品である 32ビットの ColdFireマイコンにはイーサネット機能が内蔵されているものもあります。 インターフェース 2008年9月号 の付録にそのマイコン基板が付いていますので、そちらもチャレンジしてみると面白いでしょう。
◆ 一般的なマイコンが動く仕組み
先ほどの図を使って、一般的なマイコンがどのようにして動いているかを説明していきます。動作の要となっているのは CPU ですから、CPU を中心に説明することにします。そうすれば、自然にマイコン全体について説明することになるのです。
まず CPU という言葉ですが、これは Central Processing Unit の略で、中央演算装置と訳されます。これが全体の中で最も重要な位置付けとなっています。しかし、CPU というものを神格化しすぎて、すべての CPU がとてもすごいもののように思っている方もおられるようです。
ずば抜けて性能の良い CPU は確かにすごいものではありますが、そんなに性能がすごくない CPU だって世の中にはたくさんあります。というよりむしろ、性能は低くて値段が安いCPUを使った製品のほうが圧倒的に数が多いのです。 というところで話を戻して、この(そんなにはすごくない)CPU の仕事について見てみましょう。
CPU の仕事は意外に単純で、次のようなものです。
CPUの仕事:
プログラム・メモリから読み取った命令を解釈し、それに従って処理を実行する。
処理の例:
ある場所のデータ1と、ある場所のデータ2を使って何らかの演算をして、その結果を指定された場所に保存する、など。
場所の例:
データ・メモリ、CPU内部のレジスタ、周辺機能レジスタ、など。
演算の例:
足し算、引き算、掛け算、割り算、比較、など。
プログラム・メモリには、命令がたくさん格納されています。別な言い方をすれば、前もってプログラム・メモリには処理したい命令を順番にたくさん格納しておくわけです。 CPUはそれを順番に読み取って、次々に処理をしていきます。
ただ、順番に読み取って実行するだけでは複雑な処理のプログラムが作りにくいので、命令を読み取る位置をある条件に従って ジャンプする命令 が用意されているのが普通です。
◆ 8ビット・マイコンで足し算をする
とても簡単ですが、一般的なマイコンの説明を済ませました。しかしこれだけでは、まだまだイメージがぼやけていて、スッキリしないと思います。もう少し突っ込んだ説明をしておきましょう。そのためには、対象を絞る必要があります。
いわゆるマイコンと呼ばれるものの中で、ホビー・ユーザが使うものとすれば 8ビット・マイコンか 16ビット・マイコンが多いでしょう。ここでは、8ビット・マイコンについて考えてみることにします。先ほどの図において、何が 8ビットなのでしょうか? 実は、その定義は1種類ではありません。歴史的な側面もありますし、各メーカーの商業的な戦略もあり、どれが正しいとは決められないようなのです。ここでは、CPU の内部にある最も汎用性のあるレジスタのビット幅をもって、何ビット・マイコンと呼ぶことにしたいと思います。
先ほどの CPUの仕事 を読み返してみてください。8ビット・マイコンで、数の足し算をする場合を想定します。なお、データ・メモリは 8ビット幅で、その中身には メモリ0 から メモリ127 の 128個の 8ビット・メモリが存在するとしておきます。
4 + 5 の結果をメモリ1 に保存する。
これを、8ビット・マイコンを使って実行する例を考えてみると、次のようになります。あくまで仮想的な例であり、やり方はほかにもいろいろ考えられます。 汎用レジスタというのは CPU の内部にあるデータの保存場所と考えてください。
汎用レジスタ1 に 4 を保存する命令。
汎用レジスタ2 に 5 を保存する命令。
汎用レジスタ1 の内容 と 汎用レジスタ2 の内容 を足して 汎用レジスタ3 に保存する命令。
汎用レジスタ3 の内容を メモリ1 に保存する命令。
このように、四つの命令を使って記述できました。これを実行すると、メモリ1 というところに 9 という数値が格納されます。 さて、ここで問題です。 この 8ビット・マイコンを使って、次の足し算をするにはどうすればよいでしょうか? (10進数で表記している)
444 + 555 の結果をメモリ1 に保存する。
困りましたね。困ったはずです。結果は 999 という数値になるはずですが、メモリは 8ビット幅でしたね。 8ビットの範囲で表現できる数値と言えば、0 から 255 だけなのです。999 という数値は格納できません!
というわけで、連続する 2か所のメモリを使って格納すれば、問題は解決・・・? いえいえ、それだけでは済みません。CPU 内部の汎用レジスタも 8ビット幅でした。じゃあ、汎用レジスタも 2倍の数を使って格納すれば・・・それで済むのでしょうか・・・? 残念でした。 8ビット・マイコンの足し算命令は、普通は 一つの命令で 8ビット同士の足し算しか計算ができません。
じゃあ、いったいどうすれば・・・。落ち着いて考えればわかると思いますが、私たち人間がよく紙に書いて計算する、筆算と同じことをマイコンにやらせるプログラムを組めばよいのです。 ここで 2進数とか 16進数の説明をすると長くなるのでやめておきますが、興味のある方は次の説明を読んでみてください。 予備知識として、16進数の表記では 0 から 15 を 一つの桁で表現したいので、10 から 15 には A から F の文字をあてて、数字として扱います。 末尾に付けた h は、ヘキサ・デシマル( hexadecimal ) つまり 16進数であることを表しています。
少し気になる方向けの解説
444 を 16進数で表すと・・・
444 ÷ 256 = 1 あまり 188
188 ÷ 16 = 11 あまり 12
( 11 は 16進表記で B、 12 は 16進表記で C )
つまり 1BCh となる。
これを 16ビット幅の数値として考え、上位 8ビット 01h と下位 8ビット BCh に分けて取り扱う。555 を 16進数で表すと・・・
555 ÷ 256 = 2 あまり 43
43 ÷ 16 = 2 あまり 11
( 11 は 16進表記で B )
つまり 22Bh となる。
これを 16ビット幅の数値として考え、上位 8ビット 02h と下位 8ビット 2Bh に分けて取り扱う。これらのことから、次のような計算をするプログラムを組めばよいことがわかる(末尾の h は省略)。
01 BC
+) 02 2B
-----------------
03 E7結果の 3E7h は当然、 3 × 256 + 14 × 16 + 7 = 999 となっている。
具体的な命令の列を書くことはしませんが、流れはつかめると思います。もしも繰り上がりがある場合は、足し算命令に繰り上がりを扱う仕組みが用意されているので、問題なく計算ができます。
◆ 無料のメーカー純正 Cコンパイラがあって本当に良かった
こうしてみると、8ビット・マイコンって、なんて非力なんだろう・・・・・と思われるかもしれません。すべての 8ビット・マイコンは 16ビット・マイコンや 32ビット・マイコンに置き換わる日が近いのではないか・・・・・?
いえいえ、そうはならないでしょう。ちょっとした電子機器に組み込む場合を考えてみてください。なんといっても 8ビット・マイコンのほうが価格が安いですし、取り扱う情報のサイズ(ビット幅)が常に 16ビット、32ビットという応用よりも、8ビット以下のほうが圧倒的に数が多いのですから。
それに、当たり前かもしれませんが 8ビット・マイコンでも 16ビット幅や 32ビット幅の計算を簡単にプログラミングすることが可能です。高級言語のおかげで! CodeWarrior for Microcontrollers V6.x Special Edition(無償版) でもCコンパイラが利用可能です。先ほどの例は、C言語なら次のように簡単に記述することができます ( // から右はコメントなのでなくても可)。
int ans; // 答えの領域をメモリ上に確保
ans = 444 + 555; // 計算をして、結果をメモリに格納
または
int a = 444, b = 555, c; // 各変数の領域をメモリ上に確保(a と b は初期化子付き)
c = a + b; // 計算をして、結果をメモリに格納
int というのは整数の意味で、a, b, c, ans は適当に付けた変数の名前です。これらは単なる例ですが、Cのような高級言語で書けば簡単でしょう? アセンブラで書くと、もっと面倒くさいことになってしまうのはご想像のとおりです。実際にはCのような高級言語で記述すると、コンパイラがそれを解釈して、適切なアセンブリ言語の命令の列に変換してくれるのです。本当に便利ですね。
今回の説明では、あまり広い範囲のことがらを述べるには至りませんでしたが、マイコンのプログラムというものが少しは見えてきたのではないでしょうか? 次回はもっと具体的な内容として、QY4Aマイコンの内部レジスタの解説に入る予定です。
『参考文献』
「試しながら学ぶHC08マイコン入門」 (CQ出版)
第1章 マイコン電子工作を始めよう
Appendix E マイコンのプログラムはどうやって起動する?
筆者のホームページ 『マイコン工作の実験室』
組み込みエンジニア KAWANO
