
もはやブログを期待しているコアな方からも総スカン喰らいそうな覚書シリーズ。
多分、読んでいる人は何かの呪いの呪文にしか見えない恐れあり。
ホント、読まなくて結構ですw
以下、覚書。
まずは内部割込の決まりごと。
主要AVRマイコンに搭載されるTimerは以下の用途が決まっています。
①Timer0
8bitのタイマーでArduinoの時間の管理用。
delay(), millis(), micros()など。
UNOでは5,6番ピンのPWMでも利用される。
②Timer1
16bitのタイマーでUNOではServoライブラリと9,10番ピンのPWMで利用。
③Timer2
8bitのタイマーでUNOではtone()と3,11番ピンのPWMで利用。
使用するPIN固有機能を使いたい場合、そのTimerは専有されるので他Timerを使用する必要があります。
内部タイマを利用する場合、一般的にMsTimer2を使用するがこれはTimer2を使うためのライブラリ。
TimerOne、TimerThreeライブラリを使うと他のTimerも使う事が出来ます。
(TimerThreeはMEGA用のライブラリ)
MsTimer2がミリ秒で時間を指定するのに対し、TimerOneやTimerThreeはマイクロ秒で指定。
ここは注意する必要があります。
外部割込、内部割込共にISRからの引数渡しが使えません。
戻り値もありません。
変数を渡したい場合は、グローバル変数としvolatile属性を与える必要があります。
loop()内でクリティカルな処理をしたい場合、noInterrupts()で割込み禁止、interrupts()で解除が行えるが割込信号はスタックされずに読み捨て。
Serial通信もデータロストする可能性があります。
外部割込について
arduino miniが使用できる外部割込はint0とint1の2つ。
PINは2番、3番にアサインされているがattachInterrupt()の引数でPINアサインする場合、機種依存を避けるためdigitalPinToInterrupt()を使う事が推奨される。
引数にINT番号の0/1を指定するのではなくdigitalPinToInterrupt(2)や(3)を使用する。
スケッチ内に複数のISRがあっても同時には一つだけが実行されます。
他のISRは現在のISRの終了後、優先度に応じた順序で実行されます。
millis()の計測は割り込みに依存しているのでのISRの実行中には増加しない。
delay()の動作にも割り込みが必要なのでISRの中から呼ばれても動作しない。
micros()は最初は動作するが1~2秒後には乱れてしまう。
delayMicroseconds()は(割り込みに依存する)カウンタを利用しないので通常通り動作する。
外部割込のトリガモードはLOW,CHANGE,RISEING,FALLING,HIGHが使用可能。
車載の場合はCHANGEかRISEING/FLLINGの使い分けで対処。
AVRはデフォルト外部割込許可。
ウォッチドッグタイマの注意点
#include
によってWDTを使用する場合、ATmega88以降で割り込みを生成するオプションがあるデバイスではウォッチドッグにより再起動が繰返し実行される問題がある。
この場合、回避するためのコードが公開されている。
http://milkandlait.blogspot.com/2014/06/avr_3.html
その他、外部割込みのPINを増やしたい場合はこちらを参照。
http://fugufugu.blog.jp/archives/1068651729.html
PINではなくPORT単位での割込みになるが増やすことは可能。ただし、トリガモードの指定は出来ない。
ISRの中でPINをReadして自分で状態を確認する必要あり。
(感想)
PICのような厳密な管理が出来ないような印象。
むしろ緩すぎて「大丈夫か?」レベルw
analogRead()に要する時間を気にしていたが調べたやつがいるw
世の中、大した奴がいたもんだ。
100マイクロ秒前後。
構造上、コンデンサの放電を利用するので仕方ないが「遅い!」
1msで内部処理を定義する場合は、処理内でanalogRead()をコールするのは不適切。
予想ではあるがanalogRead中は割込み禁止になっていると思う。
割込信号はバッファされないらしいのでこれは問題。
setup()の中で呼ぶだけならいいんだけど、シーケンシャルの時間制御はどうーしよう・・・。
そんなに厳密に管理しなくていいか・・・。
(割込とは別件)
arduinoのpinMode()で引数にPULLUPが使えるが入力される電流の制限があるため内部プルアップは推奨されていないらしい。
結構面倒臭ぇな、コレ。
今回、NeoPixelのドライブに高容量の電源が必要な事からDCDC降圧器(中華製150円ぐらい)を利用する計画ですが電圧変動率が不明。
このDCDCから直接Arduinoに電源を供給しようと考えていますが、車載の電圧の揺れをどのくらい吸収できるか未知数。
arduino mini用に12V→5Vの三端子レギュレータを用意するか悩み中。
(RAWピンは上限12Vなので微妙)
過去に中華製のDCDCを買ったことあるけどガッツリ電流流すと電圧が結構落ちた。
全然DCDCになってないw
抵抗2つで分圧するレベルだったw
12Vの外部入力トリガ(ウィンカー線)はフォトトライアックで回路から分離予定。
分圧してもいいけど入力電圧の許容範囲が判らず、車載の電圧の揺れには対応できない可能性あり。
トータルのパーツ代が上がるのが欠点かな。
それからNeoPixelに入れるdata線、MOSFTEで信号ブーストする必要あり?
NeoPixelは転送レートが遅いので多少信号が鈍っても制御できると思うけど、エッジレートを保証する回路が必要だった場合、私は対策を持ち合わせていません。
みんなどうしているんだろう?
今後の課題。
あとはノイズ対策か。
使わない端子は全部GNDに落としておいた方がよい?
そこまでシビアじゃないのかは不明。PICレベルなら不要と推測。
一応、気にすべき内容は網羅したつもり。
WiFiやBluetoothについては次のステップにして今は無視。
殴り書きレベルやなぁ。
ブログ一覧
Posted at
2018/08/08 17:48:21