質問: Picについて、ADC変換が終わらないことがある件について質問です。ADC変換を個別ソフトウェアトリガで開始した時、いつまでもADC変換が終わらなくなるときがあります。 具体的には、SWTRG0またはPEND0のビットがいつまでもハードからクリアされず、次の変換が行えなくなることがあります。 この問題で不思議なのは、タイミングによって上手くいくケースと上手くいかないケースが発生することです。何度かリセットしていると突然数時間正常に動くこともあります。また、pickit3 (power4.5V)で給電してると、成功率が高く、ACアダプタ(5V)から給電してると成功率は低くなります。 また、timerの機能を追加すると失敗しやすくなる気がします。 もし、何かわかる方がいれば原因と解決策を教えていただきたいです。 ◯環境 ・dspic30F1010-30I/SP ・mplab v5.35 ・XC16 1pickit3(power4.5V) (runモード(debugではない)) →この場合体感80%正常に動作(上手くいかないこともあり。) 安いオシロで測ると4.101V~4.338V ※5Vの規定範囲内からは外れるが、動いている ※5Vに設定してない理由は、5Vで給電しようとするとエラーになるから。 2ACアダプタ(5V) →この場合は体感30%正常に動作(ほぼ上手くいかない。) 安いオシロで測ると5.047V~5.378V※規定範囲内 ◯ハード Pickit3系の接続 リセット端子のプルアップ・リセット用のボタン E0ピン確認用LED パスコン AD変換対象(A0) AVddはVddと同じライン AVssはVssと同じライン ◯確認用サンプル 無限ループに陥るとledが消えます。
回答: データシートをざっと読んだだけですが、 PEND0の使い方がちょっと違うような? データシートを読んでみてください。 for(i = 0; i<32;i++){ ADCPC0bits.SWTRG0=0b1;//これでADCスタート // ここにnopを入れるかどうか? PEND0 = 1; // 書き方は適当に修正する while(ADCPC0bits.PEND0){LATEbits.LATE0 = 0;} // !削除 LATEbits.LATE0 = 1; ADCはスタートしたのだからPEND0でSWTRGが”0”になってもいいのでは?