みなさん、ATMega328PB、使ってますか?
Arduino UNOに使われているのはATMega328Pですが、その上位互換チップです。
IOも増えて各種ペリフェラルも増えてしかも安くなってるといいことずくめなんですが、表面実装部品オンリーなのと、Arduino UNOがあまりに強すぎるのであまり目立ちませんね。
しかし、オリジナル基板で使う場合はPBを選択しない理由がありません。上位互換で安いので。(大事なことなので2回(ry)
チップの定義が違うのでArduinoベースで使う時にはひと工夫必要になることがたびたびあります。
コンパイルと書き込みについてはすでにググるといくつか解説されている方がいらっしゃるのでそちらにお任せするとして、今回はタイマーです。
Microsecオーダーで割り込みを使いたかったので、Arduinoではよく使われるTimerOne.hをダウンロードしました。が、コンパイル通らない。
通常は、
Arduinoのワークスペース\libraries\TimerOne\config
の中に「known_16bit_timers.h」があるはずなので
// Uno, Duemilanove, LilyPad, etc
//
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
#define TIMER1_A_PIN 9
#define TIMER1_B_PIN 10
#define TIMER1_ICP_PIN 8
#define TIMER1_CLK_PIN 5
この部分を
// Uno, Duemilanove, LilyPad, etc
//
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328PB__)
#define TIMER1_A_PIN 9
#define TIMER1_B_PIN 10
#define TIMER1_ICP_PIN 8
#define TIMER1_CLK_PIN 5
こう変えます。これでタイマー1は使えるようになりました。
しかし、なぜかわからないがタイマー1を使うとdelay関数が死ぬ。delayが死ぬのはタイマー0だよな…と思いつつ、色々やったけどわからなかったので、PBになって増えたタイマー3を使ってみます。ライブラリマネージャーでTimerThreeで検索すると出てきます。
こちらもチップ定義を変更すればよい(場所は上のTimerOneをTimerThreeに置き換えて読んで)…と思いきや、
// Uno, Duemilanove, LilyPad, etc
//
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
#define TIMER1_A_PIN 9
#define TIMER1_B_PIN 10
#define TIMER1_ICP_PIN 8
#define TIMER1_CLK_PIN 5
TIMER3の定義がありません。当たり前だ。だってPBじゃないとTIMER3がないんだもの。
というわけで定義を追加します。
// Uno, Duemilanove, LilyPad, etc
//
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
#define TIMER1_A_PIN 9
#define TIMER1_B_PIN 10
#define TIMER1_ICP_PIN 8
#define TIMER1_CLK_PIN 5
// ATMega328PB
//
#elif defined(__AVR_ATmega328PB__)
#define TIMER1_A_PIN 9
#define TIMER1_B_PIN 10
#define TIMER1_ICP_PIN 8
#define TIMER1_CLK_PIN 5
#define TIMER3_A_PIN 0
#define TIMER3_B_PIN 2
#define TIMER3_ICP_PIN 22
#define TIMER3_CLK_PIN 23
タイマーのピンアサインはデータシートより。
Serial0と被ってるんですね。内部で使う分には関係ありません。
こちらを使うとdelay関数が普通に使えました。よかったね。
以上です。いかがだったでしょうか?
コメントを残す