レス,ありがとうございます。いろいろなご提案本当に多謝です。
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