アプリ版:「スタンプのみでお礼する」機能のリリースについて

初めて投稿させていただきます。
 AKI-H8/3048キットでAD/DA変換をC言語で行いたいの
ですがうまくいきません。
 C言語ではどうやって記述すればいいのでしょうか?
ご助言お待ちしています。
 参考までに作成したAD/DA変換ソースコードを記します。
ちなみに入力端子AN0は可変抵抗器、出力端子DA1はLCDに
接続しています。
(可変抵抗器からの電圧増減に従ってLCDの表示を変化
させたい)
#include <3048f.h>
#include <stdio.h>

main(){

int a;
while(1){

AD.CSR.BYTE = 0x28;
while(AD.CSR.BIT.ADF == 0){}
a = AD.DRA;
AD.CSR.BIT.ADF = 0;
DA.DR1 = (unsigned char)((a >> 8)&0x00ff);
}
}

A 回答 (3件)

> AD.CSR.BYTE = 0x28;



確認します。上の設定だと、

ADインタラプトイネーブル(ADIE) : AD変換終了割込(ADI) 常時禁止
ADスタート(ADST) : whileの度スタートを設定
スキャンモード(SCAN) : 単一モード固定
クロックセレクト(CKS) : 変換時間134ステート(Max)
チャンネルセレクト(CH0~2) : AN0を選択

で良いですね。であればここには問題無いと思います。

> int a;
> while(1){
>
> AD.CSR.BYTE = 0x28;

は、

int a;
AD.CSR.BYTE = 0x08;
while(1){
AD.CSR.BIT.ADST = 1;

の方がベターかと思いますが(while中ではADスタートのみ設定)、まあ大丈夫でしょう。

> while(AD.CSR.BIT.ADF == 0){}

AD変換終了を待つループですね。問題有りません。

次が少し問題です。

> a = AD.DRA;

H8/3048でAD変換結果を格納するデータレジスタADDRA~Dは16ビットレジスタでは
ありますが、一度に読み出すことはできません。
上位バイト→下位バイトの順で、バイト単位に2回に分けてリードです。
これは、バス幅が8ビットであるための制限です。
下位バイトのデータは、テンポラリレジスタ(TEMP)を介さないとリードできない仕様ですが、
上位バイトのリードを行うと、内部的に下位バイトがTEMPに転送され、次に下位バイトの
リード処理を行うと、データがTEMPから引き出される仕組みになっています。

ただし、DA出力処理と思われる箇所で、下位データは捨てられているようなので、それを
見越した処理であるなら良いのかもしれません。
ただ、CHIPの仕様としてはバイト単位の2回リードとなっています。

最後に、

> DA.DR1 = (unsigned char)((a >> 8)&0x00ff);

DR1なので、DA1チャンネルを使うのでしょうが、DAコントロールレジスタ(DACR)の
DAアウトプットイネーブル1(DAOE1)、DAイネーブル(DAE)は、それぞれどこかで
別途設定されているのでしょうか?漏れているなら設定して下さい。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
おかげさまでAD/DA変換が可能になりました!
原因はイネーブルのビットを1にしていない事
でした。
リード処理の仕組みも大変参考になりました。

お礼日時:2004/12/21 20:05

#1です。


>AD.CSR.BIT.ADFがループの前に初期化されていないが、AD.CSR.BIT.ADF!=0であった場合、読み取りすることなく内側のループを素通りするがいいのかな?

1回目素通りしても後で初期化してるのでいいのかな^^;;
    • good
    • 0

3048f.hの中身及び関数、構造体等のプロトタイプがわからないのでリストからわかることを、




//↓無限ループの始まり
while(1){

//↓AD.CSR.BYTE を 0x28に初期化 きっと何かの命令セットだろう
AD.CSR.BYTE = 0x28;

//↓何もしないループたぶん入力信号待ちなのだろう
while(AD.CSR.BIT.ADF == 0){}

//↓ループ後 aに たぶん得られた信号AD.DRAを代入
a = AD.DRA;

//↓たぶん入力待ち信号AD.CSR.BIT.ADFを0に初期化
AD.CSR.BIT.ADF = 0;

//前回得られたa(すなわちAD.DRA)の上位8BITをDA.DR1に代入

DA.DR1 = (unsigned char)((a >> 8)&0x00ff);

}・・を繰り返す。


AD.CSR.BIT.ADFがループの前に初期化されていないが、AD.CSR.BIT.ADF!=0であった場合、読み取りすることなく内側のループを素通りするがいいのかな?

入力側から得られたAD.DRAの上位8ビット抜き取るだけでいいのかな?BITを展開しなくてもいいのかな?

ということで、ソースを見た限りのところです、ご参考になれば。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
参考になりました。
また、次からはソースコードにはコメントを
つけます。読み手側への配慮が欠けていました。

お礼日時:2004/12/21 19:58

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