レス,ありがとうございます。いろいろなご提案本当に多謝です。 hamayan様のcount++の提案をやってみました。少し早くなりました。 まだ,500*64Hzには僅かに間に合わない(ampRがfの時)です。 #define foreleg 0x69 #define hindleg 0x96 void interrupt_timer0(void) { register unsigned a= (count++ &(divNum-1));/*=count%divNum 高速化*/ register unsigned b= ((a>>4)<<1) + (ampR>>3); DA.DR0=*(adrR+a);/*右足,=adrR[count%divNum];*/ DA.DR1=*(adrL+a);/*左足*/ P1.DR.BIT.B0=( foreleg >> b ); P1.DR.BIT.B1=( hindleg >> b ); } ひやした様wrote >ソースそのままですよね?秋月コンパイラの仕様を知らないのですが、 >割り込み要因のクリアって別の場所で行っているのですよね? > >周期が長ければ動くということで、そんなはずは >無いと思うのですが、確認の為。(^^; >(レス不要です) レスしてしまいました。 スタートアップのアセンブラファイルで,次の様にしています。 .SECTION P, CODE, ALIGN = 2 ;Int Program ITU_0: PUSH.L ER0 PUSH.L ER1 PUSH.L ER2 PUSH.L ER3 PUSH.L ER4 PUSH.L ER5 BCLR #0, @TIER0 ;Stop Int BCLR #0, @TSR0 ;Clear IMFA JSR @_interrupt_timer0 ;Jump C Int Func BSET #0, @TIER0 ;Restart Int POP.L ER5 POP.L ER4 POP.L ER3 POP.L ER2 POP.L ER1 POP.L ER0 RTE ちなみに,大きなテーブル(const unsigned char dat[][][])を 内部ROM上に作る前に,500*64Hzの割り込みに十分間に合っていた, 割り込みルーチンを示します。配列や%演算ばりばりにつかってます。 どうして,これが間に合って,上の10行そこそこのルーチンが間に合わないのか 本当に不思議です。 void interrupt_timer0(void) { if(rl==STRAIGHT){ DA.DR0=data[count%divNum];/*右足*/ DA.DR1=data[count%divNum];/*左足*/ }else if(rl==RIGHT){ if(rot) DA.DR0=data[(count+divNum/2)%divNum];/*右足位相反転*/ else DA.DR0=daCenter;/*右足止める*/ DA.DR1=data[count%divNum];/*左足*/ }else/* if(rl==LEFT)*/{ DA.DR0=data[count%divNum];/*右足*/ if(rot) DA.DR1=data[(count+divNum/2)%divNum];/*左足位相反転*/ else DA.DR1=daCenter;/*左足*/ } if(freq==0){ P1.DR.BIT.B0=1;/*停止中は磁力だけ保持*/ P1.DR.BIT.B1=1; }else if( (count%divNum)<(divNum/4) || (count%divNum)>=(divNum*3/4) ){ if(fb==FORWARD){ P1.DR.BIT.B0=0;/*前足*/ P1.DR.BIT.B1=1;/*後ろ足*/ }else{ P1.DR.BIT.B0=1;/*前足*/ P1.DR.BIT.B1=0;/*後ろ足*/ } }else{ if(fb==FORWARD){ P1.DR.BIT.B0=1;/*前足*/ P1.DR.BIT.B1=0;/*後ろ足*/ }else{ P1.DR.BIT.B0=0;/*前足*/ P1.DR.BIT.B1=1;/*後ろ足*/ } } count++; } // Katsushi MATSUBAYASHI matsu@xxxxxxxxxxxxxx // Associate Professor, Tokyo National College of Technology