松林さん
> 割り込みルーチンでは,当初,
> void interrupt_timer0(void)
> {
> DA.DR0=dat[ratio][ampR][count%divNum];
> DA.DR1=dat[ratio][ampL][count%divNum];
> count++;
> }
> などとしていたのですが,周波数を上げていくと,
> 割り込みが間に合わなくなってしまいました。
割り込み処理の中身はこれだけでしょうか?
これが間に合わないとすれば
count % divNum
の計算がネックになっていると推測されます。
コンパイラにもよると思いますが、%の計算に意外に時間が
掛かるのかも知れません。
適当なタイマをフリーランニングさせ、割り込みの入口と出口
でカウント値の差を取ってみればほぼ正確な処理時間が判る
と思います。
どうしても%で計算しなければなりませんか?
0〜64の範囲内で順次増加して良いならもっと簡単な指定が
できると思われます。
(countの意味が判らないので間違っているかも知れません)
また、DA.DR0とDA.DR1で配列のアドレス計算の部分は、全く
同じ計算を2回させていますので、この部分は明らかに無駄か
と思います。
また、山中さんもご指摘のように、このような応答性を要求され
る割り込みルーチンの記述はアセンブラなどを使ってできるだ
け軽くするのが効果があります。この場合は、特にアドレス指定
の方法がもっと工夫できるはずです。
尚、配列のサイズが大きくなったからと言っても、直ちにとアクセ
ス時間が長くかかることはないと思います。但し、サイズが小さく
ても多元配列の場合は次元の数だけ配列のアドレスを指定(計算)
しなければなりませんから、その分は処理時間が延びます。
鈴木