マイクロテクニカ製品サポートFAQ
[一覧] [1つ前に戻る] [マニュアル及び各種ダウンロードページへ]
PIC16F1939でADコンバータを使用する場合のご注意
PIC16F1939や19xx系、18xx系のデバイスではPICマイコンそのものにADコンバータに関するバグがあり、ロットによっては、ADコンバータの値を取得する際、ADコンバータの動作クロック源を"FRC"に設定した場合、ADコンバータの動作完了を通知するGO/DONEを返さない(ADCON0のビット1が変化しない)という問題がわかっています。

これはマイクロチップ社からリリースされているPIC16F1939のシリコンエラッタに記載されている既知の不具合です。
http://ww1.microchip.com/downloads/en/DeviceDoc/80501D.pdf

当方の確認ではロットによっては問題が修正されているデバイスも出回っているようですが、どのロットが正常でどのロットにバグが含まれているのか判別ができません。

つきましては、mikroCのADコンバータ関連のプログラムではADコンバータのクロック源に"FRC"を使用するとプログラムが動作しなくなります。(GO/DONEが変化しないのでADコンバータの読み取り完了にならないため、永久的に読み取り完了を待つことになります。)プログラムを動作させるとハングアップします。

mikroCのADコンバータ関連のライブラリで、ADC_READ()がありますが、この関数はクロック源を自動的に"FRC"に設定するため、ADC_READ()関数を使った場合、PICマイコンのロットによってはプログラムがハングアップする場合があります。
その場合には、仕方がないのでADC_Get_Sample()関数を使用します。この関数の場合にはADCON1レジスタによって設定したクロック源を保持した状態で指定したチャンネルからADコンバータの値を取得できます。

お手数をおかけ致しますが、導入マニュアル5-3章、5-4章ではADC_Read()関数の代わりに、ADC_Get_Sample()関数をご使用頂けますようお願い致します。

■5-3章
AD_Res = ADC_Read(2);
 
    ↓

AD_Res = ADC_Get_Sample(2);    //こちらに変更

上記のように変更してください。
また、Prog_init()関数内に次の1文をどの行でもかまわないので追加してください。

ADC_init();    //追加してください


■5-4章
AD_Res = ADC_Read(12);

    ↓

AD_Res = ADC_Get_Sample(12);    //こちらに変更


上記のように変更してください。
また、Prog_init()関数内に次の1文をどの行でもかまわないので追加してください。

ADC_init();    //追加してください



お手数をおかけ致しますがよろしくお願い申し上げます。

なお、PIC16F1xxx以外のデバイスで、マイクロチップ社からリリースされているシリコンエラッタで本問題が書かれていないデバイスを使用する場合には、ADC_Read()関数をご利用ください。


オリジナル - FAQみたいです - 猫でいいです