dポイントプレゼントキャンペーン実施中!

マイコンでAD変換をしようと思っています><
#include<3048.h>

void ioinit();
void adinit();
int i;
int ADDRA;
main()
{
ioinit();
adinit();

while(1){
AD.ADCSR.BIT.ADST = 1; // A/D変換スタート
while(AD.ADCSR.BIT.ADF==1); // A/D変換終了まで待つ
int i = ADDRA; // レジスタに格納された値をiとする

if (i>=0xA5){ // 電圧が6.5vより高くなった場合
P5.DR.BYTE = 0x01;
}


else if (i<=0x19){ // 電圧が1vより小さくなった場合
P5.DR.BYTE = 0x02;
}

else if (0x19<=i<=0xA5){ // それ以外の電圧だった場合
P5.DR.BYTE = 0x03;
}

AD.ADCSR.BIT.ADF=0; //フラグクリア
}
}


// I/OポートDDR設定
void ioinit()
{
P5.DDR=0xff;
}

// A/D変換設定
void adinit()
{
AD.ADCSR.BYTE = 0x33;
}

このプログラムでAD変換がまったくできません><電圧を変えていくことでP5につながっているLEDで変換結果を見たいと思っています。ADDRAのプログラムあたりがおかしいと思っています;;ちなみにポート7に電圧計とつなげています。その電圧値を変えていくことで結果を見ようとしています。0xA5は6.5Vのときの反応だから回路も分圧させたものにして10Vまでの対応にしました><どこがおかしいのか教えていただけるとてもうれしいです><助けてください;;

A 回答 (5件)

ソースリストを見たけど,Cの経験が少なくて,ハードウエアマニュアルも読んでいないようですね.


ハードウエアマニュアルは,わかる人にしかわからんとゆう書き方をしてるんで,何回でも何十回でもわかるまで読むとゆうのが基本です.
時間が無くて,Cに習熟できず,ハードウエアマニュアルもわかるまで読めないようなら,外部のソフトハウスに出したらどうでしょうか?
設備関係は,去年に対し受注が1/5~1/10に減ってるから,喜んで引き受けてくれるはずです.
ソフトハウスを知らないようなら,ルネサスの代理店に御願いすれば紹介してくれます.

ソフトの設計書を見てないんでわかりませんが,ソースリストを見て気の付いた点は;
1.A/D変換終了まで待つときは'0'でしょう
2.int ADDRA; って<3048.h>で定義されてるでしょ?
  ADDRAは,アドレス固定,unsigned intでvolatileでしょう.
3.ADDRAのデータは上位ビットから詰められる
4.int i = ADDRA; 定義のところで,unsigned intにしておかないと,ここではいらないでしょう
5.if (i>=0xA5){  は,0xA500でしょう,以下略
6.P5.DR.BYTE = 0x01,02,03となってるけど正しいのか?
7.A/D変換設定のデータが変,0x00ならとりあえず動くはず
ですね.
初期化処理がいい加減ですが,きちんとリセットされないことを考え,基本的に関連する全レジスタを処理します.

ソフトの設計無しにいきなりコーディングしているようなら,ソフトハウスに設計から御願いした方が速いです
    • good
    • 0

プログラムにもし問題がないとすれば,


回路をもう一度確認してみてはどうでしょうか.

例えば,H8の電源のグランドと,見たい電圧の電源のグランドは繋げて共通にしてますか?

参考URL:http://homepage1.nifty.com/rikiya/software/104ad …
    • good
    • 0
この回答へのお礼

回答ありがとうございます!実はGND共通にしてませんでした。
しかし、それに気づき、もう一度マイコンを動作させたのですが、未だに変換されぬままです^^;

お礼日時:2009/01/23 14:31

> マイコンにAD変換結果は届いているのか・・・不安です><


デバッガで1stepずつ見ていけばわかるでしょう.

デバッガが無かったら,ユーザーズ・マニュアルと
ソースリストを照らし合わせながら各レジスタにどんなデータが
入っているのかチェックしていく以外無いでしょう.
その時注意するのはSFRレジスタのデータで,書き込んだ値が
読み出されるとは限らないことです(マニュアルにあり).
デバッガは安いから買った方が速いと思いますよ.
    • good
    • 0
この回答へのお礼

ありがとうございます^^
時間が迫っているので、買いに行く時間はないかもですが、もう少しがんばってみたいと思います。
ADDRAの件も気になりますが、奮闘してみますね

お礼日時:2009/01/18 23:49

昔のことだしアセンブラでやっててあんまり憶えてないけど,


Cで書けば,
「AD.ADCSR.BIT.ADST = 1; // A/D変換スタート」
の前に,
「AD.ADCSR.BIT.ADST = 0; // A/D変換ストップ」
「AD.ADCSR.BIT.ADF=0; //エンドフラグクリア」
の2行を入れてから,A/D変換をスタートさせたと思うけど.
何でそうしたかとゆうと,デバッガで1ステップずつ実行させると動作し,
連続で動作しないことから,マニュアル読み直したら,スタートと
エンドのフラグがどの程度の遅延時間でクリアされるのか書いて
無かったんで,クリアしたら動作したんじゃなかったんだっけ?

この回答への補足

ありがとうございます^^
プログラムを追加してみました。しかし、電圧を変化させてもLEDは依然、値によって変化しません・・・
P5やP1はDDRが可能のようですがポート7はそれができないようですね;;そこでやはりポート7につながれているP7-0、P7-1が気になります。。。ちなみにCN2の12と13です。そこをとおってマイコンにAD変換結果は届いているのか・・・不安です><

補足日時:2009/01/18 23:04
    • good
    • 0

昔,H8マイコン使ったときにやっぱりAD変換ができなかった覚えがあります.


1回変換する毎に,スタートフラグ;
AD.ADCSR.BIT.ADST
をクリアして,スタートさせたらできるようになったかな?
(EOCフラグもクリアしたかも?)
後,タイマとかIICとかにも色々トラップがあって楽しめたような?

この回答への補足

回答ありがとうございます^^
スタートフラグですか。ということは、if文 else if文の終わりすべてに AD.ADCSR.BIT.ADF=0; //フラグクリア を乗せるということなのでしょうか?><

ADDRAの使い方も少し教えて欲しいです;;
初心者でほんとすみません・・・

補足日時:2009/01/18 22:02
    • good
    • 0

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