この一ヶ月は、休日の空いた時間で私の知り合いから依頼を受けた装置の開発のお手伝い。何でも医療用の一部に使われる様だが詳細は良くわからないw
ADコンバータ値を取得して制御する程度のものなので、PICマイコンを使う。そうそう、この机はこうやって高さを調整できるので、袖机になって机が広く使える。
回路も必要最低限にして、ブレッドボードでのデバッグ。最初はPIC16F1825にしてたのだが、プログラムも大きくないからデバイスはPIC16F1823でいいやと途中から変更。これがあとで苦しめられる事にw
ADコンバータを実装してテストしているときにそれはやってきた。いつも普通に使えているADコンバーターが、途中で動作しなくなる。ウォッチドッグを入れて確かめたら、どうやらAD完了のGo/Doneが来ない。あ、これはもしや・・・・
エラッターの事すっかり忘れてたよ(´・ω・`)
そうだった、この時も同じ事があって、デバイスを違うもの変更したんだった。
今回該当したのはADCのGo/Done完了フラグが来ない事がある不具合。この回避策は2つあって、1つがスリープからの復帰、もう一つが86Tcycleカウントしたあと手動でGo/Doneをクリアする方法。
現在出回っているPIC16F1823なら、秋月はレビジョンA9になっていたのを確認したので、よっぽど小売り業者でない限りはこのエラッタに該当しないと思うが、私の手持ちPICマイコンが古かったため、またエラッタにご対面したという次第。
今回はもうチップを変えられないので、レビジョンA6でも動作するようにスリープ式に変更。
スリープの方法は、Timer割り込みなど全部を禁止にして、更にGIEを0にしてグローバル割り込みを禁止し、ADIE割り込みを許可したあとにSLEEP命令とNOP命令を書きこむ。
こうすると、ADIEが発生したときのみSLEEPの次の次の命令から復帰するのでプログラムは簡単だ。復帰後はADIEをクリアしてADIFもクリア。Timer割り込みなどの使用している割り込みをセットした後にグローバル割り込みGIEをセットすればOK。
スリープする前にはWatchdogを切っておかないとWatchdogが発生したら、0番地スタートにならず、スリープのルーチンを抜ける変な動作になるのでご注意を。
とりあえずA6でもA9でも問題なく動作できるようになって納品が終わり、受け入れ検査でパスしてほっとした。
教訓:
1.デバイスを使うときはエラッタを読みましょう。
2.致命的なエラッタを持ったPICマイコンは迷わず捨てましょうw
最近のコメント