[H8-ML(2626)] Re: 大きな配列をタイマー割り込みで参照
From: Katsushi MATSUBAYASHI <matsu@xxxxxxxxxxxxxx>
Date: 2002年12月27日(金)14時50分23秒
レス,ありがとうございます。いろいろなご提案本当に多謝です。

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    
スレッド概略
[2623(R)](起点)
 └[2625(U)]
   └[表示中]
     ├[2627(1)]
     ├[2634(2)]
     └[2639(3)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]