1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ATmega328PBでArduinoのWire(I2C)ライブラリを使う際の留意事項

Last updated at Posted at 2020-05-18

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)も増えていますが、こちらは問題なく動作するようです。
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?