ArduinoライブラリのMCUタイプ依存性
2009/8/14追記:
以下に示す問題は最新のIDE-0017で改善されました。
Arduinoライブラリの中に、Duemilanove (ATMega168/328)からMega (ATMega1280)などMCUのタイプを変えた場合に動かなくなるものがあります。以下のライブラリが該当します。
- MsTimer2(タイマー割り込みライブラリ。標準ライブラリではなく、Contributed Libraryですが、周期処理を行う際に便利)
- Wire (I2C/TWIのライブラリ)
原因は分かっていません。Timer2やTWI関連のレジスタマッピングが上記のMCUで異なるわけではありませんし。MsTimer2.cppでは、以下のように、MCUタイプ毎のコードがありますが、168/328/1280は同じif definedブロック内です。
void MsTimer2::start() {
count = 0;
overflowing = 0;
#if defined (__AVR_ATmega168__) || defined (__AVR_ATmega48__) || defined (__AVR_ATmega88__) || defined (__AVR_ATmega328P__) || (__AVR_ATmega1280__) →同じif def内
TCNT2 = tcnt2;
TIMSK2 |= (1<<TOIE2);
#elif defined (__AVR_ATmega128__)
TCNT2 = tcnt2;
TIMSK |= (1<<TOIE2);
#elif defined (__AVR_ATmega8__)
TCNT2 = tcnt2;
TIMSK |= (1<<TOIE2);
#endif
}
インストール時にデフォルトで入っているライブラリのコンパイル済みオブジェクトはどうもATMega168/328用にコンパイルしてあるみたいで、Arduino Mega (ATMega1280)をターゲットにリンクすると上記のライブラリはMega上ではうまく動きません。
hardware\cores\arduino\配下に存在する、IOピンの定義など(pins_arduino.c)もろにボードタイプ(MCU種別)に依存するコードは、スケッチ毎のappletフォルダーにオブジェクトファイルを作ってリンクするため、ボードタイプが変わっても影響がありません。一方、ライブラリはライブラリフォルダー内のオブジェクトファイルをリンクする(ボードタイプを変えても自動的に再コンパイルしてくれない)ため、ボードタイプの変更に追随できないケースがあるようです。
そんなときは、ライブラリのフォルダーにある、xxx.o(例えば、hardware\libraries\MsTimer2\MsTimer2.o)を一旦削除して再コンパイルすると動くようになります。
| 固定リンク
「Arduino」カテゴリの記事
- ArduinoでXMLを解析する(2009.08.25)
- Arduino RSSリーダー(2009.09.06)
- Arduino 0017(2009.08.14)
- SPIデバイスの混在とSS信号の初期状態(2009.08.31)
- Arduino Nano 3.0 Get(2009.08.12)

コメント