ラジオ少年の楽しい電子工作、その他

AVRを使った簡単な回路の実験、そして日々のちょっとした出来事を書きます。

WSN176 I2C 16ビット I/Oエクスパンダ(3)

2012年02月16日 | 日記

色々やってみて取りあえずこうすればプログラムで書いた順番通りに動く様になりました。

先ずconfiguration reg.を以下の様に設定します。BANK=1,disable sequential Operation

    //CONFIGURATION REGISTERの設定
    i2c_start(SLAVE_ADR, TW_WRITE);
    i2c_write(0x05);// reg-adrs IOCON(A)選択
    i2c_write(0xA0);// BANK=1, Sequencial operation = disable
    i2c_stop();// ストップ・コンディション発行
   
    i2c_start(SLAVE_ADR, TW_WRITE);
    i2c_write(0x15);// reg-adrs IOCON(B)選択
    i2c_write(0xA0);// BANK=1, Sequencial operation = disable
    i2c_stop();// ストップ・コンディション発行

PORTA,Bを出力に設定

    // GPA0~GPA7の全ポートを出力ポートに設定
    i2c_start(SLAVE_ADR, TW_WRITE);// スタート・コンディション発行
    i2c_write(0x00);// reg-adrs IODIRA選択
    i2c_write(0x00);// 設定値 0x00, output
    i2c_stop();// ストップ・コンディション発行
   
    // GPB0~GPB7の全ポートを出力ポートに設定
    i2c_start(SLAVE_ADR, TW_WRITE);// スタート・コンディション発行
    i2c_write(0x10);// reg-adrs IODIRB選択
    i2c_write(0x00);// 設定値 0x00, output
    i2c_stop();// ストップ・コンディション発行

PORTに以下のようにデータを書き込みます。

    // GPAポートに"0" or "1"を出力
        i2c_start(SLAVE_ADR, TW_WRITE);// スタート・コンディション発行
        i2c_write(0x09);// reg-adrs GPIOA選択
        i2c_write(0xff);// LED Off、 1番
        delay_ms(500);
        i2c_write(0xfe);// LED0 On、2番
        delay_ms(500);
        i2c_write(0xfc);// LED1 ON、3番
        delay_ms(500);
        i2c_write(0xff);// LED0,1 OFF、4番
        delay_ms(500);
        i2c_stop();
       
        // GPBポートに"0" or "1"を出力
        i2c_start(SLAVE_ADR, TW_WRITE);
            i2c_write(0x19);// reg-adrs GPIOB選択
        i2c_write(0xff);// LED Off、5番
            delay_ms(500);
        i2c_write(0xfc);// LED0,1 On、6番
            delay_ms(500);
            i2c_write(0xff);//LED0,1 Off、7番
            delay_ms(500);
            i2c_stop();// ストップ・コンディション発行

この結果はプログラムの順番に(1番~7番)のLEDがオン、オフします。

MCP23017のresetを出すとデフォルトに戻ってしまうので注意が必要です。

このI/OエキスパンダにグラフィックLCDをつなごうと考えているのですが、直にmega328に

つないだ方が良さそうな気がします。

 

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

WSN176 I2C 16ビット I/Oエクスパンダ(2)

2012年02月16日 | 日記

MCP23017が搭載されてWSN176基板の動作を検証?してみました。

MCP23017の仕様書をざっと読んでみたが、どうも今ひとつ理解が出来ません。

プログラムでその部分をどうなるのかやって見ました。

仕様書にはBYTE MODE AND SEQUENTIAL MODEとあります。デフォルトではどうもSequential

modeになるらしい。

下記のようにA,B PORTを出力に設定します。

    i2c_start(SLAVE_ADR, TW_WRITE);// スタート・コンディション発行
    i2c_write(0x00);// reg-adrs IODIRA選択
    i2c_write(0x00);// 設定値 0x00
    i2c_stop();// ストップ・コンディション発行
   
   
    i2c_start(SLAVE_ADR, TW_WRITE);// スタート・コンディション発行
    i2c_write(0x01);// reg-adrs IODIRB選択
    i2c_write(0x00);// 設定値 0x00
    i2c_stop();// ストップ・コンディション発行

 

GPIOA、GPIOBにデータを書き込みます。PORTにはLEDがつながっています。

    i2c_start(SLAVE_ADR, TW_WRITE);// スタート・コンディション発行
        i2c_write(0x12);// reg-adrs GPIOA選択
        i2c_write(0xfe);//   A_LED0 on
            delay_ms(500);
        i2c_write(0xfc);//   B_LED0,1 on   
            delay_ms(500);
        i2c_write(0xff);//   A_LED0 off
            delay_ms(500);
        i2c_stop();// ストップ・コンディション発行
   
        i2c_start(SLAVE_ADR, TW_WRITE);
        i2c_write(0x13);// reg-adrs GPIOB選択
        i2c_write(0xfe);//   B_LED0 on 
        delay_ms(500);
        i2c_write(0xff);//   A_LED0,1 off 
        delay_ms(500);
            i2c_write(0xff);// B_LED0 off 
        delay_ms(500);
       
        i2c_stop();

このプログラムはGPIOAのLED0点灯、500ms後にLED1点灯、500ms後、LED0,1消灯

となり、次にGPIOBのLED0が点灯、500ms後に消灯するのではないかと考えたのですが

実際はそうはならなくて青色のコメントの様な動きをしています。

仕様書を見ると、デフォルトではアドレスポインタなる機能が働きアドレスを自動的にインクリメント

するようです。

この場合、GPIOA、GPIOBを使っていますので、これを指定するアドレスが勝手にトグルするのです。

ですから、プログラムで順番にLEDのオン、オフを指定しても、その通りには動いてくれません。

もう少し複雑な動きをさせるにはこの機能は使いづらいモノになります。

もう一つ分からないのはBANK0,1です。

デフォルトではBANK0になるようです。

BANK1に切り替えてGPIOA,GPIOBをBYTE MODEで使えるようにプログラムする必要が有りそうです。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする