pp.614ff.
テキストはI2C接続のリアルタイムクロックを試しているが、この組み合わせはAVR Programming: Learning to Write Software for Hardware カテゴリーの記事一覧 -のときにさんざんやったので、ここではAdafruit MPR121 静電容量センサ(12ch) - スイッチサイエンスを使ってみる。ブレークアウトボードにレギュレーターとレベルシフターとが実装されているので電源電圧(IOも)は3.3 V~5 Vでいける。IRQ端子はオープンドレイン。
Wがwrite、aがACK、Sがrepeated start、Rがread、~aがNACK。
5Aがスレーブアドレス。
00がスレーブのレジスタアドレス。
5Aがスレーブアドレス。
E0が電極7:0の状態。
01が電極11:8の状態。
Atmel Studioプロジェクト一式: https://github.com/ti-nspire/AVR/tree/master/MPR121_touch_sensor_0/test_C
I2C関連のみ: I2C library for ATmega328P · GitHub
#define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> //#include <util/delay.h> #include "I2CClass.h" // 電極の状態が変化したら、電極11:0の状態をPD7:4とPB7:0とへ出力して確かめる。 ISR(INT1_vect){ uint8_t buff[2]; i2c.read(0x5A, 0x00, 2, buff); // (どのスレーブの, どこから, 何バイトを, どこへ)読み出す。 PORTB = buff[0]; // 電極7:0 PORTD = (buff[1] & 0x0F) << 4; // 電極11:8 } int main(){ EIMSK |= (1 << INT1); // INT1 (外部割り込み要求1)を有効化する。 EICRA |= (1 << ISC11); // falling edgeで割り込む。 sei(); DDRB = 0xFF; DDRD = 0xF0; i2c.init(); // ソフトリセットをかける。 i2c.write(0x5A, 0x80, 0x63); // (どのスレーブの, どこへ, 1バイトを)書き込む。 // 12本の電極を全部タッチセンサーにする。 i2c.write(0x5A, 0x5E, 12); // (どのスレーブの, どこへ, 1バイトを)書き込む。 while(1); return 0; }