pp.614ff.(ただしテキストとはほぼ無関係)
参考:
- http://ww1.microchip.com/downloads/en/DeviceDoc/AN2934-Capacitive-Touch-Sensor-Design-Guide-00002934A.pdf
- http://ww1.microchip.com/downloads/jp/AppNotes/01250A_JP.pdf
パラメーターがたくさんあって何をどうすればよいのかわからない。わかるところだけを順番にいじってゆく。まずデフォルトのままタッチセンサーとして使う。電極はとりあえず簡易的なものではあるが4個だけ用意した。デフォルトのままだと、パワーオンリセット後およびソフトリセット後は短時間だけ反応しない。
メインファイル:
#define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> #include "MPR121Class.h" MPR121Class pad(0x5A); // (I2Cスレーブアドレス)で実体化する。 // 電極3:0の状態をPB3:0へ出力する。 ISR(INT1_vect){ PORTB = (uint8_t)(pad.get_touch_status() & 0x000F); } int main(){ DDRB = 0x0F; PORTB = 0x00; EIMSK |= (1 << INT1); // INT1 (外部割り込み要求1)を有効化する。 EICRA |= (1 << ISC11); // falling edgeで割り込む。 sei(); pad.soft_reset(); // ソフトリセットをかける。 pad.enable_touch(4); // (n)本の電極をタッチセンサーにする。 while(1); return 0; }
ライブラリヘッダーファイル:
#ifndef MPR121CLASS_H_ #define MPR121CLASS_H_ #include <avr/io.h> #include "I2CClass.h" // register addresses and others const uint8_t ECR = 0x5E; const uint8_t SOFT_RESET = 0x80; const uint8_t SOFT_RESET_VAl = 0x63; class MPR121Class{ private: uint8_t _SLA; // スレーブアドレス。 uint8_t get_ECR(); // ECRを取得する函数。 public: void soft_reset(); // ソフトリセットをかける函数。 uint16_t get_touch_status(); // 12本ぶん(12ビット)のタッチ状態を取得する函数。 void enable_touch(uint8_t ele_n); // (n)本の電極をタッチセンサーにする函数。0~12本。 // コンストラクタ MPR121Class(uint8_t slave_addr); }; #endif
ライブラリ実装ファイル:
#include "MPR121Class.h" void MPR121Class::soft_reset(){ i2c.write(_SLA, SOFT_RESET, SOFT_RESET_VAl); // (どのスレーブの, どのレジスタに, 1バイトを)書き込む。 } uint16_t MPR121Class::get_touch_status(){ uint8_t buff[2]; i2c.read(_SLA, 0x00, 2, buff); // (どのスレーブの, どのレジスタから, nバイトを, どのバッファに)読み出す。 return ((uint16_t)(buff[1] & 0x0F) << 8) | buff[0]; // 上位4ビット + 下位8ビットに並べ換えて返す。 } uint8_t MPR121Class::get_ECR(){ return i2c.read(_SLA, ECR); // (どのスレーブの, どのレジスタから) 1バイトを読み出す。 } void MPR121Class::enable_touch(uint8_t ele_n){ uint8_t sute = (get_ECR() & 0xF0) | ele_n; // ECRを読み出して下4ビットを消してそこだけ書き換える。 i2c.write(_SLA, ECR, sute); // (どのスレーブの, どのレジスタに, 1バイトを)書き込む。 } MPR121Class::MPR121Class(uint8_t slave_addr){ _SLA = slave_addr; i2c.init(); }