・2023年版 Arduinoを使う際の注意 USBシリアル変換部がついているので、Arduino UNO(R3)ボードをたまに使うのです。 ArduinoはAVRと同じレジスタ操作でも動作しますし、そのほうが動作が速いので 私は専らAVRと同じ書き方で使っているのですが、その中で気を付けなければならないことのご紹介。 ArduinoをArduinoの記述で使う方には何を書いているかわからないと思いますので、 ブラウザバックしてうちのサイトの他のコンテンツで楽しんでください。 ― ・最初から全割込み許可されている これは最大の注意ポイントです。 つまり、個別に割込み許可をした段階で、割込みが発生するということです。 setupの中でタイマーやピン割込みレジスタを初期設定していき、 その最後で割込み許可を出すと、sei();せずとも割込みが発生します。(sei();されている状態なので。) AVRをそのまま使う場合は絶対に発生しない現象なので、わかるまで混乱しました。 解決策としては、setupの最後に個別の割込み許可を出すか、 setupの先頭でcli();して全割込み拒否をしてから初期設定等を記述します。 後者の場合は、もちろん必要に応じてsei();する必要があります。 ・タイマー関係のレジスタも初期値がAVRマイコンの初期値と異なる部分がある そのため、AVRマイコンの初期値を信じて初期設定すると、思った動作と違う振る舞いをすることがあります。 レジスタの値を一度読みこんで確認するか、先に0を書いてしまうと安心です。 なお、 レジスタ名|(1<<(1にしたいビット)) という書き方ではなく、 レジスタ名=代入する数値; と直接記述する場合は、この問題は生じません。 わかりやすく書くとうまくいかないパターンがあるの、怖すぎでは…。 ・setupはsetupするところではない、グローバル変数はsetupの前に書く Arduinoでは、setup()のなかに最初1度だけ実行されるプログラムを書きます。 割込みの初期設定やポートの初期設定などですね。 AVRでいうところの、main()より後、while(1);より前に書く部分をここに記述する感じになります。 このsetupは、関数です(たぶん)。 setupという関数を1度実行して、そのあとにloopを繰り返し実行するというのがArduinoの動作です。 なので、setupの中で変数を定義すると、それはローカル変数になってしまいます。 グローバル変数としたい場合は、setupの前に書く必要があります。 ・USBで使う際は5V動作になる(ハードウェアの問題) 3.3Vでも十分に動くマイコンが使われているボードですが、 このボードにUSBから給電する場合、絶対に5V動作になってしまいます。 最近は3.3Vのデバイスも多いので、気を付けないといけません。 ――― 2023年7月。 2023年8月追記。 ――― トップページへ © 2023 Nono |
|