プロが教えるわが家の防犯対策術!

PICを用いてAD変換をしようとしていますが,思うように出力が出ず困っています.
可変抵抗を用いて0-5V間を調整可能な入力をAN0ピンに接続し,AD変換の結果をBポートに出力しようとしています.
使用条件は,mikroC使用,PIC16F877使用,C言語使用,水晶20MHz,Aポート入力(AN0ピンアナログ入力),Bポート出力,Tad=1.6μsです.
以下のプログラムで間違っている点をご指摘いただきたいと考えています.

unsigned int out_b;
void port_initialize()
{
INTCON=0; //割り込みなし
ADCON0=0x81;
ADCON1=0x8E; //AD変換中の入力範囲設定は電源と共有
TRISA = 0x3f; //AD変換用ポート(1で入力)
TRISB = 0; //出力用ポート(0で出力)
PORTB = 0;
}
void value_initialize()
{
out_b=0;
PORTB=out_b;
}
void main()
{
port_initialize();
value_initialize();
while(1){ //endless
ADCON0=0x81; //AD変換bitを選択
Delay_us(24); //アクィジション時間+AD変換後の待ち時間
ADCON0=0x85; //AD変換開始
Delay_us(20); //AD変換待ち時間
out_b=ADC_Read(0);
PORTB=out_b;
}
}

A 回答 (4件)

 困りましたね。


 後は、コンパイラにADCの例題が付いていればそれを実行してみるとか....
    • good
    • 0
この回答へのお礼

返信が遅くなってしまって申し訳ありません.
あれからいろいろ試してみた結果,結局原因は不明でしたがPICを16F873Aにしてみたところ動きました.
今回の使用上,16F873Aでも問題ないので16F877は諦めようと思います.
いろいろとアドバイス頂き,ありがとうございました.

お礼日時:2009/11/18 18:12

 それでは、ADC_Read()が悪さをしているとしか思えません。


 直接AD変換結果をリードしたらどうでしょう。?

この回答への補足

AD変換の結果はADRESH,ADRESLに保存されるので,ADC_Read()を用いずに
out_b=ADRESH;やout_b=ADRESL;のように結果を直接出力してみようとしましたが,出力ポートは反応しませんでした.

補足日時:2009/11/10 11:58
    • good
    • 0

 質問者が「0になっていると考えている」と考えているのと


実際にそうなっているかは違います。
 調べるのに時間はかかりません、調べてみればどうでしょう。?
 以下のように変更してテスターでPORTB0,1がHIレベルで有れば
正解です。
void main()
{
  port_initialize();
  value_initialize();
  PORTB = 0; // <-----------
  while(1){ //endless
    ADCON0=0x81; //AD変換bitを選択
    Delay_us(24); //アクィジション時間+AD変換後の待ち時間
    ADCON0=0x85; //AD変換開始
    // ここから
    if (ADCON0 & 0x04) {
      PORTB |= 0x01;
    } 
    Delay_us(20); //AD変換待ち時間
    if ((ADCON0 & 0x04) == 0) {
      PORTB |= 0x02;
    }
    // ここまで
    out_b=ADC_Read(0);
    /* PORTB=out_b; */
  }
}

この回答への補足

上記のプログラムを試した結果,PORTBの0,1ピンはHIレベルでした.

補足日時:2009/11/09 15:26
    • good
    • 0

 基本的に間違っていないようです。


 ところで、ADCON0のbit2(GO/nDONE)は1になって0に戻りますか。?

この回答への補足

回答ありがとうございます.
ADCON0のbit2(GO/DONE)はAD変換が終了すれば自動的に0になるので
Delay_us(20); //AD変換待ち時間
後に0に戻っていると考えています.

補足日時:2009/11/09 11:00
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!