前回、前々回とI2C接続のIO Expander、MCP23017をM5Stackに接続するの回でした。シツコク今回も接続。以前と異なるのは「同じI2Cバスに2個接続」「I2Cバスは3.3VだけれどもIO Expanderは外部5V電源」という点。別シリーズで扱っている古代のマイコンのDMAコントローラにするためね。
※「MicroPython的午睡」投稿順 Indexはこちら
※M5Stack Grayに書き込んだUIFlow2.0 (Alpha-27)対応のMicroPython処理系とWindowsパソコン上で動作しているThonny 4.0.1で動作確認しています。
古いハードを掘り起こし
忘却力の老人はほぼほぼ忘れておったのですが、Raspberry Pi Picoをホストにしてそのようなハードウエアを工作(珍しく半田付けで)してあったのです。I2C側は3.3V動作、IOExpander側は5V電源動作のつもりのもの。相当前に作った後、箱の奥底で「熟成」していたので動くかどうか怪しいデス。今回は古いハードを掘り起こし、M5Stackに接続しなおし、I2Cスキャンをかけて外部5V電源に接続しているMCP23017が2個認識されるところまで確認。
今回はMCP23017で制御したい対象は明確であります。以下の回などで取り扱っている、古代の8ビット・マイクロプロセッサ「インテル8085(コンパチ品だけれども)」に対して、ソフトウエアDMAコントローラにしようと。
レトロな(13) 74HC74で漏れなく1ウエイト、必要ないけど入れてみる
8085にSRAMを接続し、主記憶としたものにM5StackのMicroPython(UIFlow2)からDMAをかけて、オブジェクト・プログラムを書き込んであるHEXファイルからそのSRAM上に機械語コードを展開しようという目論見であります(まだ肝心のSRAMモジュール作ってないけど。)
今回実験部分の回路図が以下に(まだ8085には接続してありません。)
次のステップとして、まずはSRAMに接続して上記の「DMAコントローラ」からSRAMを読み書きできることを確認したいと思うとります。そのため、SRAM載せられるようにブレッドボードは大き目(かなり古い奴をお値引き価格で買ったもの。)
動作確認
動作確認には、以前にも使用しているI2CスキャンのMicroPythonスクリプトをちょい直しで使いました。MCP23017はI2Cアドレス0x20から0x27まで8個接続できます。今回は制御信号類が0x20番地のMCP23017、アドレス・データバス(8085はマルチプレクス・バス)は0x21番地のMCP23017としたので2個づかいです。以下のスクリプトでは複数個のMCP23017があってもちゃんと報告するようになってます。
# i2cSCAN.py from machine import I2C, Pin import M5 def main(): M5.begin() print("M5Stack Gray, I2C0 SCAN") i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=100000) lis = i2c.scan() for device in lis: grp = device & 0x78 prt = device & 0x07 if device== 0x75: print("IP5306, Power MGR ", end="") elif device== 0x68: print("MPU6886, 6 axis Motion Sensor ", end="") elif device== 0x10: print("BMM150, 3 axis Magnetic Sensor ", end="") elif grp == 0x20: print("MCP23017, IO Expander {0} ".format(prt), end="") else: print("UNKNOWN DEVICE ", end="") print("found at ADR=0x{0:02X}".format(device)) if __name__ == "__main__": main()が
画面キャプチャを忘れましたが、ちゃんとMCP23017が2個認識されておりますぞ。後はDMAのプログラムを書くだけだ。その前にSRAM接続せねば。