PICマイコンではまったことその22009年09月14日 03時36分18秒

シンプルだったはずの基板がまたごちゃごちゃと・・・

モータードライブのパルスモータ駆動にPICマイコンのタイマ割り込みを利用したプログラムを書いていてはまったので、メモしておきます。

これはPICそのものの問題なのかHI-TECH Cの記述の問題かまでは追求できていません。

パルスモータの制御は要は4相パルスモータの場合は4ビットの位相をずらしたデータを書いてあげれば良いわけです。本来は出力はこの4ビットしか使う必要はないのですが、今回入力を欲張るためにキーマトリックスを構成させたので、系統選択のためのストローブを出力する必要がありました。

このストローブがパルスモータの出力に使っているポートと同じレジスタでした。

NGの記述

で、通常のマイコンならば以下のような記述で割り込み処理と通常処理のデータの不整合を防ぐことが出来ます。

PORTA |= ONBIT_MASK;
PORTA &= ~ONBIT_MASK;

ですが、挙動不振なので間接的な実験で確かめたところ(ICDが動作しないので・・・)指定したビット以外もクリアされているようです。 つまり、ストローブのビットしか操作していないつもりでパルスモータの出力もキーやスイッチの読み込みタイミングでクリアされてしまうのです。

逆も同様で、パルスモータの相出力しか操作していないつもりで、キー選択のためのストローブも出力されてしまっていたようです。

OKの記述

ポートを直接指定して壊れるのならばstaticな変数経由で操作するしかないですね。これで、とりあえずはOKです。でも先入観でNGの記述にずっと固執していて回路的な問題を疑ってかなり基板上の試行錯誤をやってしまいました。

static unsigned char porta;
porta |= ONBIT_MASK;
PORTA = porta;
         :
porta &= ~ONBIT_MASK;
PORTA = porta;

やっぱ、実機でデバッガが使えないのはきつい!!! ・・・それと、「その2」ってタイトルですが、「その1」ってタイトル探してもないです。

なぜ気付いたか

挙動不審はハードのせいも含めていろいろと考えられたのですが、決定的だったのはパルスモータの出力を一時停止する処理の仕様と実際の4つ分のLEDの点灯状態を比較確認できたからです。

「停止」操作時にポートの初期化はしていなかったので、4つのポートのうちの少なくとも一つは常にどれかがONになったままのはずなんですね。 それが停止操作をすると必ず全てのポートがOFFになるために、おかしいと思ったわけ。