ATmega328PBはArduinoUNO等に用いられているATmega328Pの後継です。
後方互換性があるので大体のコードはそのまま動くのですが、Wire(I2C)ライブラリについては修正が必要となります。
修正箇所
ATmega328PBはATmega328Pと比較してI2Cインターフェイスが1系統から2系統へ増えています。そのため、レジスタと割り込みベクタの呼称が少し変更されています。Wireライブラリ内のtwi.h
に以下の定義を追加することで対応することができます。
twi.h
#define TWBR TWBR0
#define TWSR TWSR0
#define TWAR TWAR0
#define TWDR TWDR0
#define TWCR TWCR0
#define TWAMR TWAMR0
#define TWI_vect TWI0_vect
#define TWI_vect_num TWI0_vect_num
要するに連番が追加されただけです。連番を弄れば別のI2Cインターフェイスを割り当てることができると思います。特に割り込みベクタの定義(TWI_vect
)は修正を忘れていてもコンパイルが通ってしまうので要注意です。
補足
- ArduinoIDEの代わりにAtmelStudioを用いています。プロジェクト毎にArduinoIDEからライブラリをコピーしてくるので、元のライブラリを破壊せずに済みます。また、debugWIREが非常に便利です。Atmel-ICEは少々お高いですが(秋月で1万円)。。。
- AtmelStudioでのプロジェクト作成時は、"Arduino Pro or Pro Mini"を選択しました。プロジェクトを作成したら、Project->Properties->DeviceをATmega328PBに変更してあげます。プロジェクトは2つ("ArduinoCore"と自分が名付けたプロジェクト)生成されるので、両方について変更します。
- SPIも増えているので同様の問題が発生するかもです(未確認)。UART(Serial)も増えていますが、こちらは問題なく動作するようです。