- 締切済み
H8マイコンのDA変換機能について
今、H8マイコンの3048Fをつかっています。マイコンを扱うのは全くの初心者で昔、電子工作でラジオを作ったりしたことがある程度です。 そこで、『C言語によるH8マイコンプログラミング入門』という本を参考に一つずつプログラムを打ち込みながら試しているところです。 そこにある、D/A変換を使ってサインカーブを出力する、プログラムを試そうとしてつまづいています。添付データの様な出力になり、期待に反しています。なぜ、こうなるか分からなくて何かアドバイス頂けないでしょうか? 以下、そのプログラムです。 //タイマ割り込みによるD/Aコンバータの出力 //ITU0使用 //200Hzのサインウェーブを出力する //da_3.c #include <3048.h> //3048、3052の内部I/O定義 int c; //1サイクルの出力回数、外部変数とする unsigned int sindata[128] = {127,133,139,146,152,158,164,170, //出力データ 176,181,187,192,198,203,208,212, 217,221,225,229,233,236,239,242, 244,247,249,250,252,253,253,254, 254,254,253,253,252,250,249,247, 244,242,239,236,233,229,225,221, 217,212,208,203,198,192,187,181, 176,170,164,158,152,146,139,133, 127,121,115,108,102,96,90,84, 78,73,67,62,56,51,46,42, 37,33,29,25,21,18,15,12, 10,7,5,4,2,1,1,0, 0,0,1,1,2,4,5,7, 10,12,15,18,21,25,29,33, 37,42,46,51,56,62,67,73, 78,84,90,96,102,108,115,121}; void ituinit(void) //ITUイニシャライズ { ITU0.TCR.BIT.CCLR = 1; //カウンタクリア要因 ITU0.TCR.BIT.TPSC = 0; //16MHz 周期 0.0625μs ITU0.GRA =900; //200Hz 周期 5ms、1サイクルの出力数 128、 周期 5/128=0.0390625ms //0.0390625ms=39.0625μs、39.0625/0.0625=625 ITU0.TIER.BIT.IMIEA = 1; //IMFAフラグによる割り込み許可 } void dainit(void) //D/Aコンバータイニシャライズ { DA.DACR.BIT.DAOE0 = 1; DA.DACR.BIT.DAE = 0; } //ITUインターバルタイマ割り込み void int_imia0 (void) { ITU0.TSR.BIT.IMFA = 0; //割り込みステータスフラグクリア DA.DADR0 = sindata[c]; //サイン波形データ出力 c+=1; if(c>128) c=0; } int main(void) { ituinit(); dainit(); ITU.TSTR.BIT.STR0 = 1; //タイマスタート c=0; //割り込み回数 EI; //割り込み許可 while (1); //何もしない }
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- takepon256
- ベストアンサー率41% (391/936)
>マイコンのハード不良 どちらかと言うと設定が抜けていて正常に動作してない様に思えるので、 どのイベントがおかしな動作をしているのかの確認のためです。 動作順に確認していくとどこでおかしくなっているのか分かりやすいです。 ・タイマは思い通りの周期で割り込み入ってるか ・変数cの値が○○の時のDA出力の値は正しいか ・折り返し地点(c=127)の時のDA出力の値は? など。
- OrangeRS
- ベストアンサー率47% (9/19)
オシロのレンジが不明なので詳しく分かりませんが、 テーブルの前半は綺麗に出力されていそうですよね。 ならば試しに、割り込み周期を長くしたらでしょう? 具体的には、ITU0.GRA =900;を4000位にしてみる、 またはカウンタ入力クロックをもう少し遅くしてみる。 ハードの不良じゃ無いと思うんですよねぇ・・・ チェックするならタイマー割り込みを止めて、 while (1){ //何もしない DA.DADR0 = sindata[c]; //サイン波形データ出力 c+=1; if(c>127) c=0; } これでどうなるかですね。
- takepon256
- ベストアンサー率41% (391/936)
あまりたいしたアドバイスは出来ないですが、、、 何故か値がオーバーフローしてしまってマイナス値で動作しているような雰囲気です。 割り込みやif文は正常に動作してますか? それぞれの処理発行時にGPIOへ信号出力して、正常に処理されているか検証されてはいかがでしょうか。
- ICE_FALCON
- ベストアンサー率56% (63/111)
H8はあまり詳しくないですが、 DA.DADR0 = sindata[128]; としている気がするのは気のせいでしょうか? つまり if(c>128) -> if(c>127) では?
お礼
返信遅くなってしまって申し訳ありません。 そうですね、一応試してみたのですがキレイなサイン波は出ませんでした^^;
お礼
なるほど。。。つまりマイコン自体のハード的な不良かもしれない、と捉えてよろしいのでしょうか?早速実験計画を立てて、検証してみたいと思います。 上に述べたように全くの初心者で、あまり感覚が分からないのですがマイコンのハード不良というのはよくありうることなのでしょうか? 重ねての質問で申し訳ありませんがよろしくお願いします。