この章では、ATmega48/88/168で行われる割込みの詳細仕様について説明します。 AVRの割込み処理の一般的な解説については、「リセットと割込み処理」(p.14)を参照してください。
ATmega48、ATmega88、ATmega168では割込みベクトルは、下記の相違点を除いて、おおよそ同じになっています。
Table 11-1. ATmega48のリセット・ベクトルおよび割込みベクトル
ベクトル番号 | アドレス | 割込み要因信号 | 割込み処理の定義内容 |
---|---|---|---|
1 | 0x000 | RESET | 外部リセット端子、パワーオン・リセット、ブラウン・アウト・リセットおよびウォッチドッグ・システム・リセット |
2 | 0x001 | INT0 | 外部割込みリクエスト0 |
3 | 0x002 | INT1 | 外部割込みリクエスト1 |
4 | 0x003 | PCINT0 | 端子変更割込みリクエスト0 |
5 | 0x004 | PCINT1 | 端子変更割込みリクエスト1 |
6 | 0x005 | PCINT2 | 端子変更割込みリクエスト2 |
7 | 0x006 | WDT | ウォッチドッグ・タイムアウト割込み |
8 | 0x007 | TIMER2 COMPA | タイマー/カウンター2 コンペア・マッチA |
9 | 0x008 | TIMER2 COMPB | タイマー/カウンター2 コンペア・マッチB |
10 | 0x009 | TIMER2 OVF | タイマー/カウンター2 オーバーフロー |
11 | 0x00A | TIMER1 CAPT | タイマー/カウンター1 キャプチャ・イベント |
12 | 0x00B | TIMER1 COMPA | タイマー/カウンター1 コンペア・マッチA |
13 | 0x00C | TIMER1 COMPB | タイマー/カウンター1 コンペア・マッチB |
14 | 0x00D | TIMER1 OVF | タイマー/カウンター1 オーバーフロー |
15 | 0x00E | TIMER0 COMPA | タイマー/カウンター0 コンペア・マッチA |
16 | 0x00F | TIMER0 COMPB | タイマー/カウンター0 コンペア・マッチB |
17 | 0x010 | TIMER0 OVF | タイマー/カウンター0 オーバーフロー |
18 | 0x011 | SPI, STC | SPI シリアル送信完了 |
19 | 0x012 | USART, RX | USART 受信完了 |
20 | 0x013 | USART, UDRE | USART, データ・レジスタ・エンプティ |
21 | 0x014 | USART, TX | USART, 送信完了 |
22 | 0x015 | ADC | A/Dコンバータ 変換完了 |
23 | 0x016 | EE READY | EEPROM レディ |
24 | 0x017 | ANALOG COMP | アナログ・コンパレータ |
25 | 0x018 | TWI | 2線式シリアル・インターフェース |
26 | 0x019 | SPM READY | ストア・プログラム・メモリ・レディ |
ATmega48において、もっとも典型的で一般的に用いられるリセット・ベクトルと割込みベクトルアドレスの設定は下記のようなものです。
アドレス ラベル コード コメント 0x000 rjmp RESET ; リセット処理ルーチン 0x001 rjmp EXT_INT0 ; IRQ0 処理ルーチン 0x002 rjmp EXT_INT1 ; IRQ1 処理ルーチン 0x003 rjmp PCINT0 ; PCINT0 処理ルーチン 0x004 rjmp PCINT1 ; PCINT1 処理ルーチン 0x005 rjmp PCINT2 ; PCINT2 処理ルーチン 0x006 rjmp WDT ; ウォッチドッグ・タイマー 処理ルーチン 0x007 rjmp TIM2_COMPA ; タイマー2 Compare A 処理ルーチン 0x008 rjmp TIM2_COMPB ; タイマー2 Compare B 処理ルーチン 0x009 rjmp TIM2_OVF ; タイマー2 Overflow 処理ルーチン 0x00A rjmp TIM1_CAPT ; タイマー1 Capture 処理ルーチン 0x00B rjmp TIM1_COMPA ; タイマー1 Compare A 処理ルーチン 0x00C rjmp TIM1_COMPB ; タイマー1 Compare B 処理ルーチン 0x00D rjmp TIM1_OVF ; タイマー1 Overflow 処理ルーチン 0x00E rjmp TIM0_COMPA ; タイマー0 Compare A 処理ルーチン 0x00F rjmp TIM0_COMPB ; タイマー0 Compare B 処理ルーチン 0x010 rjmp TIM0_OVF ; タイマー0 Overflow 処理ルーチン 0x011 rjmp SPI_STC ; SPI 送信完了 処理ルーチン 0x012 rjmp USART_RXC ; USART, RX完了 処理ルーチン 0x013 rjmp USART_UDRE ; USART, UDRエンプティ 処理ルーチン 0x014 rjmp USART_TXC ; USART, TX完了 処理ルーチン 0x015 rjmp ADC ; A/Dコンバータ 変換完了 処理ルーチン 0x016 rjmp EE_RDY ; EEPROM レディ 処理ルーチン 0x017 rjmp ANA_COMP ; アナログ・コンパレータ 処理ルーチン 0x018 rjmp TWI ; 2線式シリアル・インターフェース 処理ルーチン 0x019 rjmp SPM_RDY ; ストア・プログラム・メモリ・レディ 処理ルーチン ; 0x01A RESET: ldi r16, high(RAMEND) ; メイン・プログラムの先頭 0x01B out SPH,r16 ; スタックポインタをRAMENDにセット 0x01C ldi r16, low(RAMEND) 0x01D out SPL,r16 0x01E sei ; 割込みを許可 0x01F <instr> xxx ... ... ... ...
Table 11-2. ATmega88のリセット・ベクトルおよび割込みベクトル
ベクトル番号 | アドレス | 割込み要因信号 | 割込み処理の定義内容 |
---|---|---|---|
1 | 0x000 | RESET | 外部リセット端子、パワーオン・リセット、ブラウン・アウト・リセットおよびウォッチドッグ・システム・リセット |
2 | 0x001 | INT0 | 外部割込みリクエスト0 |
3 | 0x002 | INT1 | 外部割込みリクエスト1 |
4 | 0x003 | PCINT0 | 端子変更割込みリクエスト0 |
5 | 0x004 | PCINT1 | 端子変更割込みリクエスト1 |
6 | 0x005 | PCINT2 | 端子変更割込みリクエスト2 |
7 | 0x006 | WDT | ウォッチドッグ・タイムアウト割込み |
8 | 0x007 | TIMER2 COMPA | タイマー/カウンター2 コンペア・マッチA |
9 | 0x008 | TIMER2 COMPB | タイマー/カウンター2 コンペア・マッチB |
10 | 0x009 | TIMER2 OVF | タイマー/カウンター2 オーバーフロー |
11 | 0x00A | TIMER1 CAPT | タイマー/カウンター1 キャプチャ・イベント |
12 | 0x00B | TIMER1 COMPA | タイマー/カウンター1 コンペア・マッチA |
13 | 0x00C | TIMER1 COMPB | タイマー/カウンター1 コンペア・マッチB |
14 | 0x00D | TIMER1 OVF | タイマー/カウンター1 オーバーフロー |
15 | 0x00E | TIMER0 COMPA | タイマー/カウンター0 コンペア・マッチA |
16 | 0x00F | TIMER0 COMPB | タイマー/カウンター0 コンペア・マッチB |
17 | 0x010 | TIMER0 OVF | タイマー/カウンター0 オーバーフロー |
18 | 0x011 | SPI, STC | SPI シリアル送信完了 |
19 | 0x012 | USART, RX | USART 受信完了 |
20 | 0x013 | USART, UDRE | USART, データ・レジスタ・エンプティ |
21 | 0x014 | USART, TX | USART, 送信完了 |
22 | 0x015 | ADC | A/Dコンバータ 変換完了 |
23 | 0x016 | EE READY | EEPROM レディ |
24 | 0x017 | ANALOG COMP | アナログ・コンパレータ |
25 | 0x018 | TWI | 2線式シリアル・インターフェース |
26 | 0x019 | SPM READY | ストア・プログラム・メモリ・レディ |
注意:
Table 11-3 にリセット・ベクトルと割込みベクトルの配置が、BOOTRSTヒューズ・ビットとIVSELビットの設定によってどのように変わるかを示します。もし、プログラム中でまったく割込み要因を有効にしない場合、割込みベクトルは使用されないため、この領域には通常のプログラム・コードを配置することができます。リセット・ベクトルがアプリケーション領域に、割込みベクトルがブートローダー領域にある場合、または、その逆の場合についても同様です。
Table 11-3. ATmega88におけるリセット・ベクトルと割込みベクトルの配置(1)
BOOTRST | IVSEL | リセット・アドレス | 割込みベクトル先頭アドレス |
---|---|---|---|
1 | 0 | 0x000 | 0x001 |
1 | 1 | 0x000 | ブート・リセット・アドレス + 0x001 |
0 | 0 | ブート・リセット・アドレス | 0x001 |
0 | 1 | ブート・リセット・アドレス | ブート・リセット・アドレス + 0x001 |
注意: 1. ブート時リセット・アドレスについては、Table 26-6 (p.280)に記載されています。BOOTRSTヒューズ・ビットについては、「1」はプログラムされていないことを、「0」はプログラムされていることを表します。
ATmega88において、もっとも典型的で一般的に用いられるリセット・ベクトルと割込みベクトルアドレスの設定は下記のようなものです。
アドレス ラベル コード コメント 0x000 rjmp RESET ; Reset 処理ルーチン 0x001 rjmp EXT_INT0 ; IRQ0 処理ルーチン 0x002 rjmp EXT_INT1 ; IRQ1 処理ルーチン 0x003 rjmp PCINT0 ; PCINT0 処理ルーチン 0x004 rjmp PCINT1 ; PCINT1 処理ルーチン 0x005 rjmp PCINT2 ; PCINT2 処理ルーチン 0x006 rjmp WDT ; ウォッチドッグ・タイマー 処理ルーチン 0x007 rjmp TIM2_COMPA ; タイマー2 Compare A 処理ルーチン 0X008 rjmp TIM2_COMPB ; タイマー2 Compare B 処理ルーチン 0x009 rjmp TIM2_OVF ; タイマー2 Overflow 処理ルーチン 0x00A rjmp TIM1_CAPT ; タイマー1 Capture 処理ルーチン 0x00B rjmp TIM1_COMPA ; タイマー1 Compare A 処理ルーチン 0x00C rjmp TIM1_COMPB ; タイマー1 Compare B 処理ルーチン 0x00D rjmp TIM1_OVF ; タイマー1 Overflow 処理ルーチン 0x00E rjmp TIM0_COMPA ; タイマー0 Compare A 処理ルーチン 0x00F rjmp TIM0_COMPB ; タイマー0 Compare B 処理ルーチン 0x010 rjmp TIM0_OVF ; タイマー0 Overflow 処理ルーチン 0x011 rjmp SPI_STC ; SPI 送信完了 処理ルーチン 0x012 rjmp USART_RXC ; USART, RX 完了 処理ルーチン 0x013 rjmp USART_UDRE ; USART, UDR エンプティ 処理ルーチン 0x014 rjmp USART_TXC ; USART, TX 完了 処理ルーチン 0x015 rjmp ADC ; A/Dコンバータ 変換完了 処理ルーチン 0x016 rjmp EE_RDY ; EEPROM レディ 処理ルーチン 0x017 rjmp ANA_COMP ; アナログ・コンパレータ 処理ルーチン 0x018 rjmp TWI ; 2線式シリアル・インターフェース 処理ルーチン 0x019 rjmp SPM_RDY ; ストア・プログラム・メモリ・レディ 処理ルーチン ; 0x01A RESET: ldi r16, high(RAMEND) ; メインプログラム開始 0x01B out SPH,r16 ; スタックポインタをRAMENDに設定 0x01C ldi r16, low(RAMEND) 0x01D out SPL,r16 0x01E sei ; 割込みを許可 0x01F <instr> xxx
BOOTRSTヒューズ・ビットはプログラムされていない、ブートローダー領域のサイズは2Kバイトに設定、どの割込みが有効になるよりも前にMCUCRレジスタのIVSELビットがセットされる、という条件での、ATmega88における最も典型的でよく用いられるリセット・ベクトルと割込みベクトルアドレスの設定は、以下のようになります。
アドレス ラベル コード コメント 0x000 RESET: ldi r16,high(RAMEND) ; メインプログラム開始 0x001 out SPH,r16 ; スタックポインタをRAMENDに設定 0x002 ldi r16,low(RAMEND) 0x003 out SPL,r16 0x004 sei ; 割込みを許可 0x005 <instr> xxx ; .org 0xC01 0xC01 rjmp EXT_INT0 ; IRQ0 処理ルーチン 0xC02 rjmp EXT_INT1 ; IRQ1 処理ルーチン ... ... ... ; 0xC19 rjmp SPM_RDY ; ストア・プログラム・メモリ・レディ 処理ルーチン
BOOTRSTヒューズ・ビットがプログラムされている、ブートローダー領域のサイズは2Kバイトに設定、という条件での、ATmega88における最も典型的でよく用いられるリセット・ベクトルと割込みベクトルアドレスの設定は、以下のようになります。
アドレス ラベル コード コメント .org 0x001 0x001 rjmp EXT_INT0 ; IRQ0 処理ルーチン 0x002 rjmp EXT_INT1 ; IRQ1 処理ルーチン ... ... ... ; 0x019 rjmp SPM_RDY ; ストア・プログラム・メモリ・レディ 処理ルーチン ; .org 0xC00 0xC00 RESET: ldi r16,high(RAMEND) ; メインプログラム開始 0xC01 out SPH,r16 ; スタックポインタをRAMENDに設定 0xC02 ldi r16,low(RAMEND) 0xC03 out SPL,r16 0xC04 sei ; 割込みを許可 0xC05 <instr> xxx
BOOTRSTヒューズ・ビットがプログラムされている、ブートローダー領域のサイズは2Kバイトに設定、どの割込みが有効になるよりも前にMCUCRレジスタのIVSELビットがセットされる、という条件での、ATmega88における最も典型的でよく用いられるリセット・ベクトルと割込みベクトルアドレスの設定は、以下のようになります。
アドレス ラベル コード コメント ; .org 0xC00 0xC00 rjmp RESET ; Reset 処理ルーチン 0xC01 rjmp EXT_INT0 ; IRQ0 処理ルーチン 0xC02 rjmp EXT_INT1 ; IRQ1 処理ルーチン ... ... ... ; 0xC19 rjmp SPM_RDY ; ストア・プログラム・メモリ・レディ 処理ルーチン ; 0xC1A RESET: ldi r16,high(RAMEND) ; メインプログラム開始 0xC1B out SPH,r16 ; スタックポインタをRAMENDに設定 0xC1C ldi r16,low(RAMEND) 0xC1D out SPL,r16 0xC1E sei ; 割込みを許可 0xC1F <instr> xxx
Table 11-4. ATmega168のリセットベクトルおよび割込みベクトル
ベクトル番号 | アドレス | 割込み要因信号 | 割込み処理の定義内容 |
---|---|---|---|
1 | 0x000 | RESET | 外部リセット端子、パワーオン・リセット、ブラウン・アウト・リセットおよびウォッチドッグ・システム・リセット |
2 | 0x002 | INT0 | 外部割込みリクエスト0 |
3 | 0x004 | INT1 | 外部割込みリクエスト1 |
4 | 0x006 | PCINT0 | 端子変更割込みリクエスト0 |
5 | 0x008 | PCINT1 | 端子変更割込みリクエスト1 |
6 | 0x00A | PCINT2 | 端子変更割込みリクエスト2 |
7 | 0x00C | WDT | ウォッチドッグ・タイムアウト割込み |
8 | 0x00E | TIMER2 COMPA | タイマー/カウンター2 コンペア・マッチA |
9 | 0x010 | TIMER2 COMPB | タイマー/カウンター2 コンペア・マッチB |
10 | 0x012 | TIMER2 OVF | タイマー/カウンター2 オーバーフロー |
11 | 0x014 | TIMER1 CAPT | タイマー/カウンター1 キャプチャ・イベント |
12 | 0x016 | TIMER1 COMPA | タイマー/カウンター1 コンペア・マッチA |
13 | 0x018 | TIMER1 COMPB | タイマー/カウンター1 コンペア・マッチB |
14 | 0x01A | TIMER1 OVF | タイマー/カウンター1 オーバーフロー |
15 | 0x01C | TIMER0 COMPA | タイマー/カウンター0 コンペア・マッチA |
16 | 0x01E | TIMER0 COMPB | タイマー/カウンター0 コンペア・マッチB |
17 | 0x020 | TIMER0 OVF | タイマー/カウンター0 オーバーフロー |
18 | 0x022 | SPI, STC | SPI シリアル送信完了 |
19 | 0x024 | USART, RX | USART 受信完了 |
20 | 0x026 | USART, UDRE | USART, データ・レジスタ・エンプティ |
21 | 0x028 | USART, TX | USART, 送信完了 |
22 | 0x02A | ADC | A/Dコンバータ 変換完了 |
23 | 0x02C | EE READY | EEPROM レディ |
24 | 0x02E | ANALOG COMP | アナログ・コンパレータ |
25 | 0x030 | TWI | 2線式シリアル・インターフェース |
26 | 0x032 | SPM READY | ストア・プログラム・メモリ・レディ |
注意:
Table 11-5 にリセット・ベクトルと割込みベクトルの配置が、BOOTRSTヒューズ・ビットとIVSELビットの設定によってどのように変わるかを示します。もし、プログラム中でまったく割込み要因を有効にしない場合、割込みベクトルは使用されないため、この領域には通常のプログラム・コードを配置することができます。リセット・ベクトルがアプリケーション領域に、割込みベクトルがブートローダー領域にある場合、または、その逆の場合についても同様です。
Table 11-5. ATmega168におけるリセット・ベクトルと割込みベクトルの配置(1)
BOOTRST | IVSEL | リセット・アドレス | 割込みベクトル先頭アドレス |
---|---|---|---|
1 | 0 | 0x000 | 0x002 |
1 | 1 | 0x000 | ブート・リセット・アドレス + 0x002 |
0 | 0 | ブート・リセット・アドレス | 0x002 |
0 | 1 | ブート・リセット・アドレス | ブート・リセット・アドレス + 0x002 |
注意: 1. ブート時リセット・アドレスについては、Table 26-6 (p.280)に記載されています。BOOTRSTヒューズ・ビットについては、「1」はプログラムされていないことを、「0」はプログラムされていることを表します。
ATmega168において、もっとも典型的で一般的に用いられるリセット・ベクトルと割込みベクトルアドレスの設定は下記のようなものです。
アドレス ラベル コード コメント 0x0000 jmp RESET ; Reset 処理ルーチン 0x0002 jmp EXT_INT0 ; IRQ0 処理ルーチン 0x0004 jmp EXT_INT1 ; IRQ1 処理ルーチン 0x0006 jmp PCINT0 ; PCINT0 処理ルーチン 0x0008 jmp PCINT1 ; PCINT1 処理ルーチン 0x000A jmp PCINT2 ; PCINT2 処理ルーチン 0x000C jmp WDT ; ウォッチドッグ・タイマー 処理ルーチン 0x000E jmp TIM2_COMPA ; タイマー2 Compare A 処理ルーチン 0x0010 jmp TIM2_COMPB ; タイマー2 Compare B 処理ルーチン 0x0012 jmp TIM2_OVF ; タイマー2 Overflow 処理ルーチン 0x0014 jmp TIM1_CAPT ; タイマー1 Capture 処理ルーチン 0x0016 jmp TIM1_COMPA ; タイマー1 Compare A 処理ルーチン 0x0018 jmp TIM1_COMPB ; タイマー1 Compare B 処理ルーチン 0x001A jmp TIM1_OVF ; タイマー1 Overflow 処理ルーチン 0x001C jmp TIM0_COMPA ; タイマー0 Compare A 処理ルーチン 0x001E jmp TIM0_COMPB ; タイマー0 Compare B 処理ルーチン 0x0020 jmp TIM0_OVF ; タイマー0 Overflow 処理ルーチン 0x0022 jmp SPI_STC ; SPI 送信完了 処理ルーチン 0x0024 jmp USART_RXC ; USART, RX 完了 処理ルーチン 0x0026 jmp USART_UDRE ; USART, UDR エンプティ 処理ルーチン 0x0028 jmp USART_TXC ; USART, TX 完了 処理ルーチン 0x002A jmp ADC ; A/Dコンバータ 変換完了 処理ルーチン 0x002C jmp EE_RDY ; EEPROM レディ 処理ルーチン 0x002E jmp ANA_COMP ; アナログ・コンパレータ 処理ルーチン 0x0030 jmp TWI ; 2線式シリアル・インターフェース 処理ルーチン 0x0032 jmp SPM_RDY ; ストア・プログラム・メモリ・レディ 処理ルーチン ; 0x0033 RESET: ldi r16, high(RAMEND) ; メインプログラム開始 0x0034 out SPH,r16 ; スタックポインタをRAMENDに設定 0x0035 ldi r16, low(RAMEND) 0x0036 out SPL,r16 0x0037 sei ; 割込みを許可 0x0038 <instr> xxx ... ... ... ...
BOOTRSTヒューズ・ビットはプログラムされていない、ブートローダー領域のサイズは2Kバイトに設定、どの割込みが有効になるよりも前にMCUCRレジスタのIVSELビットがセットされる、という条件での、ATmega168における最も典型的でよく用いられるリセット・ベクトルと割込みベクトルアドレスの設定は、以下のようになります。
アドレス ラベル コード コメント 0x0000 RESET: ldi r16,high(RAMEND) ; メインプログラム開始 0x0001 out SPH,r16 ; スタックポインタをRAMENDに設定 0x0002 ldi r16,low(RAMEND) 0x0003 out SPL,r16 0x0004 sei ; 割込みを許可 0x0005 <instr> xxx ; .org 0xC02 0x1C02 jmp EXT_INT0 ; IRQ0 処理ルーチン 0x1C04 jmp EXT_INT1 ; IRQ1 処理ルーチン ... ... ... ; 0x1C32 jmp SPM_RDY ; ストア・プログラム・メモリ・レディ 処理ルーチン
BOOTRSTヒューズ・ビットがプログラムされている、ブートローダー領域のサイズは2Kバイトに設定、という条件での、ATmega168における最も典型的でよく用いられるリセット・ベクトルと割込みベクトルアドレスの設定は、以下のようになります。
アドレス ラベル コード コメント .org 0x0002 0x0002 jmp EXT_INT0 ; IRQ0 処理ルーチン 0x0004 jmp EXT_INT1 ; IRQ1 処理ルーチン ... ... ... ; 0x0032 jmp SPM_RDY ; ストア・プログラム・メモリ・レディ 処理ルーチン ; .org 0x1C00 0x1C00 RESET: ldi r16,high(RAMEND) ; メインプログラム開始 0x1C01 out SPH,r16 ; スタックポインタをRAMENDに設定 0x1C02 ldi r16,low(RAMEND) 0x1C03 out SPL,r16 0x1C04 sei ; 割込みを許可 0x1C05 <instr> xxx
BOOTRSTヒューズ・ビットがプログラムされている、ブートローダー領域のサイズは2Kバイトに設定、どの割込みが有効になるよりも前にMCUCRレジスタのIVSELビットがセットされる、という条件での、ATmega168における最も典型的でよく用いられるリセット・ベクトルと割込みベクトルアドレスの設定は、以下のようになります。
アドレス ラベル コード コメント ; .org 0x1C00 0x1C00 jmp RESET ; Reset 処理ルーチン 0x1C02 jmp EXT_INT0 ; IRQ0 処理ルーチン 0x1C04 jmp EXT_INT1 ; IRQ1 処理ルーチン ... ... ... ; 0x1C32 jmp SPM_RDY ; ストア・プログラム・メモリ・レディ 処理ルーチン ; 0x1C33 RESET: ldi r16,high(RAMEND) ; メインプログラム開始 0x1C34 out SPH,r16 ; スタックポインタをRAMENDに設定 0x1C35 ldi r16,low(RAMEND) 0x1C36 out SPL,r16 0x1C37 sei ; 割込みを許可 0x1C38 <instr> xxx
割込みベクトル・テーブルの配置は、MCUコントロール・レジスタによって設定変更できます。
ビット | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x35 (0x55) | - | - | - | PUD | - | - | IVSEL | IVCE | MCUCR |
Read/Write | R | R | R | R/W | R | R | R/W | R/W | |
初期値 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
IVSELビットがクリア(0に設定)されている場合、割込みベクトルはフラッシュ・メモリ領域の先頭に配置されます。このビットがセット(1に設定)されている場合、割込みベクトルはフラッシュ・メモリのブートローダー領域の先頭に移動されます。ブートローダー領域の先頭アドレスの実際の値はBOOTSZヒューズ・ビットによって決定されます。詳細については、「ブート・ローダーのサポート – 読み書き並行自己プログラミング ATmega88/ATmega168」(p.268)を参照してください。割込みベクトル・テーブルの意図しない変更を防止するため、IVSELビットの変更は次の書き込み手順にしたがって行わなければなりません。
この一連の処理が実行されている間、割込みは自動的に無効になります。IVCEビットがセットされるときに割込みは禁止され、つづくIVSELビットへの書き込みをおこなう命令の実行後まで無効のままとなります。IVSELビットに書き込みが行われない場合でも、割込みは4サイクルの期間無効になります。ステータス・レジスタのIビットの値には、この自動的な割込み禁止動作による影響はありません。
注意: 割込みベクトルがブートローダー領域に配置され、ブート・ロック・ビットBLB02がプログラムされている場合、アプリケーション領域でプログラムが実行されている間、割込みは無効になります。割込みベクトルがアプリケーション領域に配置され、ブート・ロック・ビットBLB12がプログラムされている場合、ブートローダー領域でプログラムが実行されている間、割込みは無効になります。各ブート・ロック・ビットの詳細については、「ブート・ローダーのサポート – 読み書き並行自己プログラミング ATmega88/ATmega168」(p.268)を参照してください。
このビットはATmega48では利用できません。
IVSELビットの変更を有効にするためには、IVCEビットに1を書き込む必要があります。IVCEビットはIVSELビットに書き込みが行われてから4サイクル経過後、ハードウェアによってクリアされます。上記のIVSELビットの説明中に記載したとおり、IVCEビットをセットすることにより割込みが禁止されます。コーディングの例を下記に示します。
アセンブリ言語での例 |
|
C言語での例 |
|
このビットはATmega48では利用できません。