• ベストアンサー

H8/3048マイコンAD/DA変換について

初めて投稿させていただきます。  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); } }

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

  • ベストアンサー
  • kaZho_em
  • ベストアンサー率50% (2950/5879)
回答No.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)は、それぞれどこかで 別途設定されているのでしょうか?漏れているなら設定して下さい。

kohei55_1980
質問者

お礼

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

その他の回答 (2)

  • keikan
  • ベストアンサー率42% (75/176)
回答No.2

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

  • keikan
  • ベストアンサー率42% (75/176)
回答No.1

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を展開しなくてもいいのかな? ということで、ソースを見た限りのところです、ご参考になれば。

kohei55_1980
質問者

お礼

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

関連するQ&A