« Arduinoメールチェッカー(その3) | トップページ | グラフィック・ディスプレイ表示の高速化 »

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メールチェッカー(その3) | トップページ | グラフィック・ディスプレイ表示の高速化 »

Arduino」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« Arduinoメールチェッカー(その3) | トップページ | グラフィック・ディスプレイ表示の高速化 »