Wiring1.0上でターゲットMCUをATmega644P/1284Pに選択し、NewSoftSerialを使おうとした場合、うまく動かない。
個人的な事象として、JPEGカメラをローバー(ATmega1284P)で設定してみたところ動かなかったので、調べてみた。
ライブラリ内にあるNewSoftSerial.cppを見ると、ピン割り込み設定において、ピン割り当てが互換ボードの一つである、Reduino:LEDheadに設定されている。
このボードとWiringS/互換機ではピン割り当てがだいぶ違う。D7までのピンなら動作した理由は、ここだけ割り込みピンとの対応が共通であるからだった。
これをWiringS用に書き換えてみる。
\Wiring\cores\AVR8Bit\libraries\NewSoftSerial\NewSoftSerial.cppの中で、
644Pの該当箇所を以下のように書き換える。
変更点
・ATmega1284P追加
・Wiring用にピン割り込み関連のレジスタの番号とIDE上で扱うポート番号を対応させる作業)
----------------------------------------------------------------
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)
//for WiringS
#define digitalPinToPCICR(p) ( ((p) >= 0 && (p) <= 31) ? (&PCICR) : ((uint8_t *)NULL) )
//for Wiring S
#define digitalPinToPCICRbit(p) ( ((p) <= 7) ? 3 : \
( ((p) <= 15) ? 2 : \
( ((p) <= 23) ? 1 : \
0 ) ) )
#define digitalPinToPCMSK(p) ( ((p) <= 7) ? (&PCMSK3) : \
( ((p) <= 15) ? (&PCMSK2) : \
( ((p) <= 23) ? (&PCMSK1) : \
( ((p) <= 31) ? (&PCMSK0) : \
((uint8_t *)NULL) ) ) ) )
#define digitalPinToPCMSKbit(p) ( ((p) <= 7) ? (p) : \
( ((p) <= 15) ? ((p) - 8) : \
( ((p) <= 23) ? ((p)- 16) : \
((p) - 24) ) ) )
----------------------------------------------------------------
これで644P/1284PのどのピンでもNewSoftSerialが使えるようになるはず。
デフォルトでWiring Sといった公式?ボードに対応してないのは深遠な理由がありそうでなさそうだが・・・うむ。
なんだかんだで、最近は環境がWiring1.0に移行しつつある・・・。
個人的な事象として、JPEGカメラをローバー(ATmega1284P)で設定してみたところ動かなかったので、調べてみた。
ライブラリ内にあるNewSoftSerial.cppを見ると、ピン割り込み設定において、ピン割り当てが互換ボードの一つである、Reduino:LEDheadに設定されている。
このボードとWiringS/互換機ではピン割り当てがだいぶ違う。D7までのピンなら動作した理由は、ここだけ割り込みピンとの対応が共通であるからだった。
これをWiringS用に書き換えてみる。
\Wiring\cores\AVR8Bit\libraries\NewSoftSerial\NewSoftSerial.cppの中で、
644Pの該当箇所を以下のように書き換える。
変更点
・ATmega1284P追加
・Wiring用にピン割り込み関連のレジスタの番号とIDE上で扱うポート番号を対応させる作業)
----------------------------------------------------------------
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)
//for WiringS
#define digitalPinToPCICR(p) ( ((p) >= 0 && (p) <= 31) ? (&PCICR) : ((uint8_t *)NULL) )
//for Wiring S
#define digitalPinToPCICRbit(p) ( ((p) <= 7) ? 3 : \
( ((p) <= 15) ? 2 : \
( ((p) <= 23) ? 1 : \
0 ) ) )
#define digitalPinToPCMSK(p) ( ((p) <= 7) ? (&PCMSK3) : \
( ((p) <= 15) ? (&PCMSK2) : \
( ((p) <= 23) ? (&PCMSK1) : \
( ((p) <= 31) ? (&PCMSK0) : \
((uint8_t *)NULL) ) ) ) )
#define digitalPinToPCMSKbit(p) ( ((p) <= 7) ? (p) : \
( ((p) <= 15) ? ((p) - 8) : \
( ((p) <= 23) ? ((p)- 16) : \
((p) - 24) ) ) )
----------------------------------------------------------------
これで644P/1284PのどのピンでもNewSoftSerialが使えるようになるはず。
デフォルトでWiring Sといった公式?ボードに対応してないのは深遠な理由がありそうでなさそうだが・・・うむ。
なんだかんだで、最近は環境がWiring1.0に移行しつつある・・・。
1284Pのピンをだいぶ使いきって、あとはアナログピンが幾つかだけという状態。 |