#include <7047.h>
void InitSH(void)
{
PFC.PECRL1.WORD=0;
PFC.PECRL2.WORD=0;
PFC.PEIORL.WORD=0xFFFF;//PE I/O 書き出しモード
PFC.PACRL2.WORD=0;
PFC.PAIORL.WORD=0xFFFF;
PFC.PBCR1.BIT.PB5MD=0; //PB=出力
PFC.PBCR2.BIT.PB5MD=0;
PFC.PBCR1.WORD=0;
PFC.PBIOR.BIT.B5=1;
PFC.PBIOR.WORD=0XFFFF;
PFC.PDIORL.WORD=0xFFFF;
MST.CR2.BIT._AD0=0; // この設定がないと、AD変換器が動かない
AD0.ADCR.BIT.ADST=0;
AD0.ADCR.BYTE=0;
AD0.ADCSR.BYTE=0;
AD0.ADCR.BIT.CKS=0x3;
AD0.ADCR.BIT.ADST=1; //start AD
}
#define N 81 //firのタップ数 奇数にする
short fir[N]={
//; ----------------------------------------------------------
//;81taps Q10 Band(1) Low:0.00000 High:0.10000 R= -141.8897
//; Band(2) Low:0.20000 High:0.30000 R= 6.98759E-07
//; Band(3) Low:0.40000 High:0.50000 R= -141.8897
//;----------------------------------------------------------
0,0,0,0,
0,0,0,0,
0,1,0,-1,
1,-2,0,3,
-2,1,-1,-7,
5,2,2,12,
-13,-9,3,-13,
28,20,-21,7,
-47,-30,75,6,
63,31,-313,-21,
442,-21,-313,31,
63,6,75,-30,
-47,7,-21,20,
28,-13,3,-9,
-13,12,2,2,
5,-7,-1,1,
-2,3,0,-2,
1,-1,0,1,
0,0,0,0,
0,0,0,0,
0
};
short data_up[N]={0};
short data_low[N]={0};
short data=0;
inline void kakunou(unsigned char j,short data3,unsigned char k)
{
data_up[k-1-j]=data3; //下から格納する
data_low[k-1-j]=data3; //同じ
}
inline void clrmac(void)
{
asm("clrmac");
}
int macw( short *a,short *b )
{
int c;
asm("mov.l %0,r2\n"
"mov.l %1,r3"::"m" (a),"m" (b)
);
asm(".rept 81\n" //ここのNだけは、手動で変える事
"mac.w @r2+,@r3+\n"
".endr");
asm("sts MACL,r4\n" //積和MACの下位だけr4に移す。MACHに溢れたら、どうするんや?
"mov.l r4,%0":"=m" (c));
return c; //int Cを返す
}
int data_chukan=0;
unsigned char i=0;
int main(void)
{
InitSH();
i=0;
while(1)
{
PE.DRL.BIT.B12=1; //DA変換器用タイミング
if (AD0.ADCSR.BIT.ADF)
{
AD0.ADCSR.BIT.ADF=0;
AD0.ADCR.BIT.ADST=0;
data=AD0.ADDR0.WORD;
data -=0x82C0;//無入力時のAD0の値
data=data>>6;//上位10ビットが有効
kakunou(i,data,N);
data_chukan=macw(
(data_up+N-1-i),fir);
clrmac();
data=(data_chukan>>10); //ここの出力が、要調整?
data +=0x82C0;//無入力時のAD0の値を足す
PE.DRL.WORD =data;
i++;
if( i==N) i=0;
AD0.ADCR.BIT.ADST=1;
}
PE.DRL.BIT.B12=0; //DA変換器用タイミング
}
return 1;
}