Arduinoの割り込みを用いたスケッチについて。
割り込みルーチンの中で、I2CLCDへ書き込みをしようとすると、とても奇妙なことが起こった。
setup の前に #include <I2CLCD.h> をしておく。void setup() { } のなかで、I2CLCD.begin(32); をしておく。attachInterrupt(0, intpros0, CHANGE); のように割り込みの準備をしておく。割り込み処理を準備しておく。void intpro0(){ } 。この{ }の中に、tone(snd,600,1000); その下にI2CLCD.print(" "); のようにしておく。
このような状態で、スケッチを書きこむと、音がしないのである。toneが働かないのである。そこで、//I2CLCD.print(" "); のように後ろの文をコメント化すると、音がする。後ろの命令が前の命令を妨げるのである。通常は考えられない現象だ。この辺のことがよくわからず、丸2日くらい悩み続けた。
解決策として、割り込みを抜けた後で、割り込みから抜けたフラグか何かを目印にして、割り込みの外で(通常のloopのなかで)I2CLCDへの書き込みをするとよい。
おそらくコンパイルするときに割り込みの何かとI2CLCDのなにかが作用し、変なことが起こるのだろう。よくわからないが。
今回の現象は、I2CLCD,RTC,DHT20,マイクロSDをつないだ状態でおこった。スケッチもとても大きなものなので、他の接続機器の影響かもしれない。ほかの、includeしたライブラリの影響かもしれない。割り込みと何か干渉するのはI2C接続なのか、LCDなのか、あるいは、それ以外につないでいる機器なのかわからない。それを丁寧に調べてはいない。ただ、最もそれらしいと考えられることを、この現象に悩む人がいるだろうということで、記録として公開する。
使ったのは、3.3V、8MHzの改造したarduinoUno互換品。秋月のAE-AQM1602A(KIT)。ライブラリはI2CLCD。
0コメント