初めて投稿させていただきます。
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);
}
}
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)は、それぞれどこかで
別途設定されているのでしょうか?漏れているなら設定して下さい。
回答ありがとうございます。
おかげさまでAD/DA変換が可能になりました!
原因はイネーブルのビットを1にしていない事
でした。
リード処理の仕組みも大変参考になりました。
No.2
- 回答日時:
#1です。
>AD.CSR.BIT.ADFがループの前に初期化されていないが、AD.CSR.BIT.ADF!=0であった場合、読み取りすることなく内側のループを素通りするがいいのかな?
1回目素通りしても後で初期化してるのでいいのかな^^;;
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を展開しなくてもいいのかな?
ということで、ソースを見た限りのところです、ご参考になれば。
回答ありがとうございました。
参考になりました。
また、次からはソースコードにはコメントを
つけます。読み手側への配慮が欠けていました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(AV機器・カメラ) オーディオインターフェイスの24bitなど量子化bit数はどこで設定できるのでしょうか? 1 2022/06/26 07:58
- Excel(エクセル) フォルダ階層が深いファイルの拡張子の一括変換 2 2022/12/23 18:40
- Excel(エクセル) Excel 複数列のある文字を優先して1列に表示したいです 2 2022/12/03 12:07
- 英語 TOEIC公式問題集のリスニングの一部分に “I’ll get an ad in the local 2 2022/08/17 18:52
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- スピーカー・コンポ・ステレオ Bluetoothスピーカーは自作可能ですか? 1 2022/05/01 18:45
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
do-while文が禁止される理由
-
入力した数値を倍々するプログラム
-
break文でループを一気に抜ける...
-
ループを途中で抜けたいのですが。
-
C言語forループが完結した場合...
-
エクセルでC言語のfor文と同じ...
-
if文の中にfor文なのか、for文...
-
エクセルVBAで Do While (1)って?
-
C言語 数字を削除する関数
-
Cプログラムが終了しない
-
ループの特定入力終了
-
Excel VBAで年度をまたぐ期間の...
-
アルゴリズムです!四つの数字...
-
整定時間
-
For文の終了値を関数にしても問...
-
C言語のプログラムみてください...
-
入力した文字列から母音だけを...
-
猫でもわかる、がわかりません。
-
C言語、whileループを抜け出す...
-
既約分数の表示プログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
do-while文が禁止される理由
-
break文でループを一気に抜ける...
-
エクセルでC言語のfor文と同じ...
-
ループを途中で抜けたいのですが。
-
エクセルVBAで Do While (1)って?
-
C言語forループが完結した場合...
-
For文の終了値を関数にしても問...
-
excel VBA if文について
-
入力した数値を倍々するプログラム
-
入力した文字列から母音だけを...
-
Excel VBAで年度をまたぐ期間の...
-
if文の中にfor文なのか、for文...
-
C言語、whileループを抜け出す...
-
for文while文の無限ループの違...
-
UWSCにてある一定の動作を無限...
-
__asm int 3でのブレイクポイン...
-
PIC のプログラムについて ど...
-
他言語で言うcontinue文
-
Cプログラムが終了しない
-
プログラムで関数は使わない方...
おすすめ情報