PICの入出力ピン(IOポート)を増やす方法 - MCP23017の使い方
同じようなタイトルの記事を以前書きましたが、あっけないほど簡単な方法があることに気が付きました。
つまりそれ専用のものがちゃんと売ってました。
16-Bit I/O Expander with Serial Interface MCP23017です。
千石電商で偶然見つけたのですが、調べたら秋月電子通商にも売っています。でも“I2C”で検索してもヒットしないんですが....
この記事は MCP23017 について概略を記したものです。より詳細な説明・使い方が必要な方は
「きむ茶工房ガレージハウス
- マイコン使用による電子部品の使い方
- 入出力するピンが不足した場合に入出力ピンを増やす方法」
が参考になると思います。
------
「PICの出力ピンを増やす方法」に書いた方法も目的次第では(IOポートみたいにして使えるので)けっこう便利ですし、実際使っているのですが、たくさんピンがほしいときはこっちの方がずっといいです。
これも
「PIC+SPI+I2C 自記温湿度計+気圧計+8ch電圧計+周波数カウンタ(技術要素一覧)」
「PIC+SPI+I2C 自記温湿度計+気圧計+8ch電圧計のソース - main()」
の一つのモジュールとして使います。
マルチプレクサ(「四線式抵抗測定用マルチプレクサ(4回路2接点スイッチ相当)」)や計装アンプのオフセットや端子で発生する熱起電力の自動調整(「オペアンプ(差動増幅器、計装アンプ)のオフセット自動調整する」)をコントロールするためです。
========
マイクロチップの製品らしく“いたれりつくせり”です。16ピンを自由にカスタマイズできます。入出力、プルアップ、割込み条件、.....、たいていの目的に使えると思います。
さらにI2Cのアドレスはなんと8個の中から選択することができます。つまり「同じアドレスのI2Cデバイスを使う」に書いたようなトリッキーなことをしなくても8個同時に使うことができます。ぜんぶで128ピンということになります。
「I2Cデバイス・アドレス一覧」を見る限り他のデバイスともかちあっていないみたいです。
データシートは「Microchip - MCP23017/MCP23S17」にあります。
アドレスを指定して読み書きすることによってコンフィグレーションを変えたりデータを入出力したりできます。
データシートにはbank=0とbank=1のときの説明がありますがPORの状態ではbank=0になっています。つまりAポート用とBポート用のレジスタはアドレスが連続しています。
また同じくPORではSequential Operation modeが有効になっておりAポートを読んだ(書き込んだ)あと再度読むと(書き込むと)自動的にBポートが対象になります。
またPORの状態ではポートは入力ピンになっているので、コンフィグレーションを何もしなくても0x12アドレスを指定してreadを2回やればポートの状態を読み込むことができます。
なかなか便利です。
なお上のデータシートの最初のPDIPの図に誤りがあります。/RESETは出力ピンの矢印がありますが、実際は入力ピンです。QFNの図も、MCP23S17(これはSPI I/F)の図も、ピンの説明もぜんぶ入力ピンになっているのですが、この図だけ間違ってました。どうしてことさらにこんなことを書くのか察してください (^^;;
ちゃんとプルアップしてあったのかも....
今回ははんだ付け不良とはんだ付け忘れもあって簡単なはずのI2Cデバイスでむちゃくちゃ手間取ってしまいました。
--------
簡単なプログラム例
(例によってきむしげさんのI2Cライブラリーを使うことを前提にしています)
MCP23017lib.h
/* * File: MCP23017lib.h * Author: Seppina * */ #ifndef MCP23017_H #define MCP23017_H #define MCP23017_ADRES 0x27 #define IODIRA 0x00 void read_MCP23017(unsigned char adrs, int dch[2]); void write_MCP23017(unsigned char adrs,unsigned char nbyte,unsigned char *dch); #ifdef __cplusplus } #endif #endif /* MCP23017LIB_H */
MCP23017lib.c 入力だけしかしないのだったら青いフォントのところはなくてもいいです。
事情があって入力と出力ではデータの配列の型が違ってます。
こういう紛らわしいことはしない方がいいでしょう。
#include <xc.h>#include "MyDef.h" #include "MCP23017lib.h" #include "skI2CLib.h" void read_MCP23017(unsigned char adrs, int dch[2]) { unsigned char ans, i; ans = I2C_Start(MCP23017_ADRES,RW_0); if (ans == 0) { I2C_Send(IODIRA) ; I2C_Send(0xFF) ; I2C_Send(0xFF) ; } I2C_Stop() ; ans = I2C_Start(MCP23017_ADRES,RW_0); if (ans == 0) { I2C_Send(adrs) ; ans = I2C_rStart(MCP23017_ADRES,RW_1) ; if (ans == 0) { dch[0] = I2C_Receive(ACK) ; dch[1] = I2C_Receive(NOACK) ; } else { dch[0]= -1; return; } } else { dch[0]= -2; return; } I2C_Stop() ; return; } void write_MCP23017(unsigned char adrs,unsigned char nbyte,unsigned char *dch) { unsigned char ans, i; ans = I2C_Start(MCP23017_ADRES,RW_0); if (ans == 0) { I2C_Send(IODIRA) ; I2C_Send(0x00) ; I2C_Send(0x00) ; } I2C_Stop() ; ans = I2C_Start(MCP23017_ADRES,RW_0); if (ans == 0) { I2C_Send(adrs) ; for( i = 0; i < nbyte; i++ ) { I2C_Send(dch[i]) ; } } I2C_Stop() ; } I2Cなので表面も裏面も配線は簡単です。
------
関連
「記事一覧(測定、電子工作、天文計算)」
趣味の電子工作
PIC
「PICの出力ピンを増やす方法」
「I2Cデバイス・アドレス一覧」
「同じアドレスのI2Cデバイスを使う」
趣味の気象観測
趣味の実験
参考
「きむ茶工房ガレージハウス
- マイコン使用による電子部品の使い方
- 入出力するピンが不足した場合に入出力ピンを増やす方法」
「きむ茶工房ガレージハウス -
出力するピンが不足した場合に出力ピンを増やす方法」
「きむ茶工房ガレージハウス -
入力するピンが不足した場合に入力ピンを増やす方法」
« 「写真から星の座標を得る」アプリ・JPEG対応版 | トップページ | 左脇の下の体温は右より0.3℃高かった - 腋窩温の測定 »
「趣味の電子工作」カテゴリの記事
- PICで作る100MHz周波数カウンタ検証用XOR(エクスクルーシブオア)逓倍器(2016.03.08)
- 150MHz(~200MHz?)周波数カウンター用プリスケーラー(1/4分周器)(2016.03.06)
- 測温抵抗体(Pt100、白金薄膜温度センサー)の抵抗値を温度に変換する(平方根を使わない)計算式(2016.03.01)
- GPS/JJY(標準電波)を基準周波数源とするためのPLLの詳細(2016.02.27)
- GPS受信モジュール1PPS対決 - GE-612T vs GM-5157A(2016.02.21)
コメント
この記事へのコメントは終了しました。
« 「写真から星の座標を得る」アプリ・JPEG対応版 | トップページ | 左脇の下の体温は右より0.3℃高かった - 腋窩温の測定 »
こんばんは
お久しぶりですね (^_^)
秋月の通販の新商品情報の所はちょこちょこ覗いてはいるのですがぁ
MCP23017は情報に出ていなかった様な気が....
良いのを紹介してもらいました w
(ネタが増えましたね ww)
今度何かを注文する時に手に入れてみます。
投稿: きむしげ | 2015年7月24日 (金) 23時26分
はい、いろいろ考えたり工夫したりするより、その目的にあったものを探すというのが手っ取り早いようです (^^;;
ただこれはほんとに千石電商でレジに向かっていたらたまたま目に入ったというものです。
私のはほんとに紹介だけの雑な記事なので、きむしげさんの記事(とソース)を期待しています (^^)
投稿: セッピーナ | 2015年7月25日 (土) 08時46分