ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:cemehanK PIC16F877を用いたC言語でのAD変換について
困り度:
  • すぐに回答を!
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;
}
}
質問投稿日時:09/11/07 21:21
質問番号:5429709
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答20pt

回答者:f-tomohiko  困りましたね。
 後は、コンパイラにADCの例題が付いていればそれを実行してみるとか....
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:09/11/10 13:58
回答番号:No.4
この回答へのお礼返信が遅くなってしまって申し訳ありません.
あれからいろいろ試してみた結果,結局原因は不明でしたがPICを16F873Aにしてみたところ動きました.
今回の使用上,16F873Aでも問題ないので16F877は諦めようと思います.
いろいろとアドバイス頂き,ありがとうございました.

回答

 

回答者:f-tomohiko  それでは、ADC_Read()が悪さをしているとしか思えません。
 直接AD変換結果をリードしたらどうでしょう。?
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:09/11/09 20:49
回答番号:No.3
この回答への補足AD変換の結果はADRESH,ADRESLに保存されるので,ADC_Read()を用いずに
out_b=ADRESH;やout_b=ADRESL;のように結果を直接出力してみようとしましたが,出力ポートは反応しませんでした.
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:f-tomohiko  質問者が「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; */
  }
}
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:09/11/09 12:34
回答番号:No.2
この回答への補足上記のプログラムを試した結果,PORTBの0,1ピンはHIレベルでした.
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:f-tomohiko  基本的に間違っていないようです。
 ところで、ADCON0のbit2(GO/nDONE)は1になって0に戻りますか。?
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:09/11/08 09:58
回答番号:No.1
この回答への補足回答ありがとうございます.
ADCON0のbit2(GO/DONE)はAD変換が終了すれば自動的に0になるので
Delay_us(20); //AD変換待ち時間
後に0に戻っていると考えています.
この回答へのお礼この回答にお礼をつける(質問者のみ)
最新から表示回答順に表示良回答のみ表示