以前から使ってみたかったので採用(笑)。
MCP23008-E/P(シリアルインターフェース 8bit I/Oエクスパンダ)
素直に手持ちのPIC16F648Aを使えばピン数も足りているので、何もわざわざこちらを使う必要が無いのですが、I2Cと8pinのPICの学習も兼ねて使ってみることにしました。
MPU等とI2C(アイ・スクエアド・シー)シリアルインターフェースを介して外部の8ビットI/Oを操作することができます。
I2Cの通信速度は100kHz、400kHz、1.7MHzと3つの規格が利用できます。同じ同期型シリアルインターフェースである3線式のSPIと違い、2線式のインターフェースで1ピン節約できます(ああ、貧乏性)。さらにI2Cでは各デバイスにアドレスが振ってあり、そのアドレスを指定して通信を行うのですがSPIの場合はスレーブセレクト(SS)信号によりデバイスを選択します。メモリのチップセレクト(CS)みたいなもんですね。おかげでSPIは3線式インターフェースなのですがプラス1本の制御線が加わり、4本のMCUのピンを占有します。
I2Cがバス型イーサネット(10Base2/5)の雰囲気に比べて、どちらかというとSPIのターゲットはSDカードのような気がするのは気のせいかもしれません(笑)。
(SPIはモトローラ(現フリースケール・セミコンダクタ)が制定、I2Cはフィリップス(現在はNXPに移管)が制定した規格です)
プログラムの開発はCCS Cコンパイラを使っていますので、I2Cは組み込み関数が使えるため、実際のシリアル通信におけるピンの論理操作に煩わさせられることは無いのがうれしい所です。フルスクラッチで組上げる方が学習という意味では良いのでしょうが、ある物は使えです(車輪の再発明はしない)。
開発テストベッド
久々にブレッドボードやソケット治具(ゲタソケット)、I/Oモニタ治具(I/O BOX)などを引っぱり出してきました。
ブレッドボード周り
ターゲットの電源と同じ状況でシリーズレギュレーターの発熱なども確認しておきたいため、外部電源は12Vを投入し、78N05(最大出力300mA)で5Vにして回路に供給しています。
プログラム側で常時監視でループを回しても良いのですが、常にI2C通信をしているのも馬鹿らしいのでMCP23008のピン状態変更による割込機能で、PIC側は通常スリープにしておき、割込発生で状態変化をMCP23008へI2C通信でポートの現在値を読み取り・確認して操作に相当する制御を行う仕様にします。
電源オンのLED表示、電源回路へのオン制御信号、入力ソースを示すLED表示、サラウンド回路のオン・オフ制御とLED表示を操作します。
PICの外部割込、MCP23008の状態変化割込機能とI2Cの機能などを確認しながら開発と、ちょっと課題が積み上がりました。早々にプログラムを組上げて実装に移したい所ですが、確認しながらの開発するという時間が取れるかどうか...。
コメントする