日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

JavaScriptを有効にし、Cookieを受け入れ、以下のブラウザを使うことで完全なコンテンツが楽しめます。
Mozilla Firefox 3.0(Get Firefox)・Opera 9.6・Safari 3.2・Lunascape 4/5(Gecko)・Lunascape 5(WebKit)
Internet Explorer 7/8とそれを使うIEコンポーネントブラウザ(Lunascape・Sleipnirなど)

シフトレジスタにシリアル通信も可

回路設計をしている人からマイコンのピン割り付け案を受け取って確認していた。

この機能はここでいいねとかいうのを確認していた。

その表でシフトレジスタの入出力にシリアル通信機能と書かれていた。

GPIOのつもりだったんだけどなぁ、と思いつつも、確かにシリアル通信でもシフトレジスタとの入出力できるんだよね。

もっとも、シリアル通信とすればピン割り付けがおかしいので、ここはここに割り付けてと指示したが。


入出力の拡張としてシフトレジスタが使われることがある。

TC74VHC165F: 8-Bit Parallel-In/Serial-Out Shift Register  (TOSHIBA)

TC74VHC595F: 8-Bit Shift Register/Latch (3-State) (TOSHIBA)

標準ロジックICの74シリーズのこのあたりがよく使われるらしい。

74165は入力用に使われる。8bitのパラレル入力をシリアル化する。

74595は出力用に使われる。8bitのシフトレジスタとラッチを持っている。

シフトレジスタにデータを格納して、全部格納できたら一括してラッチするということができる。


マイコンのピンにも限りがあるが、74165を使えばマイコンの入出力3ピンで8bitの入力を受けられる。

すなわち、これで5ピンの節約になる。

さらに複数の74165を連結して使うこともできるから、そうすると節約効果はなおさら大きい。

74595も8bitの出力をマイコンの出力を最小3ピン使えば操作出来る。(Hi-Z状態を制御したい場合は+1ピン)

これも複数の74595を連結して使うことができる。


ただし、入出力にあたってはシフトレジスタの操作が必要になる。

そこで、当初想定していたのはプログラムで信号を1つずつ操作する方法だった。

ロード信号を下げて上げて、シフトレジスタ出力を格納して、クロック信号を上げて下げて……というのを全部プログラムで書くと。

この方式のメリットは特別な機能を使わずに済むこと。GPIOさえ使えればよい。

GPIOはGeneral Purpose Input/Output、単純なデジタル入出力のことですね。マイコンのほぼ全てのピンがGPIOで使える。

ただ、欠点は信号の操作を全てプログラムで書くので、データ転送のスピードが遅くなってしまうこと。


一方でシフトレジスタとのデータ転送にクロック同期シリアル通信が使えるという話がある。

74165も74595もクロックの立ち上がり時にデータを1bit転送されるわけですからね。

クロック同期シリアル通信はSPIバスなどで使われるので、マイコンにはほぼ搭載されている機能。

この機能を使えば、プログラムで信号を1つ1つ操作するより高速に、なおかつ転送中は他のプログラムの実行ができる。

そういうわけでパフォーマンス面ではマイコンのシリアル通信機能を使う方が有利なわけである。


そのことを意識してシフトレジスタの入出力ピンをシリアル通信機能のピンに割り付けようとしていたのだろう。

その割にはピン割り付けがおかしかったから、本当はよくわかってなかったのかもしれないけど。

とりあえず、シリアル通信機能にも使えるようにピンは割り付けてもらうことにした。

GPIOはほぼ全てのピンで使える機能なので、ほとんどどこに割り付けても自由だ。

なので、シリアル通信機能が使えるように割り付けておけば、GPIOでの操作もできる。


というわけで、シフトレジスタとのデータ転送方法について シリアル通信 と GPIO の2種類の選択肢を得たわけだが……

どうしてもシリアル通信を使わないといけないほどパフォーマンスが厳しいわけではない。むしろ暇をもてあますことになりそう。

GPIOだと信号の操作を1つずつプログラムに書かないといけないが、プログラムで書いた通りの波形が出てくるという安心感はある。

どっちがいいんだろ? というわけでチームリーダーに相談してみた。

そしたら「どっちでもいいけど、通信機能の操作をあれこれ考えるぐらいなら、GPIOの方が楽なのでは」とのことだった。


そこで教えてもらったのだが、1世代前のシステムではEEPROMへのアクセスをGPIOを使って行っていたらしい。

クロック同期のシリアルバスの通信をプログラムで信号を1つずつ操作してやってたらしい。

それでもなんとかなっていたのだが、問題は通信速度が遅いこと。

8msあたり2Byteずつという遅いスピードで行っていたようで、すなわち1kByte転送するのに4秒かかるということだ。

というわけで当時はEEPROMに格納するデータサイズをできるだけ小さくする工夫をしていたようだ。

それでも128Byteのデータを転送するのに0.5秒ですからね。リード→ライトとやると2回転送するから1.0秒かかってしまう。

最新世代のシステムでは、マイコンのシリアル通信機能を使うことで、8msあたり32Byteずつ転送するようになった。

EEPROMの書き込み時間を考慮すると、書き込みでは限界に近いスピードになっているとのこと。

すると1kByteのデータを250msで転送できるようになった。1世代前のシステムで128Byte転送するよりも短時間で済む。

これにより設定情報の大容量化が実現できたということらしい。


500kbpsで128bitのデータを転送するのにかかる時間は0.256ms。

オーバーヘッドなど考慮しても通信機能を使えば1ms間隔で74165または74595 16個分のデータ転送をすることもできそう。

マイコンはたった3ピンだけで、ロジックICを16個外付けすれば、128ピンの入出力が1ms間隔でできるというのはなかなかすさまじい。

とはいえ、今回はシフトレジスタはせいぜい1個(16bit)、データ転送間隔は数百ms間隔である。

通信機能を使って本気で転送しなければならないスピードということは決してない。

じゃあGPIOでいいねって。


Author : hidemaro
Date : 2018/05/10(Thu) 22:55
電気・数学・物理 | Comment | trackback (0)

Tools