風で飛んでいくチラ裏

気ままに雑記メモ書き殴り。古い記事は別blogからの引っ越しなのでレイアウトがアレです。

PIC18F46J50 ECCPのコンペアマッチ・スペシャルイベントトリガでA/D変換がFire!

概要

ECCPのコンペアマッチ・スペシャルイベントトリガを使用すると、 もれなくコンペアマッチのタイミングでA/D変換開始のトリガが発行されるよ!
できるだけ正確な時間カウントをしたいと思ったとき、 タイマのオーバフローを使ってもできるっちゃできるんですが、 ・オーバフロー割り込み内でカウント値を再セットする時間 ・割り込み関数内のその他の処理 を考慮しないと、そのときの割り込み状況によって微妙に時間がばらついてしまいます。 で、コンペアマッチのスペシャルイベントトリガを利用すると、コンペアマッチした瞬間に タイマカウンタを自動でクリアしてくれるので、正確な時間間隔で割り込みをかける ことができるようになります。 で、曲者なのがこのスペシャルイベントトリガモード。 スペシャルイベントトリガにはタイマ自動クリアのほかに、A/D変換の 開始トリガ発行機能がついていて、これがなんと設定でマスク(無効化)できない。 # A/D変換のモジュールが使用可能になっていなければ動かないとはあるけど… 常にA/D変換しても大丈夫なシステムなら大して問題はない、 というか積極的にこのタイミングでA/D変換までやってしまえばいいんだろうけど、 特定のタイミングで開始したい場合、このタイミングの前後でコンペアマッチして A/D変換を始められるとちゃんとした値が取れない。

回避策(他にもあるかも)

スペシャルイベントトリガを使わない(時間カウントはソフト制御で頑張る) ・自分がA/D変換したいタイミングの直前とその一定時間前に、すでにA/D変換が始まっていたら、  そのときの測定はあきらめる(あきらめられる場合) あと、A/D変換中、もしくは終了後、GOビットを確認する前にコンペアマッチすると、 2回A/D変換が動いて、これまたよろしくないので ・A/D変換にかかる時間をカウントしておき、カウント値が不正な場合も測定を無効とする # アクイジションタイムを考慮しなければA/D変換時間は 11Tad-12Tad の間。 PICのECCPの作りがあんまり良くないのかなぁ…。
(function(document){ var pres = document.getElementsByTagName("pre") for(var i=pres.length; i--; ){  var el = makeOl(pres[i]) pres[i].appendChild(el) } function makeOl(pre){ var ol = document.createElement("ol") , li = document.createElement("li") , df = document.createDocumentFragment() , br = pre.innerHTML.match(/\n/g) ol.className = "preLine" ol.setAttribute("role", "presentation") for(var i=br.length; i--; ){ var li2 = li.cloneNode(true) df.appendChild(li2) } ol.appendChild(df) return ol } })(document)