今、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); //何もしない
}
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
>マイコンのハード不良
どちらかと言うと設定が抜けていて正常に動作してない様に思えるので、
どのイベントがおかしな動作をしているのかの確認のためです。
動作順に確認していくとどこでおかしくなっているのか分かりやすいです。
・タイマは思い通りの周期で割り込み入ってるか
・変数cの値が○○の時のDA出力の値は正しいか
・折り返し地点(c=127)の時のDA出力の値は?
など。
No.3
- 回答日時:
オシロのレンジが不明なので詳しく分かりませんが、
テーブルの前半は綺麗に出力されていそうですよね。
ならば試しに、割り込み周期を長くしたらでしょう?
具体的には、ITU0.GRA =900;を4000位にしてみる、
またはカウンタ入力クロックをもう少し遅くしてみる。
ハードの不良じゃ無いと思うんですよねぇ・・・
チェックするならタイマー割り込みを止めて、
while (1){ //何もしない
DA.DADR0 = sindata[c]; //サイン波形データ出力
c+=1;
if(c>127)
c=0;
}
これでどうなるかですね。
No.2
- 回答日時:
あまりたいしたアドバイスは出来ないですが、、、
何故か値がオーバーフローしてしまってマイナス値で動作しているような雰囲気です。
割り込みやif文は正常に動作してますか?
それぞれの処理発行時にGPIOへ信号出力して、正常に処理されているか検証されてはいかがでしょうか。
なるほど。。。つまりマイコン自体のハード的な不良かもしれない、と捉えてよろしいのでしょうか?早速実験計画を立てて、検証してみたいと思います。
上に述べたように全くの初心者で、あまり感覚が分からないのですがマイコンのハード不良というのはよくありうることなのでしょうか?
重ねての質問で申し訳ありませんがよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
arduinoで信号間の時間を計測し...
-
成人してから
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
命令について
-
8ビットのデータの、先頭ビット...
-
C言語で128bitの2進数のビット...
-
ライン数とステップ数の違いは?
-
レジストってなんですか?
-
アセンブラ言語がわかりません。
-
fortran
-
CASLIIでかけ算
-
アセンブラからC言語に変換する...
-
昔のゲーム製作に使用する言語...
-
C言語のビット演算子について
-
verilog 符号付加減算(最上位...
-
素数を求めるプログラム(アセン...
-
ビットシフトってどんな時使うの?
-
程度の低い質問で申し訳ないの...
-
アセンブラの配列処理
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PICでパルス数をカウントする方法
-
PICでパルス数をカウントし、カ...
-
PICマイコンを使った分解能1μs...
-
C言語によるウェイト
-
マイコンのCCRのIビット
-
PICの入出力切り替えの時間がプ...
-
入力回数のカウントをする方法
-
シリアル通信のデータ受信につ...
-
H8を利用したPWMのパルス生成に...
-
PICでスピードメーターを作...
-
RTCの通信方法(I2C、S...
-
組み込みマイコンの誤動作について
-
H8/3069Rでパルス時間間隔測定
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
8ビットのデータの、先頭ビット...
-
情報科学の飽和演算、ラップア...
-
ビットシフトってどんな時使うの?
-
ライン数とステップ数の違いは?
-
アセンブラからC言語に変換する...
おすすめ情報