「ATmega328の割り込みの使用方法」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

ページの作成:「== 概要 == ATmega328の割り込みの使用方法を記載する。 割り込みには、シリアル割り込みやピン入力が変化した時の割り込み等が…」
 
文字列「</source>」を「</syntaxhighlight>」に置換
 
(同じ利用者による、間の3版が非表示)
1行目: 1行目:
== 概要 ==
== 概要 ==
ATmega328の割り込みの使用方法を記載する。
ATmega328の割り込みの使用方法を記載する。<br>
割り込みには、シリアル割り込みやピン入力が変化した時の割り込み等がある。
割り込みには、シリアル割り込みやピン入力が変化した時の割り込み等がある。<br>
ここでは、タイマ割り込みについて記載する。
ここでは、タイマ割り込みについて記載する。<br>
 
<br><br>


== 割り込みの種類 ==
== 割り込みの種類 ==
49行目: 49行目:
</center>
</center>
<br>
<br>
割り込みのタイミングは、ピン入力の変化やタイマで指定した時間の経過、シリアル通信イベント等がある。
割り込みのタイミングは、ピン入力の変化やタイマで指定した時間の経過、シリアル通信イベント等がある。<br>
(上表に記載のない割り込みもある)
(上表に記載のない割り込みもある)<br>
使用したい割り込みのシンボルは、ISR()関数の引数に指定して使用する。
使用したい割り込みのシンボルは、ISR()関数の引数に指定して使用する。<br>
<br><br>
<br><br>


== 割り込み処理の基本 ==
== 割り込み処理の基本 ==
割り込みを許可する命令は、sei命令である。
割り込みを許可する命令は、sei命令である。<br>
割り込み関数(ISR)からmain関数へ戻る命令は、ret命令である。
割り込み関数(ISR)からmain関数へ戻る命令は、ret命令である。<br>
 
<br>
main関数から、割り込み関数(ISR)に処理が移る時、一旦、割り込みが禁止される。
main関数から、割り込み関数(ISR)に処理が移る時、一旦、割り込みが禁止される。<br>
割り込み処理が終わると、割り込みをまた許可しないといけないため、ret命令とsei命令を組み合わせた、reti命令がある。
割り込み処理が終わると、割り込みをまた許可しないといけないため、ret命令とsei命令を組み合わせた、reti命令がある。<br>
reti命令で割り込み処理が終わる。
reti命令で割り込み処理が終わる。<br>
 
<br>
また、割り込みを禁止にするには、cil命令を使用する。
また、割り込みを禁止にするには、cil命令を使用する。<br>
 
<br>
以下に割り込み処理のサンプルコードを記述する。
以下に割り込み処理のサンプルコードを記述する。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <avr/io.h>
  #include <avr/io.h>
  #include <avr/interrupt.h>  // 割り込み処理
  #include <avr/interrupt.h>  // 割り込み処理
91行目: 91行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== タイマ割り込みの使用方法 ==
== タイマ割り込みの使用方法 ==
タイマの割り込みを使用するためのレジスタ設定およびプログラムを記述する。
タイマの割り込みを使用するためのレジスタ設定およびプログラムを記述する。<br>
タイマに関しての記事は、ATmega328でPWMを使用する方法を参照すること。
タイマに関しての記事は、[[ATmega328でのタイマとPWMの使用方法]]を参照すること。<br>
 
<br>
===== タイマ0の割り込み =====
===== タイマ0の割り込み =====
<center>
<center>
115行目: 115行目:
<br>
<br>
以下に、タイマ0でコンペアマッチAで割り込み処理を行うサンプルコードを記述する。<br>
以下に、タイマ0でコンペアマッチAで割り込み処理を行うサンプルコードを記述する。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <avr/io.h>
  #include <avr/io.h>
  #include <avr/interrupt.h>  // 割り込み処理を行うため
  #include <avr/interrupt.h>  // 割り込み処理を行うため
148行目: 148行目:
     return 0;
     return 0;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
===== タイマ1の割り込み =====
===== タイマ1の割り込み =====
 
<center>
{| class="wikitable"
! colspan = "9" | タイマ1割り込みレジスタ TIMSK1
|-
! ビット !! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0
|-
! レジスタ名
| - || - || ICIE1 || - || - || OCIE1B || OCIE1A || TOIE1
|}
</center>
* ICIE1  : タイマ1の捕獲割り込み(タイマ(カウンタ)の値がICR1に達した時の割り込み)
* OCIE1B : タイマ1のコンペアマッチBの割り込み(比較一致Bの割り込み)
* OCIE1A : タイマ1のコンペアマッチAの割り込み(比較一致Aの割り込み)
* TOIE1  : タイマ1のオーバーフロー割り込み
<br>
以下に、タイマ1で捕獲割り込みをするサンプルコードを記述する。<br>
<syntaxhighlight lang="c++">
#include <avr/io.h>
#include <avr/interrupt.h>  // 割り込み処理を行うため
// タイマ1での捕獲割り込み関数(ICR1に達すると割り込み)
ISR(TIMER1_CAPT_vect)
{
    // 処理
}
int main()
{
    // タイマ1 制御レジスタA
    TCCR1A = 0b00000010;  // 高速PWMモード(TOP値 : ICR1)
    // タイマ0 制御レジスタB
    TCCR1B = 0b00011001;  // 高速PWMモードで分周なし
    // タイマ0 割り込み設定
    TIMSK1 = 0b00100000;  // 捕獲割り込みを設定
    // 割り込み発生する時間の設定
    ICR1 = 64999;  // 65.0[ms]@1[MHz]
    // ポートの設定
    // 略
    sei();  // 割り込み許可
    while(1)
    {
      // メイン処理
    }
    return 0;  //プログラム終了
}
</syntaxhighlight>
<br>
<br>
===== タイマ2の割り込み =====
===== タイマ2の割り込み =====
 
<center>
{| class="wikitable"
! colspan = "9" | タイマ2割り込みレジスタ TIMSK2
|-
! ビット !! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0
|-
! レジスタ名
| - || - || - || - || - || OCIE2B || OCIE2A || TOIE2
|}
</center>
<br>
* OCIE2B : タイマ2のコンペアマッチBの割り込み(比較一致Bの割り込み)
* OCIE2A : タイマ2のコンペアマッチAの割り込み(比較一致Aの割り込み)
* TOIE2  : タイマ2のオーバーフロー割り込み
<br>
タイマ2は、タイマ0と同じ使い方なのでサンプルコードは省略する。<br>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:AVR]]
[[カテゴリ:AVR]]