松林さん > 割り込みルーチンでは,当初, > 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回させていますので、この部分は明らかに無駄か と思います。 また、山中さんもご指摘のように、このような応答性を要求され る割り込みルーチンの記述はアセンブラなどを使ってできるだ け軽くするのが効果があります。この場合は、特にアドレス指定 の方法がもっと工夫できるはずです。 尚、配列のサイズが大きくなったからと言っても、直ちにとアクセ ス時間が長くかかることはないと思います。但し、サイズが小さく ても多元配列の場合は次元の数だけ配列のアドレスを指定(計算) しなければなりませんから、その分は処理時間が延びます。 鈴木