• ベストアンサー

3048fマイコンでのA/D変換について

マイコン初心者ですが今3048fマイコンを使ってA/D変換をしようとしているんですが、うまくいかないので教えて頂きたいです。 プログラムは下の通りです。 #include <3048.h> /* メイン関数 *****************************************/ void main(void){ int ad_data; P1.DDR = 0xff; /*port1出力に設定 表示LED */ P4.DDR = 0x00; /*port4入力に設定 操作用sw1~4 */ P4.PCR.BYTE = 0xff; /*port4プルアップon */ AD.ADCSR.BYTE = 0x33; /* SCAN MODE / CH0~3  */ while(AD.ADCSR.BIT.ADF == 0){} /* 4CH分の変換終了を待つ */ while(1){ if(P4.DR.BIT.B4 == 0){ /* sw1の時 */ ad_data = AD.ADDRA>>8; } else if(P4.DR.BIT.B5 == 0){ /* sw2の時 */ ad_data = AD.ADDRB>>8; } else if(P4.DR.BIT.B6 == 0){ /* sw3の時 */ ad_data = AD.ADDRC>>8; } else if(P4.DR.BIT.B7 == 0){ /* sw4の時 */ ad_data = AD.ADDRD>>8; } P1.DR.BYTE = ad_data & 0xFF; /*上位8bit分だけ表示させる */ } } このように4チャンネル分の0~5vのアナログ信号をスキャンモードでA/D変換し、それぞれ対応したスイッチを押すことによって現在どのくらいの電圧が来ているかLEDに2進数で表示させようとしています。しかしsw1とsw2、sw3とsw4がそれぞれ同じ値を表示しています。例えば、sw1を押したらADDRAの値が表示されますが、sw2を押しても同じADDRAの値が表示されます。またsw3とsw4も同じでどちらを押してもADDRCの値が表示されます。 4チャンネル分を同時にA/D変換することは元々出来ないのでしょうか?いろいろ調べてはいますが理由が分かりせん・・・ADDRA=ADDRB、でADDRC=ADDRDなのでしょうか?分かりにくいとは思いますが教えて頂けると幸いです。よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

上位8bitではなく(10bit中の)下位8bitだとどう見えますか? 非常に小さいところでは違いが出てるかもしれないので…… というのと各チャネルの入力信号が確実に違うことは確認とれてますか? >#1 同じこと、というかビットシフト数とSFR名称以外はこのソースとまったく一緒ですね。 DRとADDRは同じモノ(DR=Data Register、ADDR=A/D Data Register)だと思いますよ。 質問者の開発環境が書かれていないので推測になりますが、おそらくGCC Developer Liteと秋月のCコンパイラでSFR定義が異なるためではないかと。

その他の回答 (2)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

>しかしsw1とsw2、sw3とsw4がそれぞれ同じ値を表示しています。 sw1とsw2が、sw3とsw4が「ハード的にショートしちゃってる」って事はありませんかね? つまり、sw1とsw2のどっちを押しても、P4.DR.BIT.B4が0になっちゃうとか、sw3とsw4のどっちを押しても、P4.DR.BIT.B6が0になっちゃうとか。 今のプログラムをちょこっと改造して while(1){ ad_data = 0; if(P4.DR.BIT.B4 == 0){ /* sw1の時 */ ad_data = ad_data | 1; } if(P4.DR.BIT.B5 == 0){ /* sw2の時 */ ad_data = ad_data | 2; } if(P4.DR.BIT.B6 == 0){ /* sw3の時 */ ad_data = ad_data | 4; } if(P4.DR.BIT.B7 == 0){ /* sw4の時 */ ad_data = ad_data | 8; } P1.DR.BYTE = ad_data & 0x0F; /*4bit分だけ表示させる */ } って感じで、sw1~sw4が「ちゃんと動いてる」のを確認した方が良いかも。 上記のif文はelseで繋がっておらず「4つ独立」してて、4つとも評価実行される事に注意すること。 つまり、2つのスイッチを同時に押すと、LEDは2個点く筈。 従って「スイッチ回路がショートしてて、スイッチを1つしか押してないのに、2つ押した事になったら、LEDが2つ点く」って事。 なので「順番に1個づつ押していって、同時に2個のLEDが点灯したら、ショートしてると判る」でしょう。

konohiromu
質問者

お礼

回答ありがとうございます! 試して見たところショートはしていないみたいでした・・・。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

3048fなら、以下のページに「同じこと」をしているのがあります。 http://homepage1.nifty.com/rikiya/software/104adconv1.htm このソースでは、ADDRA~DではなくDRA~Dからデータを引っ張ってるように見えますが、3048fと3048では、データが入って来るレジスタが違うのでしょうか?

関連するQ&A