プログラムは、ここです。
サンプリング周波数は、C言語で書いても、125KHzでした。
すんなり、出来た訳ではありません。
AD変換器等、外部周辺機器は、デフォルトでは、動作しないように、なっているのです。
MST.CR2.BIT._AD0=0;
これを入れないと、AD変換器が動作しません! (もっと、ハードウェアマニュアルを、しっかり読まんと、あかんわ...)
これを、理解するのに、3,4日、もやもやして居りました...
まあ、良しです。
AD0の割り込みを使ってみようとすると、
Htermが、うまく動作しませんでした。
AD0の割り込みを指定しているのに、
Htermでは、「A/D1 interruput occur!」と出て、A/D0のインタラプトにならないのです。
それではと、A/D1のインタラプトに、プログラムを書いても、動作しないのです...
ヴェクターアドレスも、
こう言う関数を設定して
#pragma inline_asm(setVect)
void setVect(unsigned x,unsigned* y )
{
mov.l r5,@r4
}
[HEW3のインラインアセンブラでは、最初の変数から、順番に
自動的に、R4からR5,R6と、割り当てられるので、便利です。]
INT_AD1のアドレスを設定してるのですが...
a =0x224+0xFFFFD160;
setVect(a,(void*)INT_ADI1);
何故か、動きません...
割り込みプログラムは、GCC developer lite の場合、楽です。
各ヘッダーファイルに、割り込みの原型が書いてありますから
その名前の通りの関数に、割り込みプログラムを書くと
それだけて、割り込みできます、楽チンやわあ。
勿論。7047Fの場合は
1.割り込みコントローラ(INTC)を設定する。
割り込みコントローラ(INTC)は、割り込み要因の優先順位を判定し、CPU への割り込み要求を制御します。
GCCのSHの場合は
割り込みマスク処理関数 SetSRReg が、定義済みですので
SetSRReg(0);
等に、設定します。
私は、この事に気付かないで、自前で、簡易的に作りましたけど...
void set_imask(char x )
{
asm("mov.b %0,r4\n"
"ldc r4,sr"::"m"(x) );
}
を作っておいて
set_imask(0); //割り込みビットマスクを0に設定しておく。AD0割り込みPriority=12(0xC)
\lbrack GCCのH8の場合は
EI(割り込み許可)、DI(割り込み禁止)が定義済みです。]
2.割り込みコントローラに設定した値より大きい値(1〜H'F)を、
該当する、インタラプトプライオリティレジスタA、D〜I、K
(IPRA、IPRD〜IPRI、IPRK)に設定します。
A/D変換なら、IPRG15〜IPRG12の4ビットに1〜H'Fの値を設定します。
A/D変換の場合なら
INTC.IPRG.BIT._AD01=0xC;//AD0 priority=12
これで割り込めます。
漸化式のsin波の発生で、DACへ送る値が0〜1024の範囲に入るか?
の確認のために
以下のプログラムを書いてみましたが
SH2のエミュレーションをGDBデバッガで、調べてみようとしましたが
OKを押し,RUNを押し
mulatorを選択すると
エラーが出ます。
GDBのメニューから、FileOpenを選び
「はい」を選び
当該のexeファイルを開くのです。
そして、RUNしましょう。
何と!、動きよるのです...
後は、ステップ等を選ぶと、他のウィンドも連動して値が変わります、バンザイ!
エミュレーションしか、GDBの使い方は、解りませぬが...
5.漸化式方式で、ツートーンジェネレータができる?
この漸化式方式で、2波同時に出力してみました。
単に、続けて出力しただけです。
負荷は50Ωです。
1KHzと3KHz(設定値)の2波を出力してみましたが、結構きれいです。(フィルタも、何も通さない割には...)
設定の周波数(1,3KHZ)より、かなり下がっていますが
C言語ではなくて、
アセンブリ言語で書けば、たぶん、設定周波数に近いものに、なるでしょう。
H15.12.10
This document created by Scientific Notebook 4.1. この文書は次の製品で作成しました Scientific Notebook 4.1.