[はじめに]
78K0および78K0Sは組み込み用途の8ビットMCU(マイコン)です。その特徴は使い易さ、特にプログラムの作り易さにあります。最近のAll Flash化や安価な開発環境の提供により、少量多品種への対応もより簡単になってきています。
ここでは、その機能の特徴について組み込み用途の観点で説明します。
[78K0と78K0Sの差異]
78K0Sは基本的なアーキテクチャについては78K0とほぼ同じです。しかし、いくつかの機能が削除され、78K0のサブセットの位置付けになっています。
そのため、レジスタ・バンク機能が削除されており、これに関連したレジスタ・バンクの設定命令を含めて一部の命令が削除されています。これに関連して、78K0ではメモリマップの高速RAM上に配置されていたレジスタがメモリマップからはなくなり、高速RAMはすべてメモリとして使用できるようになっています。
この点を除くと以下の説明は78K0及び78K0Sで共通となります。以下、特に断らない限りは78K0の部分は78K0Sも含めて考えて下さい。
[78K0での組み込み対応の基本的な考え方]
基本的な考え方としては、できるだけ内蔵ハードウェアでの対応を行なうことで、外部の回路を少なくし、ソフトウェア作成の負担を軽くすると共に、わかり易いソフトウェアが簡単に組めることを目指しています。
このため、78K0は組み込み用途に必要なポート、割り込み、タイマ、シリアル・インタフェース、A/Dコンバータなど代表的な機能をハードウェア(内蔵周辺機能)として搭載し、それらのハードウェアを簡単に制御できるような命令をもっています。All Flash化においては、POC(パワーオンクリア)、高速内蔵発振器を搭載し、ウォッチドッグ・タイマも機能強化されており、より低コストでのシステムの構築ができるようになってきています。
[78K0のアーキテクチャ/命令の特徴](一部78K0Sには含まれず)
78K0での一般的な演算は基本的にアキュムレータを介して実行するようになっています。また、データ転送も基本的にはアキュムレータを介する必要があります。(ここらは演算処理中心のMPUよりは劣ります。)しかしながら、組み込み用途で周辺の制御に用いる内蔵周辺機能はSFR領域と呼ばれる領域に配置されており、この領域はアキュムレータを介することなく直接アクセスすることが可能です。
また、ポート等をビット単位で直接操作することもできます。これ以外にも、割り込み処理を効率化するためのレジスタ・バンクなどの機能を搭載しています。
これらの特長により、組み込み用途では効率的なプログラミングが可能になっています。
以下では、その詳細を説明します。
[SFR領域]
この領域は、内蔵周辺機能を配置する専用の領域です。この領域に対しては、直接周辺機能を指定して値を設定することができます。例えば、ポート1に55Hの値を出力するには以下のように直感的に理解可能な記述となります(()内はC言語記述の場合)。
MOV P1,#55H
(P1 = 0x55;)
また、ポート1のビット0の出力を1から0にクリアしたい場合や0から1にセットしたい場合には以下のようにビット操作命令で簡単に記述可能です。
CLR1 P1.0 ; ポート1のビット0をクリア
(P1.0 = 0;)
SET1 P1.0 ; ポート1のビット0をセット
(P1.0 = 1;)
さらに、ポートからの入力をチェックしたい場合には、条件付分岐命令を用いて、以下のような記述が可能です。
BF P0.1,$$
(while(P0.1==0);)
この場合には、ポート0のビット1が0(False)ならば自分自身に分岐します。つまり、ポート0のビット1が1になるのを待つ処理となります。
このように、内蔵周辺機能をSFR領域に配置することで、アドレスやレジスタなどを意識することなく外部の信号の制御が可能になります。
[saddr領域]
78K0で効率的にプログラムを作成できるように準備されたメモリ領域としてsaddr領域と呼ばれる領域があります。これは、メモリのアドレスを指定するための専用のポインタを用いること無しに直接アクセスできる256バイトの領域です。このうち、0FE20H〜0FEDFH(78K0Sでは0FEFFH)のRAMをレジスタとほぼ同じように使うことができます。例えば、以下のように16ビットの変数WORK0と8ビットの変数WORK1,WORK2定義すると、
WORK00 DSEG SADDRP ; 16ビット変数領域
WORK0: DS 2
WORK01 DSEG SADDR ; 8ビット変数領域
WORK1: DS 1
WORK2: DS 1
これらの変数は以下のようにレジスタの代わりに使うことができます。
MOVW WORK0,#1234H ; 16ビットの値の設定
XCH AX,WORK0 ; 16ビットデータの交換
MOV WORK1,#33H ; 8ビットの値の設定
DEC WORK1 ; 8ビットの減算
SET1 WORK2.0 ; ビットのセット
CLR1 WORK2.1 ; ビットのクリア
BT WORK2.3,$LOOP ; ビットのチェック
さらに、ループカウンタとして以下のような使い方もできます。
DBNZ WORK1,$LOOP ;
内蔵メモリの区分についてはFAQの
マイコン内蔵メモリの特徴と使い方[78K0、78K0S]も参照下さい。
[ビット操作]
78K0が組み込み用途に対応して内蔵している機能の一つにビット操作命令があります。これにより、組み込み用途で頻繁に使用される1ビットのデータを効率的に処理することができます。
78K0のデータアクセスは基本的にリード・モディファイ・ライトとなります。この機能を使うことで、内蔵周辺機能を特別なハードウェア構成にすることなしにビット操作を行なえます。
コーヒブレーク
78K0のデータ・アクセス・サイクルは以下の部分が必要に応じて組み合わされます。データ・リードの場合には と の組み合わせとなり、 で指定したアドレスのデータを で読み出します。データ・ライトの場合には と の組み合わせとなり、 で指定したアドレスに対して、 でデータを書き込みます。
ビット操作では、 〜 の全てを組み合わせます。 で対象のアドレスを指定し、 でそのアドレスのデータを読み出します。読み出したデータに演算を行ない、 で同じアドレスに書き戻します。
アドレス指定
データ読み出し
データ書込み |
[レジスタ・バンク](78K0のみ)
78K0では割り込み処理の効率化のために汎用レジスタを4組内蔵しています。これを必要に応じて切り替えることで、割り込み処理で必要なレジスタの退避と復帰処理を簡素化できます。
例えば、メイン処理ではレジスタ・バンク0を使用し、割り込みではレジスタ・バンク1を使用するとします。この場合に、割り込み処理の最初で、レジスタ・バンク1を選択します。すると、使用されるレジスタがメイン処理で使用していたバンク0からバンク1に切り替わるので、レジスタの内容の破壊を気にすることなくプログラミングできます。割り込み処理が終了し、RETI命令で割り込みを終了すると、PSWレジスタが元の状態に戻るので、メイン処理はレジスタ・バンク0で処理を継続します。
このように、レジスタ・バンクを使用することで割り込み処理を簡単にできます。
[スタンバイ]
組み込み用途ではその消費電力が重要なファクタとなることから、78K0にはHALTモードやSTOPモードのような省電力機能が内蔵されています。スタンバイ機能については、FAQの
スタンバイ動作を参照下さい。
また、スタンバイの割り込みによる解除でも、CPUを割り込み禁止に設定することで、ベクタ割り込み処理を行なわないでスタンバイの解除だけを行なうことができ、HALTモードと組み合わせることで、割り込み応答の高速化ができます。
(2006/09)