PV用DCDCコンバータ開発(62) PIC割込み処理の注意点

一般的には、割込み処理は、割込み周期よりも短時間で完了するように設計するが、どうしても1周期以内に全ての処理を詰め込むことが難しい場合がある。処理内容によっては、それでも特に問題が無い場合もあり、その際は2周期を利用して1処理を行うことで対処する。

DC-DCコンバータのプログラムを、電圧測定を割込み周期に同期させるように改造中だが、今使っているチープなPICでは、1周期に1測定値しか処理が間に合わない。そこで、割込み毎に測定点1、測定点2、測定点3、測定点4、測定点1・・・というように順繰りに処理するようロジックを組んでいる。

異常値になったら、直ぐに停止させなければ部品が壊れてしまう可能性があるので、測定直後に判断のロジックを入れたい。測定した結果で、制御モードを変えなければならないため、測定値がいくつか設定している閾値のどこにあるかを判断しなければならない。そうすると処理が増えてしまい、1周期に収まらなくなりそうだ。

実際にプログラムを組んで、処理が間に合うかどうかをオシロで確認してみた。すると、やはり、判断処理によって、間に合う場合と間に合わない場合がある。。。。

という結果が直ぐに確認できると思いきや、またしておかしな現象に遭遇。

約1秒周期でリセットがかかっているようだ。立上げ時に1度だけ表示させているメッセージが、定期的に現れている。おいおい。。。。またかよ~~~。これは、メモリ破壊によって、強制的にシステムリセットがかかっている証拠。こういうバグは、見つけるのが面倒くさいんだよなぁ。。。と、嘆いてみても始まらない。解析解析・・・・

1周期に間に合っているときにはきちんと動いていたのだから、1周期内に間に合わなかった場合におかしな動作をしているに違いない。追加したロジックを抜いて、PWM周期を少し短くして、1周期内に収まらない条件を再現し現象を追跡。

すると、PWMクロックの立上がりに同期して少し遅延して割込処理が始まるはずなのに、1度1周期よりも長い処理が行われると、それ以降の割込処理がPWMの立上がりと同期せず、前の割込み処理が終了したらすぐさま開始している現象が確認できた。

しばし熟考。。。。。。。。。。。。。。。。。。。。。。。。

PICは、割込みの大元を制御するのはGIEというフラグビット。これは、割込みが発生すると、自動的にリセットされて、次に割込み許可するためには、再セットしなければならない。

PICには、色々な割込みがあり、それぞれの割込みの許可をするxIEフラグと、割込みがかかったことを示すxIFフラグがある。xIEフラグは、最初にセットしておけばあとは設定する必要がない。一方、xIFは、割込みが発生するとセットされるが、次の割込みの前に手動でリセットしておく必要がある。

そういえば、以前データシートを読んだとき、GIE割込みが許可されていなくても、割込みのタイミングになるとxIFはセットされるという記述があったぞ。

現在のロジックでは、割込み処理の最初でxIFをリセットし、以降の処理を行っている。1周期で処理が終了していれば良いのだが、終了せずに2周期目にまたがった場合にどうなるか。

1周期で割込み処理が終わらず、まだ継続しているのに、次のPWM立上りのタイミングでxIFはセットされてしまう。実は、この時にGIEがどういう動きをするかがデータシートに明記されていない。割込みのフックには、ラッチ型とリアル型がある。ラッチ型は、割込み発生の状態をフラグに記録し、割込み処理ができるのを待ち開始するというもの。一方、リアル型は、その瞬間に割込処理が開始できなければ無視してやり過ごすというもの。

今回のPICの現象から分かることは、xIFがセットされたが、その時点では前の割込処理が継続しているため、次の割込処理が開始できず、割込みが入ったことがラッチする。前の処理が終了すると、待たされていた割込処理が直ぐに開始されるということのようだ。

ずっと気になっていたPICの割込みがラッチされるかどうかが今回のトラブル解析でようやく解明。で、今回の不具合を解消するには。。。。

xIFをクリアするタイミングを、割込処理の終了直前にしてやれば、それ以前にxIFがセットされて割込みがラッチされる現象が回避できるに違いない。さっそくプログラム。。。。(と言っても TMR2IF = 0; の位置を移動するだけだが・・・)

ビンゴ!!!!!

みごとに不具合が解消され、割込み処理が1周期以上かかる場合にも、きちんと次のPWMの立上りに同期して開始するようになった。

20140401割込み処理

さて。では、なぜにリセットのかかるような異常が発生したか。

xIF割込みをラッチするスタックが複数あるのではないか。間に合わなかったxIF割込み情報がどんどんたまり、スタックがオーバーフローして他のメモリ領域を破壊してシステムエラーとなり、リセットがかかるのではないか。データシートには、そこまでの構造が詳しく記されていないので、それ以上は想像の域を出ないが、概ねそんなところだろう。

今回のトラブル解析では、PICの割込みを使う際の意外と重要なノウハウが蓄積された。忘れないように備忘録に記録しておこう。

写真は、PWMクロックよりも割込みが長くかかり、次の割込み処理は、その次のPWMクロックの立上りに同期して開始していることを確認した際のオシロの画像。

前回へ  次回へ

(Visited 2,875 times, 1 visits today)
スポンサーリンク

シェアする

フォローする