uPD4701A

uPD4701Aは、データシートには「インクリメンタル方式エンコーダ用カウンタ」という名称で紹介されていますが、明らかにマウスやトラックボール用のインターフェースLSIです。実際、概要としてそういったポインティングデバイスへの応用が挙げられています。

uPD4701A

CMOSプロセスで製造され+5 V単一電源で実使用状態で1 mA以下と低消費電力になっています。
x軸とy軸用の2回路のロータリエンコーダ入力があり、入力信号のすべてのエッジでカウントする4逓倍カウント方式を採用。それぞれ12 bit分解能のカウンタを内蔵し、マイクロプロセッサから読み出せる。エンコーダ入力は500 kHzまでの周波数の信号を扱える。
各カウンタは個別のリセット入力を備え、I/Oポートからの信号やシステムリセット信号によってリセット可能。
3接点分のキー入力バッファを持ち、マイクロプロセッサから読み出せる。キー入力信号とエンコーダ入力信号はヒステリシス付きのシュミットトリガ入力で耐ノイズ性が高い。
カウンタの内容が変化したときにLになる出力とスイッチのどれかがオンになるとLになる出力を備え、それぞれ割り込み信号として使用できる。
8080A, Z80などのバスに簡単に接続可能。

と、このような特長があります。つまり光学式ロータリエンコーダ2回路と1 - 3回路の機械的スイッチを内蔵したマウスとマイクロプロセッサのバスの間にこのuPD4701Aをインターフェース回路として配置すれば、マウスの状態をマイクロプロセッサが常に把握することが可能になるように設計されています。

このLSIにはマイクロプロセッサからの書き込みはできません。初期設定などを行う必要がないからです。カウンタのリセットだけは専用の信号線がありますが、マウスの場合なら相対的な移動だけ考えれば良いので、それを使わないことすらありえます。読み出しのためのアドレスは4種類。各軸について上位バイトと下位バイトの読み出しがあり、それがx軸とy軸の2種類で、合計4 Byte分のアドレスを占有します。x軸とy軸のデータは読み出されるカウンタが異なるくらいで同じ形式のデータです。次にそのフォーマットを示します。
 
ビット番号 7 6 5 4 3 2 1 0
上位バイト SF L R M C11 C10 C9 C8
下位バイト C7 C6 C5 C4 C3 C2 C1 C0

ビット番号は7がMSBで0がLSBです。C11からC0までが12 bit分のカウンタの値で、C11がMSB、C0がLSBになっています。L, R, Mはそれぞれ左スイッチ、右スイッチ、中央スイッチの状態で、対応するスイッチ接点入力がLレベルになっていると1になり、それ以外では0になります。3ボタンまでのマウスに対応しているわけですね。SFはスイッチステータスフラグで、L, R, Mのいずれかが1になっていれば1になります。カウンタはx軸とy軸で別々ですが、SF, L, R, Mはx軸側のデータ読み出しでもy軸側のデータ読み出しでも同一のものが読み出されます。

一般にマウスには光学式ロータリエンコーダで移動を読み取るものや、下敷きの模様を光センサで読み出して移動を検出するものがあります。機械式ロータリエンコーダや他の種類のセンサを用いてマウスの移動や絶対位置を検出することも理屈の上は可能ですが、最近まではほとんどのマウスが光学式ロータリエンコーダを用いたものになっています。これは、検出器自身は非接触であり駆動力のロスは検出用円盤の軸受けだけで生じるために移動検出時にセンサ部分の駆動力が小さくて済むことや、構造的に単純で製造や保守が容易であることなどによるのでしょう。
光学式ロータリエンコーダは、機械的な移動検出やモータの回転数や角度検出のため、古くから工業分野では利用されてきました。こちらはマウス用のより分解能が高く、軸受けなどにも高級品を用い、検出部のカバーなどもしっかりしたものが使われています。なにしろ、オイルミストや粉じんなどの飛散する環境で使われるかもしれず、その割に気軽に分解掃除などできないところで使われるわけですから、カバーといってもばかにはできません。さて、そのようなセンサですが、それを接続して利用するための回路も以前は多くのICが必要で、それほど簡単なインターフェース回路とはいきません。必要に応じて信号を簡単に増幅したりしてからシュミットトリガ入力のICで受けて、逓倍回路や回転方向の判別回路をIC数個で作成し、74193などのアップダウンカウンタを4個ほど並べて16 bit程度のカウンタを構成し、それをパラレル入力ポートに接続してマイクロプロセッサから読みだせるようにしたりするのですが、場合に応じてCPU読み出し時のカウンタ内容の変化を防止するため、そのタイミングでインターロック回路やらカウンタ出力のラッチ回路などが必要になるかもしれません。1970年代から1980年代はじめにかけては、ロータリエンコーダの入力インターフェース回路というのは10 cm角の基板に2回路分も詰め込めれば上出来だったのです。でも、高価な生産設備などの一部に使用されている限りにおいては、多くの需要があるわけでもなく、そういった個別部品による回路でもかまわなかったのです。
しかし、マウスともなると話は別です。それまでとは桁違いのロータリエンコーダが使われますし、コスト面への圧力も高まります。そこで開発されたのが、このuPD4701Aというわけです。
そうしてuPD4701Aが広く応用されたかというと、なかなかそうはいきませんでした。PC9801系列では、個別部品によるマウスインターフェースが先に販売されていて、それと互換性のないuPD4701Aは使われませんでした。また、それ以外のコンピュータ用のマウスの大部分では、専用LSIを使わずに小型マイクロコンピュータを用いてマウスの状態を把握する方式が使われました。ロータリエンコーダを工業的に応用する場合、100 kHz程度の周波数の信号がセンサから送られてくることも珍しくありません。10 usに1カウントですから、マイクロコンピュータのI/Oポートにその信号を接続して常時監視しても追跡が困難です。時々、ホストのCPUと通信を行わなくてはならないとしたら不可能というべきでしょう。しかし、コンピュータの入力デバイスとしてのマウスに使われるロータリエンコーダなら、話は別です。そんなに素早くマウスを動かすなら、あっという間にマウスカーソルが画面の外に消え去ってしまいます。瞬間的な最大周波数でも10 kHz扱えれば十分でしょう。それ以上の速度で動かされた場合、仮にカウントミスしてしまっても、使い勝手に差が出るとは思えません。ということで組み込み用の小型マイクロコンピュータのI/Oポートにロータリエンコーダの信号を直結して、それ以降のカウント処理などをプログラムで行う手法が利用できます。そうすれば、ホストのCPUとの通信にもインテリジェントなプロトコル付きのものを採用することも可能で、さらに便利になるかもしれません。
というわけで、uPD4701Aが大々的に使われるようなことはありませんでした。

さて、一般紙の紙面にも「メカトロニクス」なんて言葉が出てくるくらいマイクロコンピュータによる機械制御が広く行われるようになると、ロータリエンコーダの活躍の場も広がります。そのため、インターフェース用LSIもいくつも出てきます。たとえば、ロータリエンコーダのメーカのひとつであるHewlett Packard社からも売り出されていましたし、逆にユーザ側の企業で自分達で使用するためにカスタムLSIとして開発し、その一部を外販するようなことも行われています。
今ではたとえばFAXやプリンタの内部などにもロータリエンコーダが使われていたりしますから、当然ながら制御用のマイクロコンピュータに内蔵された入出力インターフェースの一部にロータリエンコーダ入力インターフェースが内蔵されているものも増えています。

このuPD4701Aの最大の問題点はカウンタとその値の読み出し回路にあります。内蔵されている12 bitカウンタはリプルキャリ方式でカウントアップやカウントダウンの信号が与えられてから、最下位ビットから順に値が変化していきます。最上位ビットに影響が伝わるまで、わずかながら時間が必要となります。さて、マイクロプロセッサから値を読み出す信号が与えられると、ただちにカウンタの内容をラッチするようになっているため、マイクロプロセッサのバスに出力される値がアクセス中に変化することはありません。しかし、ラッチされる値は変化中の値かもしれません。たとえば、12 bitのカウンタの内容が16進数でFFFだったとして、これがカウントアップすると000になるはずです。しかし時間的変化を細かく見ていけば、FFFがFFEになりFFCになりFF8になりFF0になりFE0になり……と変化していきます。そのため、マイクロプロセッサがアクセスするタイミングによってはFF0のあとC00になってから000になるというようなことが起こり得ます。さらにカウンタが12 bitなのにバスインターフェースが8 bit単位ということから、問題が生じやすくなっています。つまり下位8 bitと上位4 bitを2回に分けて読み出さなくてはなりません。8 bitマイクロプロセッサなら、この2回の読み出しの間に数usの時間が必要なのが普通です。この間にマウスが動かされて、カウント値に変化が生じれば、マイクロプロセッサに異常なデータが読み取られてしまいます。たとえば、カウンタの内容がFFFだとして、下位を読んだ後にカウントアップし、その後に上位を読み取ると、最初にFFを読み出してから上位が0ということになってしまいます。マイクロプロセッサが定期的に値を読み取っていて、この場合で他のタイミングでカウンタの変化が生じなければ、FFFから0FFを経由して000に変化するようになってしまいます。上位から下位という順序で読み出してもFFFからF00を経由して000に変化することになります。NECの推奨アクセス方式だと、CS*をLにしたままの状態でアドレスラインを変化させながら、すべてのレジスタを読み取るようになっています。途中でCS*をHにしないわけです。そうすれば、一度にラッチされた値を読み出すため、複数レジスタにわたるアクセスの問題は生じなくなります。ただし、それでもリプルキャリの問題は残りますし、通常のマイクロプロセッサのバスに直接接続できなくなりパラレルI/Oポート経由でuPD4701Aを操作しなくはならなくなります。
結局、uPD4701Aを用いてそれなりに正確にカウンタの値を読み取るには、複数回連続してカウンタの値を読み取り、そのすべてで値が同一でなければ読み出し中にカウンタの値が変化して不正確な値である可能性があると判断し、リトライするというようなことをしなくてはなりません。マウスのように定期的に読み取る必要があり、その周期ではカウンタの値が100も変化しないことが期待できるなら、上位4 bitのデータを無視してしまい、下位8 bitのデータだけ相手にするということも考えるべきでしょう。
マウスでなくて一般のロータリエンコーダ回路のインターフェースとして使用して、そこそこ高速のカウント信号を与えてしまうと、誤読が多くて困ってしまったりします。その点、専用の高価なエンコーダインターフェースLSIは優れているのですが。

Return to IC Collection