色々やってみて取りあえずこうすればプログラムで書いた順番通りに動く様になりました。
先ず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に
つないだ方が良さそうな気がします。