I2Cコントローラ(その2) 2017.5.14

(前回まではこちら)

GW中の帰省先ですこしいじってみました。いわゆる「プレ夏休みの工作」ですね(笑)。

安い!
amazonをみていると、安いモジュールが色々とみつかります。
リアルタイムクロックモジュールが200円でありました。これに搭載されているDS3231だけでも、
DIGIKEYで買おうとすると2000個単位でも500円くらいします。このモジュールにはさらにEEPROMも
搭載されているのですが、これがなぜ200円で作れるのか不思議です。


これがなんと200円です。


ちなみに、こんな感じで売られいます。

動くのかな?

ちゃんと動くのかどうかまずは手持ちのI2Cコントローラでチェックです。

I2Cコントローラ基板に取り付けてチェックです。


問題なく動くようです。こりゃいい買い物かもです。

折角なので・・・

頂き物のLEDがあったので、それをつかって時計を作ってみました。
ダイナミック点灯としているのでトランジスタが結構必要でした。

GWの工作の完成です!

さて、I2Cコントローラのマニュアルを作らないと、そろそろ使い方を忘れそうです。

帰省先でのお楽しみ。 2017.10.3

秋月電子で購入したI2Cで動作するIOエキスパンダMCP23017を使ってみました。
そのICは100円と安くていいです。DIPなのですこしパッケージが大きいので、DAC基板には
使いにくいところはありますが、基板サイズに余裕があれば大いにつかいたいところです。

I2Sで動くIOエキスパンダーとLEDをつけてみました。

このIOエキスパンダは下表のようにすごく機能が豊富です。逆にどのようにつかうか迷ってしまいっます。



実際につかうのは
このIOエキスパンダを単なる出力ポートで使用するとした場合、使うレジスターは4つだけです。
最初のIODIRA,IODIRBはポートの入出力を決めるレジスターで既定値は入力になっていますが、ここにすべてゼロを入れて出力に定義します。
あとは、GPIOA、GPIOBに必要なデータを書き込むだけです。


使うレジスターは限られます。

たんにLEDを点灯させるだけの簡単なプログラムですが、これでも思うように動くとすこしうれしくなってきます。


こんな形でデータを入れます。I2Cアドレスは「4E」です。


LEDが点灯しました。

マニュアル作成!

ドラフト版ですがマニュアルを作成しました。マニュアルを作成すると、頭の整理にもなります。

さて、またこれから1週間ほど出張〜。なかなか作業がすすまないです。

使い方例 2017.10.12

使い方の例についてはマニュアルにもに例題を入れていますが、ここではDAI9211をつかってみましょう。
DAI9211はその素子にDIX9211を使っているので、結構レジスター操作が必要になりますが、
案外簡単にプログラムが組めます。
ここでは押したボタンに応じてSPDIF0〜3、AUXIN0、AUXIN1、AUXIN2の7つの入力を選択して出力するような
プロググラムとしてます。またSPDIF0〜3のときの出力フォーマットはI2Sとしてます。

まずは接続

I2C-OSの出力とDAI9211のPICと接続してI2C信号を共有します。

I2C-OS DAI9211 説明
VCC 接続せず
GND GND
SDL PICのA1(pin3) DIX9211のSDLに接続
SDA PICのA0(pin2) DIX9211のSDAに接続
RST PICのA2(pin4) DIX9211のRSTに接続

実際の接続した状態はこんな感じです。


こんな感じで接続します。

互いの基板にはI2C信号のプルアップ抵抗が付いているので、両方が動作するとすこし電流が流れすぎるので
I2C-OS側のプルアップを切り落とします。ちょうど切り落としやすいパターンをつけています。


I2Cのプルアップ抵抗がDAI9211とダブルのでI2C-OS側を切断しておきました。

またDAI9211では3.3Vで動作しているので、I2Cの制御信号のレベルも3.3Vにする必要があるので
マニュアルの5.(3)の3.3V動作に設定しておきます。

あとはプログラムを書くだけです。テキストエディタ等で下記のようなプログラムをかきます。
コマンドはマニュアルを参照してください。またDIX9211のレジスターの設定についてはDIX9211の
データシートを参照してください。

I 00 80         DAI9211 ADRS 0x80
N             NORMAL RESET
W 0A           WAKEUP 1sec
w 01           delay 1mS after reset
i 00 2F 04        I2S format
i 00 30 12        PLL AUTOMATIC
i 00 34 00        Initial SPDIF0 select
i 00 35 00
i 00 36 00
i 00 37 00
i 00 60 00
i 00 61 10
i 00 6b 00
S 01 00         LED 0 ON (default SPDIF0 select)
B 00 00 34 00     SPDIF0 select if B0 PUSH
B 00 00 35 00
B 00 00 36 00
B 00 00 37 00
B 00 00 60 00
B 00 00 61 10
B 00 00 6b 00
P 00 01 00       LED 0 ON(SPDIF0)
B 01 00 34 01     SPDIF1 select if B1 PUSH
B 01 00 35 01
B 01 00 36 01
B 01 00 37 00
B 01 00 60 00
B 01 00 61 10
B 01 00 6b 00
P 01 02 00      LED 1 ON(SPDIF1)
B 02 00 34 02    SPDIF2 select if B2 PUSH
B 02 00 35 02
B 02 00 36 02
B 02 00 37 00
B 02 00 60 00
B 02 00 61 10
B 02 00 6b 00
P 02 04 00      LED 2 ON(SPDIF2)
B 03 00 34 03    SPDIF3 select if B3 PUSH
B 03 00 35 03
B 03 00 36 03
B 03 00 37 00
B 03 00 60 00
B 03 00 61 10
B 03 00 6b 00
P 03 08 00      LED 3 ON(SPDIF3)
B 04 00 34 C2    AUXIN0 select if B4 PUSH
B 04 00 37 02
B 04 00 60 33
B 04 00 6b 33
P 04 10 00      LED 4 ON(AUXIN0)
B 05 00 34 C2    AUXIN1 select if B5 PUSH
B 05 00 37 03
B 05 00 6b 44
B 05 00 60 44
P 05 20 00      LED 5 ON(AUXIN1)
B 06 00 34 C2   AUXIN2 select if B6 PUSH
B 06 00 37 04
B 06 00 6b 55
B 06 00 60 55
P 06 40 00      LED 6 ON(AUXIN2)
e


動かしてみましょう!

I2C-OSとDAI9211の両方に電源を入れて、I2C-OS側はPCとUSB接続してターミナルソフトを起動します。
まずはプログラムのロードです。”L"コマンドを入れるとプログラムロードモードになるので、
あとはテキストを転送します。


  ”L"を入力してプログラムロードモードにします。



プログラムをテキスト転送します。



正常に転送できれば、自動的にPIC内のEEPROMに書き込みされます。

動かしてみましょう!

まずは簡単にターミナル上からコマンド入力して動作させます。”X"を入力すれば、
起動します。

”X”を入力して起動します。

あるいは、電源ONで自動起動させる場合はJP3を短絡させておけばOKです。

プログラムコマンドの容量は57行ですのでPICの容量(最大330行)から比べるとわずかでした。
なによりも、C言語でプログラムを組むよりもはるかに簡単です。ただ、複雑な制御には向きませんが
単純にI2Cデバイスをコントロールするには便利です。

必要ならI2C−OS基板からPICをはずして、ターゲット基板(DAI9211等)に実装すればいいでしょう。

ソフトの機能強化 2017.10.14

つかっていてDAIの入力切替だけなら、このままでまったく問題ないのですが、たとえば出力フォーマットも変更可能
なように、たとえば基板上のジャンパーピン設定に相当する機能があれば便利だな〜と思って、ソフトを改造することにしました。
ただし、この改造はプログラムの構造にもすこし影響がでるのですこし時間がかかるかな。

あと、1つのコマンドラインに使用するデータは今までは3バイトでしたが、今回の改造で4バイトになります。
そのため1024ByteのEEPROMをもつPICをつかってコマンド行は最大250(以前は330)になります。
まあ、250行もあれば十分ではありますが。

プログラム改造完了!

今回の改造でDIX9211をつかったプログラムを書き直しました。

C
C DAI9211 CONTROL COMMAND PROGRAM
C
C INITIALI ROUTINE
C
I 00 80             DAI9211 ADRS 0x80
N                 NORMAL RESET
W 0A               WAKEUP 1sec
w 01                delay 1mS after reset
J C0                JUMPER MASK
i 00 2F 04 00          I2S format
i 00 30 12 00          PLL AUTOMATIC
i 00 34 00 00          Initial SPDIF0 select
i 00 35 00 00
i 00 36 00 00
i 00 37 00 00
i 00 60 00 00
i 00 61 10 00
i 00 6b 00 00
S 01 00             LED 0 ON (default SPDIF0 select)
C
C REPEAT ROUTINE
C
B 00 00 34 00 00      SPDIF0 select if B0 PUSH
B 00 00 35 00 00
B 00 00 36 00 00
B 00 00 37 00 00
B 00 00 60 00 00
B 00 00 61 10 00
B 00 00 6b 00 00
B 01 00 34 01 00      SPDIF1 select if B1 PUSH
B 01 00 35 01 00
B 01 00 36 01 00
B 01 00 37 00 00
B 01 00 60 00 00
B 01 00 61 10 00
B 01 00 6b 00 00
B 02 00 34 02 00      SPDIF2 select if B2 PUSH
B 02 00 35 02 00
B 02 00 36 02 00
B 02 00 37 00 00
B 02 00 60 00 00
B 02 00 61 10 00
B 02 00 6b 00 00
B 03 00 34 03 00      SPDIF3 select if B3 PUSH
B 03 00 35 03 00
B 03 00 36 03 00
B 03 00 37 00 00
B 03 00 60 00 00
B 03 00 61 10 00
B 03 00 6b 00 00
B 04 00 34 C2 00      AUXIN0 select if B4 PUSH
B 04 00 37 02 00
B 04 00 60 33 00
B 04 00 6b 33 00
B 05 00 34 C2 00      AUXIN1 select if B5 PUSH
B 05 00 37 03 00
B 05 00 6b 44 00
B 05 00 60 44 00
C
C LED SETTING
C
P 00 01 00         LED 0 ON(SPDIF0)
P 01 02 00         LED 1 ON(SPDIF1)
P 02 04 00         LED 2 ON(SPDIF2)
P 03 08 00         LED 3 ON(SPDIF3)
P 04 10 00         LED 4 ON(SPDIF4)
P 05 20 00         LED 5 ON(SPDIF5)
C
C JUMPER SETTING ROUTINE
C
M C0 00 2F 04       I2S
M 80 00 2F 05       Left Justifiedf
M 40 00 2F 03       Right Justified 16Bit
M 00 00 2F 00       Right Justified 24Bit

e

朱記のジャンパーピン機能により追加された部分です。

J C0                JUMPER MASK

この行はPORT-BのB9,B6をジャンパーピン機能として定義することを意味しています。
すなわちC0=11000000 ですから1の部分がジャンパーピンとなるところです。

M C0 00 2F 04       I2S
M 80 00 2F 05       Left Justifiedf
M 40 00 2F 03       Right Justified 16Bit
M 00 00 2F 00       Right Justified 24Bit

ここはジャンパーピンの状態によりI2Cデバイスに送るデータを定義しています。

お茶目に

このプログラムでは切り替えを行ったチャンネルのLEDが点灯するようにしています。
ちょうど下記の部分です。

C
C LED SETTING
C
P 00 01 00         LED 0 ON(SPDIF0)
P 01 02 00         LED 1 ON(SPDIF1)
P 02 04 00         LED 2 ON(SPDIF2)
P 03 08 00         LED 3 ON(SPDIF3)
P 04 10 00         LED 4 ON(SPDIF4)
P 05 20 00         LED 5 ON(SPDIF5)


このままだと、単に点灯するだけですが、
ちょっとお茶目にちょっとだけフラッシュさせようとしたプログラムが下記になります。

C
C LED SETTING
C
P 00 01 05 LED 0 FLUSH(SPDIF0)
P 00 00 05 LED 0
P 00 01 05 LED 0
P 00 00 05 LED 0
P 00 01 05 LED 0
P 00 00 05 LED 0
P 00 01 00 LED 0
P 01 02 05 LED 1 FLUSH(SPDIF1)
P 01 00 05 LED 1
P 01 02 05 LED 1
P 01 00 05 LED 1
P 01 02 05 LED 1
P 01 00 05 LED 1
P 01 02 00 LED 1
P 02 04 05 LED 2 FLUSH(SPDIF2)
P 02 00 05 LED 2
P 02 04 05 LED 2
P 02 00 05 LED 2
P 02 04 05 LED 2
P 02 00 05 LED 2
P 02 04 00 LED 2
P 03 08 05 LED 3 FLUSH(SPDIF3)
P 03 00 05 LED
P 03 08 05 LED
P 03 00 05 LED
P 03 08 05 LED
P 03 00 05 LED
P 03 08 05 LED
P 04 10 05 LED 4 FLUSH(SPDIF4)
P 04 00 05 LED
P 04 10 05 LED
P 04 00 05 LED
P 04 10 05 LED
P 04 00 05 LED
P 04 10 00 LED
P 05 20 05 LED 5 FLUSH(SPDIF5)
P 05 00 05 LED
P 05 20 05 LED
P 05 00 05 LED
P 05 20 05 LED
P 05 00 05 LED
P 05 20 00 LED

なんとなく無駄に長くなりますが、それでも全体のコマンド行は90程度ですので、
PICのEEPROMの最大容量の250行から十分余裕があります。

さて、そろそリリースかな〜。

(続く・・かな?)