マイコン初心者ですが今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なのでしょうか?分かりにくいとは思いますが教えて頂けると幸いです。よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
上位8bitではなく(10bit中の)下位8bitだとどう見えますか?
非常に小さいところでは違いが出てるかもしれないので……
というのと各チャネルの入力信号が確実に違うことは確認とれてますか?
>#1
同じこと、というかビットシフト数とSFR名称以外はこのソースとまったく一緒ですね。
DRとADDRは同じモノ(DR=Data Register、ADDR=A/D Data Register)だと思いますよ。
質問者の開発環境が書かれていないので推測になりますが、おそらくGCC Developer Liteと秋月のCコンパイラでSFR定義が異なるためではないかと。
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が点灯したら、ショートしてると判る」でしょう。
No.1
- 回答日時:
3048fなら、以下のページに「同じこと」をしているのがあります。
http://homepage1.nifty.com/rikiya/software/104ad …
このソースでは、ADDRA~DではなくDRA~Dからデータを引っ張ってるように見えますが、3048fと3048では、データが入って来るレジスタが違うのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++/CLIのオブジェクト型配列
-
2バイトの文字データの送信
-
途中経過も表示するプログラム
-
ポインター引数の関数でコンパ...
-
エクセルVBA:日付データの変換...
-
stable diffusionのエラー
-
c言語 Bitについて
-
pythonでDBのカラム名で取得し...
-
ビットデータのチェック方法
-
printfの%eで指数部分の桁数を...
-
エクセルシート名の制限を変更...
-
UTF-8で5~6バイトになる文字コ...
-
Excel 1セル当りの文字数が2...
-
10Mバイトて文字数に すると何...
-
DOSのdirコマンドで思うように...
-
EUSARTで通信
-
Excel VBA メール作成について ...
-
VBSでテキストファイルの文字列...
-
DataGridViewの特定列に入力さ...
-
[VBScript][wsh]byte単位でのデ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
int型(2バイト)データの分割
-
【Excel VBA】10進数を2進数に...
-
C#でのswitch文
-
C言語についてです! 同じ年の...
-
pythonでDBのカラム名で取得し...
-
PINVOKEで構造体配列をマーシャ...
-
MySQLに登録すると文字化け
-
C言語 ファイル内のデータと入...
-
CreateProcessでの環境変数の設...
-
'dataType' 引数を Null にする...
-
linuxのシェルでファイル名に先...
-
Cのプログラムがどうしても動き...
-
POSTで配列のデータを渡す方法は?
-
マクロ登録したピボットが重い...
-
gnuplotの出力グラフ名を外部で...
-
離散フーリエ変換のプログラム...
おすすめ情報