- 締切済み
h8マイコンで AD変換ができなくて困っています
マイコンで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までの対応にしました><どこがおかしいのか教えていただけるとてもうれしいです><助けてください;;
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- anachrockt
- ベストアンサー率53% (229/426)
ソースリストを見たけど,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ならとりあえず動くはず ですね. 初期化処理がいい加減ですが,きちんとリセットされないことを考え,基本的に関連する全レジスタを処理します. ソフトの設計無しにいきなりコーディングしているようなら,ソフトハウスに設計から御願いした方が速いです
- naluminum
- ベストアンサー率29% (24/81)
プログラムにもし問題がないとすれば, 回路をもう一度確認してみてはどうでしょうか. 例えば,H8の電源のグランドと,見たい電圧の電源のグランドは繋げて共通にしてますか?
- anachrockt
- ベストアンサー率53% (229/426)
> マイコンにAD変換結果は届いているのか・・・不安です>< デバッガで1stepずつ見ていけばわかるでしょう. デバッガが無かったら,ユーザーズ・マニュアルと ソースリストを照らし合わせながら各レジスタにどんなデータが 入っているのかチェックしていく以外無いでしょう. その時注意するのはSFRレジスタのデータで,書き込んだ値が 読み出されるとは限らないことです(マニュアルにあり). デバッガは安いから買った方が速いと思いますよ.
お礼
ありがとうございます^^ 時間が迫っているので、買いに行く時間はないかもですが、もう少しがんばってみたいと思います。 ADDRAの件も気になりますが、奮闘してみますね
- anachrockt
- ベストアンサー率53% (229/426)
昔のことだしアセンブラでやっててあんまり憶えてないけど, 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変換結果は届いているのか・・・不安です><
- anachrockt
- ベストアンサー率53% (229/426)
昔,H8マイコン使ったときにやっぱりAD変換ができなかった覚えがあります. 1回変換する毎に,スタートフラグ; AD.ADCSR.BIT.ADST をクリアして,スタートさせたらできるようになったかな? (EOCフラグもクリアしたかも?) 後,タイマとかIICとかにも色々トラップがあって楽しめたような?
補足
回答ありがとうございます^^ スタートフラグですか。ということは、if文 else if文の終わりすべてに AD.ADCSR.BIT.ADF=0; //フラグクリア を乗せるということなのでしょうか?>< ADDRAの使い方も少し教えて欲しいです;; 初心者でほんとすみません・・・
お礼
回答ありがとうございます!実はGND共通にしてませんでした。 しかし、それに気づき、もう一度マイコンを動作させたのですが、未だに変換されぬままです^^;