Atmel Studio入門:割り込み処理

今回は、8bit AVRマイコンの割り込みについて説明したいと思います。

割り込みとは?

AVRマイコンは、同時に一つの処理しか実行できません。このため、ハードウェアからのトリガーを元に優先すべきサブルーチンを実行する「割り込み」と呼ばれる仕組みが備わっています。良く利用される割り込みの例としては、タイマーやUARTの送受信、コンパレータの判定が変化した時などが挙げられます。

具体的には、次の様なプロセスで割り込みは処理されます。
(1)割り込み要求IRQ(Interrupt Request)が周辺回路から発行される。
(2)次に実行予定であったアドレスをスタックに格納する。
(3)現在実行中の命令を完了させる。
(4)割り込み処理ルーチンISR(Interrupt Service Routine) に制御を移す。
(5)割り込み処理終了後、本来実行予定であった(2)のプロセスに戻る。

以上が割り込み処理の簡単なイメージですが、実際はステータス・レジスタや汎用レジスタも保存や復帰も伴い複雑なものとなります。ですがプログラムを記述する上では、次項の例の様に、そこまで意識する必要はありません。

割り込み処理のサンプル・コード

割り込み処理の例としては、次の様なコードが挙げられます。

//Example: Interrupt
//Target Device: ATmega328
//Author: easy labo
//Created: 2014.11.02

#include 

volatile unsigned char timerCountMax = 10;
volatile unsigned char timerCountUp = 0;

ISR(TIMER1_COMPA_vect){
   if(timerCountUp >= timerMax){
      timerCountUp = 0;
   }else{
   timerCountUp++;
   }
}

通常、割り込み処理内容の記述には、マクロISRを使用します。ISRの引数に、_vectで割り込みベクタを指定します。この指定を選択する事で、様々な種類の割り込み制御を行う事ができます。ISRの中に記述してある内容が実際に割り込みが発生した際に行う処理となります。この例では、カウントアップ・タイマを構成しています。

割り込みベクタの種類と優先度

割り込みベクタの種類を次表に、まとめておきます。

Vector No.SymbolInterrupt Definition
1-Reset Pin, Power-on Reset, etc.
2INT0_vectExternal Interrupt Request 0
3INT1_vectExternal Interrupt Request 1
4PCINT0_vectPin Change Interrupt Request 0
5PCINT1_vectPin Change Interrupt Request 1
6PCINT2_vectPin Change Interrupt Request 2
7WDT_vectWatchdog Time-out Interrupt
8TIMER2_COMPA_vectTimer/Counter2 Compare Match A
9TIMER2_COMPB_vectTimer/Counter2 Compare Match B
10TIMER2_OVF_vectTimer/Counter2 Overflow
11TIMER1_CAPT_vectTimer/Counter1 Capture Event
12TIMER1_COMPA_vectTimer/Counter1 Compare Match A
13TIMER1_COMPB_vectTimer/Coutner1 Compare Match B
14TIMER1_OVF_vectTimer/Counter1 Overflow
15TIMER0_COMPA_vectTimer/Counter0 Compare Match A
16TIMER0_COMPB_vectTimer/Counter0 Compare Match B
17TIMER0_OVF_vectTimer/Counter0 Overflow
18SPI_STC_vectSPI Serial Transfer Complete
19USART_RX_vectUSART Rx Complete
20USART_UDRE_vectUSART, Data Register Empty
21USART_TX_vectUSART, Tx Complete
22ADC_vectADC Conversion Complete
23EE_READY_vectEEPROM Ready
24ANALOG_COMP_vectAnalog Comparator
25TWI_vect2-wire Serial Interface
26SPM_READY_vectStore Program Memory Ready

AVRマイコンが同時に一つの処理しか実行できないのは、割り込み処理においても同様です。その為、競合した場合は通常、ベクタ番号(Vector No.)の小さいものが優先して処理されます。すなわち割り込み頻度を均等化する様な基本機能は備わっていない事になります。

割り込みの許可と禁止

ISRで割り込み処理を記述しただけでは、割り込み処理は行われません。

//Example: Set or Clear Interrupts
//Target Device: ATmega328
//Author: easy labo
//Created: 2014.11.15

#include 

sei(); //Set Interrupts
cli(); //Clear Interrupts

割り込み許可sei()と、割り込み禁止でcli()で、割り込みの許可と禁止を行います。またUART(USART)やタイマなどの設定レジスタに割り込みを有効化する
ビットがあるので、データシートで確認して設定しておく必要があります。

割り込みとメイン処理間のデータ受渡し

割り込み処理とメイン処理間でデータを受渡しした場合は、volatileを付けた変数を宣言して、それを介してデータの受け渡しをします。サンプルコードでも利用しています。ちなみに、volatileをつけた変数については、コンパイラは最適化を行いません。

→その他のAtmelマイコン関連情報

Sponsored Link