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); //何もしない
}
補足
無事にRAMに転送し動作させることが出来ました。 具体的にはソースで ITU0.TIER.BIT.IMIEA = 1; が抜けていたこと。 それとGDLでのリンカのスクリプトファイル(h8rom.x等)をRAM用に書き換える際に http://d.hatena.ne.jp/gimme2s/20051114 を参考にしていたのですが、モニタプログラムで「?」としメモリの配置を見ると Monitor Vector 00000 - 000FF Monitor ROM 00100 - 07E65 Monitor RAM FEF10 - FF02F User Vector FF030 - FF12F となっていたので、h8rom.xの最初を MEMORY { vectors : org =0xff000, len =0x100 rom : org =0xff100, len =128k-0x100 ram : org =0xffef10, len =4k eight : org =0xffff00, len =0x100 } にすることで無事動作することが出来ました。 アドレスの設定が間違っていると、書き込めなかったり実行できなかったり、 割り込みが出来なかったりします。 同じH8/3048F+GDL+hterm+RAMに転送という環境で使っている人に 参考になれば幸いです。