8051の外部割り込みを有効にする方法は?
2 に答える
8051の各割り込みは、割り込みイネーブル()特殊機能レジスタ(SFR)に独自のビットを持ちIE
、対応するビットを設定することで有効になります。以下のコード例は、何が起こっているかについての一般的な考え方を提供するために、8051アセンブリとCにあります。
外部割り込み0(EX0
)を有効にするには、のビット0を設定する必要がありますIE
。
SETB EX0
または ORL IE,#01
または MOV IE,#01
外部割り込み1(EX1
)を有効にするには、のビット3を設定する必要がありますIE
。
SETB EX1
または ORL IE,#08
または MOV IE,#08
IE
次に、グローバル割り込みイネーブル/ディセーブルビット()であるのビット7を設定して、割り込みをグローバルに有効にする必要がありますEA
。IP
必要に応じて、割り込み優先度( )SFRを介して外部割り込みの優先度を高く設定できます。
SETB EA
また ORL IE,#80
Cの例:
#define IE (*(volatile unsigned char *)0xA8)
#define BIT(x) (1 << (x))
...
IE &= ~BIT(7); /* clear bit 7 of IE (EA) to disable interrupts */
...
IE |= BIT(0); /* set bit 0 of IE (EX0) to enable external interrupt 0 */
...
IE |= BIT(1); /* set bit 3 of IE (EX1) to enable external interrupt 1 */
...
IE ^= BIT(7) /* toggle bit 7 of IE (EA) to re-enable interrupts */
また
IE = 0x89; /* enable both external interrupts and globally enable interrupts */
さまざまな8051Cコンパイラベンダーは、多くの場合、割り込み関数を設定する独自の方法を定義しています。特定のコンパイラのドキュメントを参照する必要がある場合があります。
Keil C51コンパイラ(アプリケーションノートへのpdfリンク)を使用して割り込み関数を定義するには、割り込み番号とレジスタバンクを指定します。ここで、割り込み番号は特定の割り込みベクタアドレスに対応します。
void my_external_interrupt_0_routine(void) interrupt 0 using 2
{
/* do something */
}
8051 IAR C / C ++コンパイラ(icc8051)(リファレンスガイドへのpdfリンク)を使用して割り込み関数を定義するには、__interrupt
キーワードと#pragma vector
ディレクティブを使用できます。
#pragma vector=0x03
__interrupt void my_external_interrupt_0_routine(void)
{
/* do something */
}
8051を初めて使用する場合は、 www.8052.comに豊富な情報があります。また、8052.comのウェブマスター兼作者であるCraig Steinerによって書かれた8051/8052マイクロコントローラー:アーキテクチャ、アセンブリ言語、およびハードウェアインターフェイスもお勧めします。
IEレジスタの外部割り込みの対応するビットを有効にします。レベルトリガーの場合は、この割り込みに適したサブルーチンを作成するか、エッジトリガー割り込みに対応するTCONレジスタビットを有効にします(INT0またはINT1)。