お騒がせしております。 みなさんこんにちは。 貴重なアドバイスを沢山頂きまし
てありがとうございます。
ひやした さんのアドバイスに従って、プログラムを修正しましたら問題が解決致し
ました。オシロで確認したところ、5msecの割り込み中に0.1msecの割り込みが入った
所は処理時間がその分長くなっておりました。
良く分かりませんが、一度割り込みを受け付けると同じレベルの割り込みは正しく受
け入れないような感じでしょうか? 3レベルとはプライオリティレベル0,レベル
1、NMIの事なのでしょうか?
因みに、プログラムは下記の通りでした。
#define EI1 asm("andc.b #0xbf,ccr")
main()
{
...
SYSCR.BIT.UE=0; /* use user bit for mask */
INTC.IPRA.BIT.B2=1; /* set ITU0 priority level 1 */
EI;
...
}
void int_imia0(void) /* 0.1msec interrupt */
{
...
/* current control program. */
...
ITU0.TSR.BIT.IMFA=0;
}
void int_imia1(void) /* 5msec interrupt */
{
EI1;
...
/* velocity control program. */
...
ITU1.TSR.BIT.IMFA=0;
}
on 02.12.12 10:34 AM, Hirashita at iced@xxxxxxxxxxxxxxx wrote:
> ひやしたです。
>
>> 0.1msecのITU0コンペアマッチ割り込み(優先)と 5msecのITU1コンペアマッチ割
>> り込みを使って制御プログラムを開発していますが、ITU1の割り込みの途中でEIを行
>> うとプログラムがおかしな動き?になってしまいます。
>> EIを入れなければ正しく動くのですが、ITU1の割り込み終了までITU0の割り込み処
>> 理が待たされてしまい、制御が上手く行えないのです。
>
> 参考になるかどうかわかりませんが、以前IRQ割り込みの処理が長くかかるときに
> SCIの取りこぼしがあり、そのときに書いたコードです。
> 最終的にはITRONを導入してクリアしたので、もしかしたら
> 検証に問題があったかもしれないのですが、この時点では確か動いていたはず。
> 但しプロセッサは3067、開発環境はイエローソフトです。
>
> ハードウェアの初期化云々をやるルーチンで
> −−−−−−−−−−−−−−−−−−−−−−−−−
> // この時点ではCCRのIビットはセット、UIは不定
> #asm ORC.B #H'C0, CCR ; 全割り込み禁止
> SYSCR &= ~0x08; // UIビットをマスクビットとして使用
> INTC.IER |= 0x10; // IRQ4を許可
> INTC.IPRB = 0x0E; // SCI0,1,2 の割り込み優先順位を上げる
> #asm ANDC.B #H'3F, CCR ; 全割り込み許可
> −−−−−−−−−−−−−−−−−−−−−−−−−−
>
> てなことをやりまして、
>
> /*************************************************************************
> IRQ4割り込み
> **************************************************************************/
> void interrupt irq4()
> {
> INTC.ISR &= ~0x10;
> #asm ANDC.B #H'BF, CCR ;レベル1割り込みを許可
> nagai_syori(); //長い処理
> }
>
> とにかく、H8の多重割り込みの解説を何度も読み返した記憶があります・・・。
>