(57)【特許請求の範囲】
【請求項１】
所定のアドレスに配置され、このアドレスを指定することでＣＰＵによるアクセスが可能なレジスタと、前記ＣＰＵにより前記レジスタに書き込まれた値を該レジスタの各ビットにそれぞれ対応する複数の信号線を介してデジタル信号として出力するための出力ポートとを備えるマイクロコンピュータ用出力装置において、
それぞれ異なるアドレスに配置された所定のビット幅を持つ複数の前記レジスタを備え、
前記出力ポートの各信号線は、それぞれ異なる論理和回路の出力部と接続されており、
前記論理和回路の入力部は、前記各レジスタにおける同一ビット番号の出力部と接続されており、
前記各レジスタは、前記ＣＰＵが１つの前記出力ポートを共有する複数のルーチンを実行する際に、各ルーチンによってそれぞれ別のアドレスに配置された前記レジスタにアクセスされること
を特徴とするマイクロコンピュータ用出力装置。
【請求項２】
請求項１に記載のマイクロコンピュータ用出力装置において、
前記それぞれ異なるアドレスに配置されたレジスタのビット幅は、すべて同一であること
を特徴とするマイクロコンピュータ用出力装置。
【請求項３】
請求項１または２に記載のマイクロコンピュータ用出力装置において、
前記出力ポートの各信号線は、チップのそれぞれ異なるピンに接続されていること
を特徴とするマイクロコンピュータ用出力装置。
【請求項４】
請求項１〜３のいずれかに記載のマイクロコンピュータ用出力装置と、
該出力装置の前記レジスタに書き込み可能なＣＰＵとを備えること
を特徴とするマイクロコンピュータ。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
マイクロコンピュータ用出力装置及び当該出力装置を備えたマイクロコンピュータに関する。
【０００２】
【従来の技術】
従来から、ＣＰＵの制御に応じて周辺回路にデジタル信号を出力するためのマイクロコンピュータ用出力装置が知られている。これらの出力装置は、ＣＰＵの所定のアドレスにマップされたレジスタから構成されており、ＣＰＵがそのアドレスにデータを出力した際に、その出力されたデータをラッチし、ラッチしたデータを周辺回路に出力する。また、レジスタがラッチしたデータは、ＣＰＵの制御によってＣＰＵ内部の汎用レジスタ等に読み込むことができる。
【０００３】
このような出力装置では、１つのアドレスに、複数のビットからなるレジスタを備えるのが一般的である。特に、汎用のワンチップマイコンでは、レジスタを所定のビット幅（例えば８ビット幅）に固定し、そのビット幅を持つレジスタの出力信号線を、チップの内部または外部の周辺回路と接続可能な出力ポートとして用意するのが一般的である。
【０００４】
例えば、８ビット幅の出力ポートに周辺回路を接続する場合には、８ビット全体を使ってパラレル出力装置などを周辺回路として接続することができる。また、８ビット幅の出力ポートの一部を使って、種々の周辺装置を駆動するための周辺回路を接続することもできる。例えば８ビット中４ビットを使って７セグメントＬＥＤを制御するような場合である。また、８ビット幅の出力ポートの中から１ビットのみを使って、例えばランプの点灯などを制御することもできる。
【０００５】
このように出力ポートの信号線を介して制御対象の回路と接続されたレジスタの各ビットに、ＣＰＵが値（データ）を書き込むことで、制御対象を制御することができる。つまり、ＣＰＵは、所定のアドレスの所定のビットに値を書き込むことで、その書き込んだ値に対応するデジタル信号を、その所定のビットに対応する周辺回路に対して出力することができる。
【０００６】
これらの出力装置の一例を図４を参照して説明する。
図４は、従来のメモリマップドＩ／Ｏ方式のマイクロコンピュータ用出力装置の構成例である。この出力装置は、図示しないＣＰＵと共に１つのマイコンチップに集積されている。そして、この出力装置は、ＣＰＵのメモリ空間の複数のアドレス上に８ビット幅のレジスタを備えている。また、各レジスタの各ビットの出力は、マイコンチップの異なるピン（出力端子）にそれぞれ接続されており、これらのピンにはチップ外部の様々な周辺回路を接続することができる。
【０００７】
図４のレジスタＡは、ビット０からビット７の８ビット幅のレジスタであり、ＣＰＵのメモリ空間の０ｘＦＦＦＦＦＡ００番地にマップされている。なお、「０ｘ」は０ｘより後ろの数値が１６進数であることを示し、「０ｂ」は、０ｂより後ろの数値が２進数であることを示す。レジスタＢはレジスタＡと同様の構成であり、０ｘＦＦＦＦＦＡ０１番地にマップされている。また、レジスタＣ、レジスタＤ、・・・、レジスタＸとそれぞれ異なるアドレスにマップされた図示しない複数のレジスタを備えている。
【０００８】
そして、各レジスタの各ビットの出力は、マイコンチップのピンにそれぞれ接続されている。つまり、レジスタＡのビット０は１ピン、ビット１は２ピン、ビット２は３ピン、ビット３は４ピン、ビット４は５ピン、ビット５は６ピン、ビット６は７ピン、ビット７は８ピンに接続されている。また、レジスタＢのビット０は９ピン、ビット１は１０ピン、ビット２は１１ピン、ビット３は１２ピン、ビット４は１３ピン、ビット５は１４ピン、ビット６は１５ピン、ビット７は１６ピンに接続されている。なお、その他のレジスタの各ビットの出力も順に異なるピンに接続されており、各レジスタに対応する複数の出力ポートを構成している。図４では、１〜８ピンである出力ポートＡ、９〜１６ピンである出力ポートＢの２つの出力ポートを図示している。
【０００９】
このような構成によれば、例えば、ＣＰＵが０ｘＦＦＦＦＦＡ００番地に０ｂ１１１１１１１１を書き込めば、マイコンチップの１ピンから８ピン（出力ポートＡの各ピン）はすべてＨｉレベルとなり、０ｘＦＦＦＦＦＡ００番地に０ｂ００００００００を出力すれば、出力ポートＡの各ピンはすべてＬｏｗレベルとなる。
【００１０】
このようにＣＰＵは、各ピンを介して接続された周辺回路を制御することができる。また、各レジスタにラッチされたデータはＣＰＵが読み出すこともできる。例えば、ＣＰＵが０ｘＦＦＦＦＦＡ００番地に０ｂ１０１０１０１０を書き込んだ後に、０ｘＦＦＦＦＦＡ００番地のデータをＣＰＵの汎用レジスタに読み込めば、その汎用レジスタの値はレジスタＡの値である０ｂ１０１０１０１０となる。
【００１１】
レジスタへの書き込みの際には、ビット０からビット７を同時に書き換えてもよいが、ＣＰＵがアドレス上の特定のビットを直接制御できるタイプのものであれば、レジスタ上の特定の１ビットのみを変更することもできる。例えば、８ピンにＬＥＤが接続されているとすれば、このＬＥＤを点灯させるためにＣＰＵは、０ｘＦＦＦＦＦＡ００番地のビット７のみを０から１に書き換えればよい。すると８ピンの電圧レベルが、例えばＬｏｗレベルからＨｉレベルに変化し、ＬＥＤを消灯状態から点灯状態に変化させることができる。
【００１２】
【発明が解決しようとする課題】
しかしながら、例えば一般的なＲＩＳＣを採用したＣＰＵのように、ＣＰＵのアドレス上に配置されたレジスタの特定のビットを直接制御できないＣＰＵがある。このようなＣＰＵで、そのレジスタの特定のビットに値を書き込むためには、▲１▼ＣＰＵの汎用レジスタ上へそのアドレスのレジスタの値を読み込み（リード）、▲２▼ＣＰＵの汎用レジスタ上でそのビットを変更し（モディファイ）、▲３▼ＣＰＵの汎用レジスタの値をそのアドレスのレジスタへ書き込む（ライト）といったリード・モディファイ・ライトの操作が必要となる。
【００１３】
このとき、複数の処理ルーチンが同一のレジスタにデータを書き込むと、タイミング多重アクセスが発生することになり、出力に異常が発生することがある。
この一例を図５を参照して説明する。
図５は、レジスタの多重アクセスによる出力異常の例である。
【００１４】
図５のレジスタＡは前述の図４のレジスタＡに相当する。図４の１ピンにはランプ、２ピンにはソレノイド１、４ピンにはヒータ１、５ピンにはヒータ２、６ピンにはソレノイド２、７ピンにはソレノイド３、８ピンにはソレノイド４を駆動する駆動回路が周辺回路として接続されている。なお２ピンは未使用である。よって、図５に示すようにレジスタＡはビット０がランプ、ビット１がソレノイド１、ビット３がヒータ１、ビット４がヒータ２、ビット５がソレノイド２、ビット６がソレノイド３、ビット７がソレノイド４用のビットとなる。なお、３ピンは未使用となる。
【００１５】
これらの制御対象の装置のうちソレノイド１〜ソレノイド４は必ず４ｍｓ毎に駆動する必要があるが、ランプ、ヒータ１、ヒータ２は特に時間要求等はない。そこで、ＣＰＵによるレジスタＡの制御は、プライオリティが相対的に低いベースルーチンと、プライオリティが相対的に高いタイマ割込みルーチンの２つのルーチンの実行によって行われる。ベースルーチンは、ランプ、ヒータ１、ヒータ２の各ビットにアクセスし、タイマ割込みルーチンはソレノイド１、ソレノイド２、ソレノイド３、ソレノイド４の各ビットにアクセスする。タイマ割込みの時間は４ｍｓとする。
【００１６】
レジスタＡにアクセスするＣＰＵは、一般的なＲＩＳＣを採用したＣＰＵであり、レジスタの特定のビットを直接操作することができないタイプのものである。よって、各ルーチンにおいてレジスタＡに書き込む際には、前述のリード・モディファイ・ライトの操作を行う必要がある。
【００１７】
図５の例は、ベースルーチンＳ１、Ｓ２、Ｓ３でリード・モディファイ・ライトの操作によってランプをＯＮにする処理を行っている最中に、タイマ割込みが発生し、タイマ割込みルーチンに処理が移行する場合の処理を示すものである。なお、タイマ割込みルーチンでは、Ｓ１１、Ｓ１２、Ｓ１３によって、ソレノイド１をＯＮにする処理を行う。
【００１８】
以下に、この時のＣＰＵの動作、ＣＰＵの汎用レジスタの値、レジスタＡの値を説明する。なお、レジスタＡの初期値は０ｂ００００００００であり、すべての装置はＯＦＦ状態である。また、以下、「汎用レジスタ」はＣＰＵの汎用レジスタを示す。また、図５において右側の縦一列のレジスタはＣＰＵの汎用レジスタの値を表し、左側の縦一列のレジスタはレジスタＡの値を示したものである。
【００１９】
Ｓ１では、レジスタＡの値を汎用レジスタへリードする。よって、汎用レジスタの値は０ｂ００００００００となる。
Ｓ２では、汎用レジスタのランプのビットを１にする。つまり、ビット０の値を１へモディファイする。よって、汎用レジスタの値は０ｂ０００００００１となる。
【００２０】
ここで、タイマ割込みが発生すると、ＣＰＵでの処理は、ベースルーチンから割込みルーチンへ移行する。この割込みルーチンでは汎用レジスタの値を退避して、Ｓ１１〜Ｓ１３の処理を行う。
Ｓ１１では、レジスタＡの値を汎用レジスタへリードする。このとき、レジスタＡの値は、０ｂ００００００００のままであるため、リードした汎用レジスタの値も０ｂ００００００００となる。
【００２１】
Ｓ１２では、汎用レジスタのソレノイド１のビットを１にする。つまり、ビット１を１へモディファイする。よって、汎用レジスタの値は、０ｂ００００００１０となる。
Ｓ１３では、汎用レジスタの値をレジスタＡへライトする。このライトによって、レジスタＡの値は０ｂ００００００１０となり、２ピンがＨｉレベルとなって、ソレノイド１がＯＮになる。
【００２２】
続いて割込みルーチンからベースルーチンに復帰するために、退避した汎用レジスタの値を復帰する。復帰した汎用レジスタの値はＳ２での値となり０ｂ０００００００１となる。そして、処理はベースルーチンへ復帰する。
Ｓ３では、汎用レジスタの値をレジスタＡへライトする。汎用レジスタの値は０ｂ０００００００１であるので、レジスタＡの値は０ｂ０００００００１となる。よって、１ピンがＨｉレベルとなりランプがＯＮになると同時に、２ピンがＬｏｗレベルとなりソレノイド１がＯＦＦとなる。
【００２３】
そのため、タイマ割込みルーチンでソレノイド１をＯＮにしたはずが、Ｓ３でＯＦＦになってしまうという問題が発生する。正しくは、レジスタの値が０ｂ００００００１１となり、ソレノイド１とランプは共にＯＮになるはずだからである。なお、このような問題はＳ１の直後にタイマ割込みが発生した場合にも、同様に発生する。
【００２４】
この問題を回避するためには、ベースルーチンとタイマ割込みルーチンがアクセスするレジスタを別のレジスタにすればよい。例えば、レジスタＡをベースルーチン用、レジスタＢをタイマ割込みルーチン用とする。このようにすれば、上述の問題は起こらない。しかし、マイコンチップのピンの利用効率が悪くなるという問題がある。また、マイコンチップのピン数の制限によりこのような配置ができないことが多い。例えば、レジスタＡをベースルーチン用、レジスタＢをタイマ割込みルーチン用とした場合、ベースルーチン用に使用されるビットはレジスタＡのランプ、ヒータ１、ヒータ２に対応する３ビットのみであり、タイマ割込みルーチンに使用されるビットは、ソレノイド１〜４の４ビットのみである。よって、レジスタＡ、レジスタＢからの出力端子である１ピンから１６ピンの１６本のピンの中で使用されるピンはわずか７本となり、ピンの利用効率が悪くなる。また、そもそもレジスタが１つしかない出力装置ではこのようなことはできない。
【００２５】
よって、通常は、実行レベル毎に１つの出力ポートを占有できない場合が多く、多重アクセスが発生する場合でも１つのポートに複数の実行レベルから制御される装置を割り当てざるを得ない。
そこで、以上のような多重アクセスの問題を回避するために、リード・モディファイ・ライトの期間中、割込みを禁止してレジスタへのアクセスを排他制御する方法がある。この回避方法について図６を参照して説明する。
【００２６】
図６は、図５における問題点を解決するために、図５の処理にソフトウェアの割込み禁止・割込み解除による対策を行った例である。
図５の処理との相違点は、図５のベースルーチンの処理期間（Ｓ１、Ｓ２、Ｓ３）中の割込みを禁止することと、タイマ割込みルーチンの処理期間（Ｓ１１、Ｓ１２、Ｓ１３）中の割込みを禁止することである。
【００２７】
以下、図６を参照して図５を参照して説明した多重アクセスの問題が発生しないことを確認する。
図６のレジスタＡの構成、レジスタＡの初期値、各ルーチンでの制御対象、各レジスタの値の示し方等は図５と同様である。
【００２８】
Ｓ２０では、割込み禁止を掛ける（ＤＩ）。
Ｓ２１では、レジスタＡの値を汎用レジスタへリードする。よって、汎用レジスタの値は０ｂ００００００００となる。
Ｓ２２では、汎用レジスタのランプのビットを１にする。つまり、汎用レジスタのビット０の値を１へモディファイする。よって、汎用レジスタの値は０ｂ０００００００１となる。
【００２９】
ここで、タイマ割込みが発生する。しかし、割込み禁止状態のため、割込み禁止が解除されるまでタイマ割込みルーチンの実行は保留される。よって、中断されることなくベースルーチンの処理は続行される。
Ｓ２３では、汎用レジスタの値をレジスタＡへライトする。汎用レジスタの値は０ｂ０００００００１であるので、レジスタＡの値は０ｂ０００００００１となり、ランプがＯＮになる。
【００３０】
Ｓ２４では、割込み禁止を解除する（ＥＩ）。
ここで割込み禁止が解除されたことにより、ＣＰＵでの処理はタイマ割込みルーチンに移行する。
この割込みルーチンでは汎用レジスタの値を退避して、Ｓ３０〜Ｓ３４の処理を行う。
【００３１】
Ｓ３０では、割込み禁止を掛ける（ＤＩ）。
Ｓ３１では、レジスタＡの値を汎用レジスタへリードする。このとき、レジスタＡの値は、０ｂ０００００００１であるため、リードした汎用レジスタの値も０ｂ０００００００１となる。
【００３２】
Ｓ３２では、汎用レジスタのソレノイド１のビットを１にする。つまり、汎用レジスタのビット１を１へモディファイする。よって、汎用レジスタの値は０ｂ００００００１１になる。
Ｓ３３では、汎用レジスタの値をレジスタＡへライトする。このライトによって、ソレノイド１がＯＮになる。レジスタＡにライトされた値は、０ｂ００００００１１となるので、ランプもＯＮのままとなり、正しい動作が行われていることが分かる。
【００３３】
Ｓ３４では割込み禁止を解除する。よって、割込み禁止が解除された際のレジスタＡの値は、Ｓ３３での値のままである。そのため、最終的にランプとソレノイドが共にＯＮ状態であり、正しい動作が行われていることが分かる。
このようにリード・モディファイ・ライトの期間中の割込みを禁止し、レジスタへのアクセスを排他制御することによって、前述の多重アクセスの問題を防ぐことができる。
【００３４】
なお、タイマー割込みルーチンのＳ３０及びＳ３４の割込み禁止／解除命令は、この例の範囲内であれば無くても構わない。しかし、将来の拡張・変更や、割込み禁止／解除命令が正しく挿入されているかのチェックを容易にする目的で挿入しておくのが一般的である。例えば、将来、図４の３ピンに新たな制御対象を接続し、レジスタＡの未使用ビットであるビット２を最上位の割込みルーチンから制御するように割り当てる場合などには、Ｓ３０及びＳ３４の割込み禁止／解除命令が必要となるからである。また、書き込み箇所で一律に割込み禁止とすることで、割込み禁止／解除命令を挿入し忘れているのか、それとも割込み禁止／解除命令が必要ない箇所なのかをチェックする必要がなくなり、チェックが容易になるからである。
【００３５】
以上のような対策を行う場合には、割り込み禁止／解除の命令をレジスタへの書き込み処理毎に挿入する必要がある。
そのため、割り込み禁止／解除の命令を追加する分、オブジェクトコードのサイズが増大する。そして、オブジェクトコードのサイズが増大すると、それを格納するためのＲＯＭやＲＡＭなどのメモリサイズが増大しコストが上昇する。
【００３６】
また、割込み禁止、割込み解除の命令を実行するためには所定の時間を要するため、処理時間も増加する。図７に、図６の割込み禁止／解除命令を挿入する場合と、図５の割込み禁止／解除命令を挿入しない場合の実行時間の違いを示す。図７の（ａ）は、前述の図５の割込み禁止／解除命令を挿入しない場合（対策前）の実行時間を示す図である。一方、図７の（ｂ）は、前述の図６の割込み禁止／解除命令を挿入した場合（対策後）の実行時間を示す図である。この図に示すように、（ｂ）の対策後の実行時間は（ａ）の対策前の実行時間に比べ、Ｓ２０、Ｓ２４とＳ３０、Ｓ３４の割り込み禁止／解除命令の実行時間分だけ余分に実行時間を必要とする。
【００３７】
このようなオブジェクトコードサイズの増加、処理時間の増加は、例えば制御用のマイクロコンピュータ等では、無視できない場合がある。なぜなら、これらのマイクロコンピュータ等での処理においては、機器を制御するためにアドレス空間に配置されたレジスタへのアクセスが頻繁に発生するからである。そのため、割り込み禁止／解除の命令を随所に挿入する必要があり、また追加した命令は頻繁に実行されることとなる。
【００３８】
さらに、この様にソフトウェアによる対策を実施した場合、１カ所でもその対策もれがあるとレジスタへのアクセスの排他制御がされなくなるため、ソフトウェアを変更するたびに、割込み禁止／解除命令が適切に挿入されているかをチェックをする必要が生じる。そして、その作業工数がこれらのレジスタへの書き込み箇所の数に比例して増大するという問題が発生する。
【００３９】
そこで本発明は、ソフトウェアによる排他制御を必要としないマイクロコンピュータ用出力装置を提供することを目的とする。
【００４０】
【課題を解決するための手段及び発明の効果】
上述した問題点を解決するためになされた請求項１に記載のマイクロコンピュータ用出力装置は、所定のアドレスに配置され、このアドレスを指定することでＣＰＵによるアクセスが可能なレジスタと、ＣＰＵによりレジスタに書き込まれた値を該レジスタの各ビットにそれぞれ対応する複数の信号線を介してデジタル信号として出力する出力ポートとを備えている。そして、出力ポートの各信号線はそれぞれ異なる論理和回路の出力部と接続されている。
【００４１】
一方、この１つの論理和回路には、複数の入力部があり、これらの入力部は、それぞれ異なるアドレスに配置された所定のビット幅を持つレジスタの同一ビット番号の出力部と接続されている。そして、それぞれの論理和回路の入力部はすべてこのように構成されている。さらに、各レジスタは、ＣＰＵが１つの出力ポートを共有する複数のルーチンを実行する際に、各ルーチンによってそれぞれ別のアドレスに配置されたレジスタにアクセスされる。
【００４２】
なお、アドレスに配置されたレジスタとは、例えばＣＰＵなどの制御装置がアドレスを指定してアクセス可能なレジスタを意味する。また、論理和回路とは、複数の入力信号の論理和を取り、その論理和を取った信号を出力するものであればどのようなものでもよい。例えば、ワイヤードＯＲ回路でもよい。
【００４３】
このような構成によれば、例えば、ＣＰＵが異なるアドレスのいずれか１つのレジスタ上のビットの値を１にすることで、論理和回路を介して出力される出力ポートの信号線の値を１にすることができる。
よって、前述のよう多重アクセスが発生する場合には、多重アクセスの発生する各ルーチンがそれぞれ別のアドレスに配置されたレジスタにアクセスすれば、多重アクセスは発生しない。しかも、前述の論理和回路によって、常に各レジスタの値の論理和を取った値が出力ポートに出力される。そのため、ソフトウェアによる割込み禁止／解除の対策を行わなくても、期待通りの値が出力ポートに出力される。
【００４４】
よって、割込み禁止／解除命令を追加する必要が無くなり、オブジェクトコードサイズを小さくすることができる。従って、マイコンの選択時には、相対的に少ないメモリ容量のマイコンを選択することができ、コストを抑えることができる。
【００４５】
また、割込み禁止／解除命令を実行する必要がないので、処理時間が短縮される。しかも、ソフトウェアを変更するたびに、割込み禁止／解除命令が適切に挿入されているか否かのチェックを行う必要がなくなり、ソフトウェアの作成・保守の工数を大幅に削減することができる。
【００４６】
さらに、例えば前述の図５を参照して説明したベースルーチンと割込みルーチンのように、各ルーチンのアクセスするレジスタのビット番号が重複しないように割り当てられている既存のソフトウェアを、本出力装置で動作させるためには、各ルーチン毎にアクセスするレジスタのアドレスを変更するだけでよい。つまり、ソフトウェアにおけるビットの割り当てを変更しなくてもよいため、既存のソフトウェア資源を有効利用をすることができる。
【００４７】
ところで、請求項１に記載の発明では、各レジスタは所定のビット幅を持っている。この所定のビット幅は、例えば、８ビット幅や１６ビット幅など、複数ビット幅である。また、各レジスタのビット幅は異なるものでもよい。例えば、アドレスの１番地にビット３１〜ビット０の３２ビット幅のレジスタを備え、２番地にビット３１〜ビット０の３２ビット幅のレジスタを備え、３番地にビット７〜ビット０の８ビット幅のレジスタを備えており、それぞれのレジスタの同一ビット番号の出力部を同じ論理和回路の入力部に接続し、これらの論理和回路の出力信号線を出力ポートとするような場合である。この場合、出力ポートは３２本の信号線からなる。ビット３１〜ビット８に対応する出力ポートの各信号線の論理値は、アドレス１番地とアドレス２番地の各レジスタの各ビットの論理和を取った値となり、ビット７〜ビット０についてはアドレス１番地とアドレス２番地とアドレス３番地の各レジスタの各ビットの論理和を取った値となる。
【００４８】
このようにすれば、例えばＣＰＵの動作モードによってアクセス可能なビット幅が変化するような場合等にも、一つの出力ポートを異なる動作モードで実行するルーチンで共有することができる。また、後述のように出力ポートをマイコンチップ（パッケージ）の外部に出力する場合には、空き端子のない効率のよいピン割付ができる。
【００４９】
そして、各レジスタのビット幅は、請求項２のように、同一であるようにしてもよい。このようにすれば、汎用の出力装置として利用することができ、ソフト側でアクセスするレジスタのビットの割り当てを自由に変えることができる。つまり、すべてのレジスタのビット幅が同一であるため、例えば、制御対象の制御処理を実行プライオリティの違うルーチンに移動する場合には、アクセスするレジスタを変更するだけでよい。特に組み込みシステムでは、制御対象が多数あり、様々な用途で使用されるため、このような汎用性があることが要求される。
【００５０】
そして、本出力装置は１つのチップに集積するとよい。この場合、本出力装置に接続される回路は、チップの内部または外部に存在する。つまり、出力ポートに接続される回路がチップの内部に存在する場合とチップの外部に存在する場合がある。チップの内部に存在する場合には、出力ポートの各信号線はチップ内の各回路に接続される。一方、チップの外部に存在する場合には、請求項３に示すように、出力ポートの各信号線はチップのピンに接続するとよい。このようにすれば、チップの外部の回路を制御することができる。また、例えば前述のような多重アクセスの問題を回避するために各実行レベル毎に１つの出力ポートを占有してしまい、マイコンチップの出力端子の利用効率が悪くなることもない。よって、空き端子のない効率のよいピン割付が可能となる。
【００５１】
また、本出力装置を１つのチップに集積する場合には、出力装置単体をチップに集積してもよいし、出力装置と出力装置に接続された周辺回路とをチップに集積してもよい。また、請求項４に示すように出力装置のレジスタに書き込み可能なＣＰＵとともに出力装置を１つのチップに集積してもよい。このようにすれば、前述の特徴を備えた出力ポートを持つマイクロコンピュータとなる。
【００５２】
【発明の実施の形態】
以下、本発明が適用された実施例について図面を用いて説明する。なお、本発明の実施の形態は、下記の実施例に何ら限定されることなく、本発明の技術的範囲に属する限り種々の形態を採りうることは言うまでもない。
【００５３】
以下、図１〜図３を参照して説明する。
図１は、本実施例における出力装置１０のハードウェア構成を示し、図２は、周辺装置をＯＮにする際の出力装置１０の使用例と動作を示す。そして、図３は、周辺装置をＯＦＦにする際の出力装置１０の使用例と動作を示す。
【００５４】
図１の本実施例のマイクロコンピュータ用出力装置１０は、図示しないＣＰＵとともに、マイコンチップ２０に集積されている。
図１のＡ−１レジスタ１１は図４を参照して説明した前述のレジスタＡと同様の構成である。また、Ａ−２レジスタ１２は図４を参照して説明した前述のレジスタＢと同様の構成である。よって、説明は省略する。
【００５５】
ただし、Ａ−１レジスタ１１、Ａ−２レジスタ１２の各出力部は、図４のようにそのままマイコンチップのピンに接続されるのではなく、図１に示すように、Ａ−１レジスタ１１とＡ−２レジスタ１２の各ビット番号毎にＯＲゲート群１３の１つのＯＲゲートに接続され、そのＯＲゲート群１３の出力が信号線群１５を介して各ピンに接続される。具体的には、Ａ−１レジスタ１１のビット０の出力部１７ａとＡ−２レジスタ１２のビット０の出力部１８ａとがＯＲゲート１３ａの入力部１９ａ，１９ｂにそれぞれ接続され、このＯＲゲート１３ａの出力部からの信号線１５ａがマイコンチップ２０の１ピンに接続される。同様に、Ａ−１レジスタ１１のビット１の出力部１７ｂとＡ−２レジスタ１２のビット１の出力部１８ｂとがＯＲゲート１３ｂの入力部１９ｃ，１９ｄにそれぞれ接続され、このＯＲゲート１３ｂの出力部からの信号線１５ｂがマイコンチップ２０の２ピンに接続される。以下、図１に示すように、各レジスタのビット７まで同様の回路が構成される。
【００５６】
つまり、Ａ−１レジスタ１１のビットｎとＡ−２レジスタ１２のビットｎとがＯＲゲート群１３の１つのＯＲゲートの入力部に接続されており、そのＯＲゲートの出力部からの信号線が第一出力ポート１４としてマイコンチップ２０の（ｎ＋１）ピンに接続されている。なお、本実施例ではｎは０から７となる。
【００５７】
そして、図４の例と同様に、図１の１ピンにはランプ、２ピンにはソレノイド１、４ピンにはヒータ１、５ピンにはヒータ２、６ピンにはソレノイド２、７ピンにはソレノイド３、８ピンにはソレノイド４を駆動する駆動回路が周辺回路として接続されている。なお２ピンは未使用である。
【００５８】
よって、Ａ−１レジスタ１１、Ａ−２レジスタ１２はそれぞれビット０がランプ、ビット１がソレノイド１、ビット２は未使用、ビット３がヒータ１、ビット４がヒータ２、ビット５がソレノイド２、ビット６がソレノイド３、ビット７がソレノイド４の制御用ビットとなる。そして、図１の回路によって、例えば、Ａ−１レジスタ１１のビット０とＡ−２レジスタ１２のビット０の少なくともいずれか一方を１にすれば、１ピンの出力はＨｉレベルとなり、ランプを点灯させることができる。
【００５９】
なお、ここで本実施例の用語と特許請求の範囲に記載した用語との関係を簡単に説明する。基本的には同じ用語を用いているので、異なる点について述べる。本実施例において、特許請求の範囲の論理和回路はＯＲゲートに相当し、マイクロコンピュータはマイコンチップ２０に相当する。
【００６０】
以下に、図１に示した本実施例のハードウェアにおいて、図５・図６を参照して説明した処理を行う場合の各レジスタの値を図２に示して説明する。
処理の内容は図５・図６の場合と同様であり、図２のソレノイド１〜ソレノイド４は必ず４ｍｓ毎に駆動する必要がある一方、ランプ、ヒータ１、ヒータ２は特に時間要求がないため、Ａ−１レジスタ１１はベースルーチンからのアクセス専用とし、Ａ−２レジスタ１２はタイマ割込みルーチンからのアクセス専用とする。つまり、Ａ−１レジスタ１１は、プライオリティが相対的に低いベースルーチンから制御し、Ａ−１レジスタ１１は、プライオリティが相対的に高いタイマ割込みルーチンから制御する。このタイマ割込みの時間は４ｍｓとする。
【００６１】
Ａ−１レジスタ１１及びＡ−２レジスタ１２にアクセスするＣＰＵは、一般的なＲＩＳＣを採用したＣＰＵであり、レジスタの特定のビットを直接操作することができないタイプのものである。よって、各ルーチンでは、前述のリード・モディファイ・ライトの操作を行う必要がある。
【００６２】
ベースルーチンは、ランプ、ヒータ１、ヒータ２の各ビットにアクセスし、タイマ割込みルーチンはソレノイド１、ソレノイド２、ソレノイド３、ソレノイド４の各ビットにアクセスする。図中、ハッチング部分のビットはそれぞれの各ルーチンにおいて操作対象外のビットを示す。
【００６３】
図２の例は、ベースルーチンＳ１１０、Ｓ１２０、Ｓ１３０でランプをＯＮにする処理中に、タイマ割込みによってＳ１２０から、タイマ割込みルーチンに移行する処理である。そして、タイマ割込みルーチンでは、Ｓ２１０、Ｓ２２０、Ｓ２３０で、ソレノイド１をＯＮにする処理を行う。
【００６４】
以下に、この時のＣＰＵの動作、ＣＰＵの汎用レジスタの値、Ａ−１レジスタ１１の値、Ａ−２レジスタ１２の値を説明する。なお、Ａ−１レジスタ１１及びＡ−２レジスタ１２の初期値はいずれも０ｂ００００００００であり、すべての装置はＯＦＦ状態である。また、以下、「汎用レジスタ」はＣＰＵの汎用レジスタを示す。また、図２及び図３において右側の縦一列のレジスタは汎用レジスタの値を表し、中央の縦一列のレジスタはＡ−１レジスタ１１またはＡ−２レジスタ１２の値を示したものである。そして、左側の一列は図１の第一出力ポート１４の各出力端子の信号レベルを示し、８ピンからから１ピンに向けて各ビットの出力の信号レベルを左から順に表記したものである。
【００６５】
図１に示すように、Ａ−１レジスタ１１は、メモリ空間の０ｘＦＦＦＦＦＡ００番地にマップされており、Ａ−２レジスタ１２は、０ｘＦＦＦＦＦＡ０１番地にマップされている。よって、以下、ＣＰＵはこれらアドレスを指定してそれぞれのレジスタの値をリードまたはライトする。
【００６６】
Ｓ１１０では、Ａ−１レジスタ１１の値を汎用レジスタへリードする。よって、汎用レジスタの値は０ｂ００００００００となる。
Ｓ１２０では、汎用レジスタのランプのビットを１にする。つまり、ビット０の値を１へモディファイする。よって、汎用レジスタの値は０ｂ０００００００１となる。
【００６７】
ここで、タイマ割込みが発生すると、ＣＰＵでの処理は、ベースルーチンから割込みルーチンへ移行する。この割込みルーチンでは汎用レジスタの値を退避して、Ｓ２１０〜Ｓ２３０の処理を行う。
Ｓ２１０では、Ａ−２レジスタ１２の値を汎用レジスタへリードする。よって、汎用レジスタの値は、０ｂ００００００００となる。
【００６８】
Ｓ２２０では、汎用レジスタのソレノイド１のビットを１にする。つまり、ビット１を１へモディファイする。よって、汎用レジスタの値は、０ｂ００００００１０となる。
Ｓ２３０では、汎用レジスタの値をＡ−２レジスタ１２へライトする。このライトによって、Ａ−２レジスタ１２の値は０ｂ００００００１０となる。よって、Ａ−２レジスタ１２の出力のレベルはビット７からビット０に向けて各ビットの出力のレベルを表記するとＬＬＬＬＬＬＨＬとなる。一方、Ａ−１レジスタ１１の値は０ｂ００００００００のままである。よって、Ａ−１レジスタ１１の出力のレベルは同様に表記するとＬＬＬＬＬＬＬＬとなる。前述の図１の回路構成によって、両レジスタの対応する各ビット番号毎にＯＲを取ったレベルが出力されることになるので、第一出力ポート１４の信号レベルはＬＬＬＬＬＬＨＬとなる。よって、２ピンがＨｉレベルとなり、ソレノイド１がＯＮになる。
【００６９】
続いて割込みルーチンからベースルーチンに復帰するために、退避した汎用レジスタの値を復帰する。復帰した汎用レジスタの値はＳ１２０での値である０ｂ０００００００１となり、処理はベースルーチンへ復帰する。
Ｓ１３０では、汎用レジスタの値をＡ−１レジスタ１１へライトする。よって、Ａ−１レジスタ１１の値は０ｂ０００００００１となり、Ａ−１レジスタ１１の出力は、ＬＬＬＬＬＬＬＨとなる。一方、このときＡ−２レジスタ１２の出力は、ＬＬＬＬＬＬＨＬのままであるので、図１の回路によって、出力はＬＬＬＬＬＬＨＨとなる。つまり、１ピンがＨｉレベルとなりランプがＯＮになる。また、２ピンはＨｉレベルのままでありソレノイド１がＯＮ状態のままである。よって、ベースルーチンでＯＮにしたランプと割込みルーチンでＯＮにしたソレノイドはともにＯＮとなり、期待通りの動作が行われる。
【００７０】
つまり、本構成によれば、図６を参照して説明したようにソフトウェアによる割込み禁止／解除を行わなくても、図５を参照して説明したような多重アクセスによる出力異常が起こらない。
これは、周辺装置をＯＦＦにする場合も同様である。以下に、図３を参照して、周辺装置をＯＦＦにする場合の例を説明する。
【００７１】
図３の回路構成は図２の場合と同様である。また、ベースルーチン、割込みルーチンへの各レジスタの割り当ても同様である。
図３では初期状態として、Ａ−１レジスタ１１の値を０ｂ０００００００１とし、Ａ−２レジスタ１２の値を０ｂ１０１０００１０とする。図１の回路によって出力端子のレベルは、ＨＬＨＬＬＬＨＨとなり、ランプ、ソレノイド１、ソレノイド２、ソレノイド４がＯＮ状態となり、ヒータ１、ヒータ２、ソレノイド３がＯＦＦ状態となっている。この状態からベースルーチンではランプをＯＦＦにする処理を行い、タイマ割込みルーチンではソレノイド１をＯＦＦとする処理を行う。
【００７２】
以下、図３の各ステップについて説明する。
Ｓ３１０では、Ａ−１レジスタ１１の値を汎用レジスタへリードする。よって、汎用レジスタの値は０ｂ０００００００１となる。
Ｓ３２０では、汎用レジスタのランプのビットを０にする。つまり、ビット０の値を０へモディファイする。よって汎用レジスタの値は０ｂ００００００００となる。
【００７３】
ここで、タイマ割込みが発生すると、ＣＰＵでの処理は、ベースルーチンから割込みルーチンへ移行する。この割込みルーチンでは汎用レジスタの値を退避して、Ｓ４１０〜Ｓ４３０の処理を行う。
Ｓ４１０では、Ａ−２レジスタ１２の値を汎用レジスタへリードする。よって、汎用レジスタの値は、０ｂ１０１０００１０となる。
【００７４】
Ｓ４２０では、汎用レジスタのソレノイド１のビットを０にする。つまり、ビット１を０へモディファイする。よって、汎用レジスタの値は、０ｂ１０１０００００となる。
Ｓ４３０では、汎用レジスタの値をＡ−２レジスタ１２へライトする。このライトによって、Ａ−２レジスタ１２の値は０ｂ１０１０００００となる。よって、Ａ−２レジスタ１２の出力のレベルはＨＬＨＬＬＬＬＬとなる。一方、Ａ−１レジスタ１１の値は０ｂ０００００００１のままである。よって、Ａ−１レジスタ１１の出力のレベルはＬＬＬＬＬＬＬＨとなる。前述の図１の回路構成によって、両レジスタの対応する各ビット番号毎にＯＲを取ったレベルが出力されることになるので、第一出力ポート１４の信号レベルはＨＬＨＬＬＬＬＨとなる。よって、２ピンがＬｏｗレベルとなり、ソレノイド１がＯＦＦとなる。
【００７５】
続いて割込みルーチンからベースルーチンに復帰するために、退避した汎用レジスタの値を復帰する。復帰した汎用レジスタの値はＳ３２０での値である０ｂ００００００００となる。そして、処理はベースルーチンへ復帰する。
Ｓ３３０では、汎用レジスタの値をＡ−１レジスタ１１へライトする。すると、Ａ−１レジスタ１１の値は０ｂ００００００００となり、Ａ−１レジスタ１１の出力は、ＬＬＬＬＬＬＬＬとなる。一方、このときＡ−２レジスタ１２の出力は、ＨＬＨＬＬＬＬＬのままであるので、図１の回路によって、第一出力ポート１４はＨＬＨＬＬＬＬＬとなる。つまり、１ピンがＬｏｗレベルとなりランプがＯＦＦになる。また、２ピンはＬｏｗレベルのままでありソレノイド１はＯＦＦ状態のままである。よって、割込みルーチンでＯＦＦにしたソレノイド１とベースルーチンでＯＦＦにしたランプとはともにＯＦＦとなり、期待通りの動作が行われる。
【００７６】
よって、本出力装置１０によれば、出力をＯＦＦにする場合も、ＯＮにする場合も、図６のようなソフトウェアによる割込み禁止／解除を行う必要がない。
Ａ−１レジスタ１１をベースルーチン用、Ａ−２レジスタ１２を割り込みルーチン用として各々のルーチンが操作するビットが同じビットにならないように割り当て、自ルーチンで操作しないビットの値を０に固定することで、各々のルーチンにおける出力処理時に排他処理をする必要がなくなるからである。
【００７７】
そして、この場合の処理ステップは、排他処理追加前の図５の場合と等しくなる。よって、実行時間は図７の（ａ）対策前と等しくなり、図７（ｂ）のような割込み禁止／解除命令の追加によるオーバーヘッドは発生しない。しかも、図５に示した多重アクセスの問題も発生しない。よって、正常な動作を実現しつつ実行時間を削減することができる。
【００７８】
また、割込み禁止／解除命令が不要であるため、オブジェクトコードのサイズが小さくなり、ＲＯＭサイズを低減できる。
そして、実行レベル毎に出力ポートを占有する必要もなく、最大でも、同一のポートのレジスタにパッキングされている実行レベル分のレジスタを用意し、その各ビットを同一ビット番号毎に論理和を取って出力すればよいことになる。また、実行レベル毎のポートのパッキング数はすべて任意に設定できるため、空き端子のない効率よい割付が実現できる。
【００７９】
また、例えば、ベースルーチンで実行していたヒータ２の制御をタイマ割込みルーチンで行うように変更する場合など、ビットを操作するルーチンの実行レベルを変更する場合にも、ソフトウェアに排他処理を追加せずに対応できる。
さらに、従来の図６のソフトウェア資産を本装置に対応させるためには、レジスタのビット配列はそのままでよく、外部の基盤の回路パターンの変更をする必要もない。
［別実施例］
（１）上記実施例においては、Ａ−１レジスタ１１とＡ−２レジスタ１２の二つのレジスタによる構成と動作について説明したが、これらのレジスタは、３つ以上でもよい。例えば、Ａ−１レジスタ１１からＡ−ｍレジスタまでのｍ本のレジスタを備え、Ａ−１レジスタ１１からＡ−ｍレジスタまでのそれぞれのレジスタのビットｉの出力をＯＲゲートの入力部にそれぞれ接続し、その出力を出力端子に接続するようにしてもよい。このようにすればｍ個のルーチンから排他制御無しに、出力端子に接続した周辺回路を制御することができる。
【００８０】
また、レジスタのビット幅も８ビットに固定されている必要はなく、例えば、１６ビット、３２ビットなど、１ビット以上であればよい。つまり上述の例のｉは任意のビット数としてよい。
（２）上記実施例においては、多重アクセスの例として割込みを挙げたが、多重アクセスは割込みに限らず種々の状況で発生する。例えば、リアルタイムＯＳではタスクの優先順位に従って各ルーチンを実行するが、この時も同一ポートへの書き込みが発生する場合がある。このように多重アクセスが発生する状況であれば、本装置が有効に利用できる。
（３）上記実施例においては、ＯＲゲート群１３を用いることとしたが、ワイヤードＯＲなどゲートを用いないＯＲ回路でもよい。つまり、論理和を取ることができればどのような構成のものでもよい。
（４）上記実施例においては、ＯＲゲート群１３の出力はマイコンチップ２０のピンに接続することとしたが、種々の回路を介して接続するようにしてもよい。例えばドライバ回路や保護回路等を介して接続してもよいし、プログラマブルインバータ等を介して接続してもよい。また信号レベルを反転するためにＮＯＲゲートとしてもよい。各レジスタの出力も同様である。また、もちろんピン配置は自由に定めてよい。
（５）上記実施例においては、各実行レベル毎に異なるビットの操作を行うことで排他制御を行っているが、この図１の回路の一部または全部は次のような利用方法によって上記実施例とは別の制御に利用することもできる。
【００８１】
例えば、図５の未使用ビットであるレジスタＡのビット２に対応する図４の３ピンにＬＥＤを接続し、フラグ１とフラグ２のいずれか一方がＯＮの場合（ＯＲ条件）にＬＥＤを点灯させることとする。このような場合、従来はソフトウェアでいずれかのフラグがＯＮであるかを判定し、判定の結果、フラグ１またはフラグ２のいずれかがＯＮである場合に図４のレジスタＡを１とすることでＬＥＤを点灯させていた。
【００８２】
しかし、図１の３ピンにＬＥＤを接続した場合には、このようなソフトウェアによるフラグの判定は不要となり、フラグ１をＯＮにする代わりにＡ−１レジスタ１１のビット２を１とし、フラグ２をＯＮにする代わりにＡ−２レジスタ１２のビット２を１とするだけで、ＬＥＤを点灯させることができる。このような構成によれば、ソフトウェアによる判定が不要となり、この判定の完了までに発生する遅延が起こらなくなる。
【００８３】
また、ＯＲゲート群１３のそれぞれの信号線をプログラマブルインバータ等に接続すれば、ＯＲ条件ではなく、ＮＡＮＤ条件で出力をすることもできる。またレジスタが複数ある場合には、例えば複数ビットのＯＲでＯＮ／ＯＦＦまたは複数ビットのＡＮＤでＯＮ／ＯＦＦ等を組み合わせて使うことができる。
（６）上記実施例においては、出力装置１０は図示しないＣＰＵと共にマイコンチップ２０に集積されることとしたが、ＣＰＵは含まずに出力装置単体で集積してもよい。このようにすれば、汎用のＣＰＵ等を接続してこれらのＣＰＵの出力装置として利用することができる。
【００８４】
また、上記実施例においては、各出力ポートは出力端子に接続することとし、チップの外部にある周辺回路に出力することとしたが、チップ内部にある周辺回路に接続するようにしてもよい。このようにすれば、チップ内の周辺回路に関しても同様に制御を行うことができる。
（７）上記実施例においては、出力ポートは第一出力ポート１４についてのみ説明したが、出力ポートは複数あってもよい。このようにすれば、多数の制御対象の制御を行うことができる。
【００８５】
また各出力ポートのハードウェア構成は異なるものとしてもよい。例えば、第一出力ポート１４とともに、第２出力ポートとして、それぞれ１６ビット幅のＢ−１レジスタとＢ−２レジスタとＢ−３レジスタによる回路を備え、第一出力ポート１４とともに利用するようにしてもよい。このようにすれば、利用する信号線の数と、アクセスするルーチンの数によって最適な構成を採ることができる。
【図面の簡単な説明】
【図１】  実施例の出力装置１０のハードウェア構成を示す説明図である。
【図２】  実施例の周辺装置をＯＮにする際の出力装置１０の使用例と動作の説明を示す説明図である。
【図３】  実施例の周辺装置をＯＦＦにする際の出力装置１０の使用例と動作の説明を示す説明図である。
【図４】  従来の出力装置１０のハードウェア構成を示す説明図である。
【図５】  従来のレジスタの多重アクセスによる出力異常の例を示す説明図である。
【図６】  従来のソフトウェアの割込み禁止・割込み解除による対策を行った例を示す説明図である。
【図７】  ソフトウェアによる対策の前後における実行時間の変化を示す説明図である。
【符号の説明】
１０…マイクロコンピュータ用出力装置          １１…Ａ−１レジスタ
１２…Ａ−２レジスタ                          １３…ＯＲゲート群
１３ａ，１３ｂ…ＯＲゲート                    １４…第一出力ポート
１５…信号線群                                １５ａ，１５ｂ…信号線
１７ａ…Ａ−１レジスタのビット０の出力部
１７ｂ…Ａ−１レジスタのビット１の出力部
１８ａ…Ａ−２レジスタのビット０の出力部
１８ｂ…Ａ−２レジスタのビット１の出力部
１９ａ，１９ｂ，１９ｃ，１９ｄ…ＯＲゲートの入力部
２０…マイコンチップ
【図１】
0004178699.tif 000002
【図２】
0004178699.tif 000003
【図３】
0004178699.tif 000004
【図４】
0004178699.tif 000005
【図５】
0004178699.tif 000006
【図６】
0004178699.tif 000007
【図７】
0004178699.tif 000008