「ATmega328の割り込みの使用方法」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「== 概要 == ATmega328の割り込みの使用方法を記載する。 割り込みには、シリアル割り込みやピン入力が変化した時の割り込み等が…」) |
編集の要約なし |
||
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++"> | <source lang="c++"> | ||
#include <avr/io.h> | #include <avr/io.h> | ||
95行目: | 95行目: | ||
== タイマ割り込みの使用方法 == | == タイマ割り込みの使用方法 == | ||
タイマの割り込みを使用するためのレジスタ設定およびプログラムを記述する。 | タイマの割り込みを使用するためのレジスタ設定およびプログラムを記述する。<br> | ||
タイマに関しての記事は、[[ATmega328でのタイマとPWMの使用方法]]を参照すること。<br> | |||
<br> | |||
===== タイマ0の割り込み ===== | ===== タイマ0の割り込み ===== | ||
<center> | <center> |
2019年12月19日 (木) 13:44時点における版
概要
ATmega328の割り込みの使用方法を記載する。
割り込みには、シリアル割り込みやピン入力が変化した時の割り込み等がある。
ここでは、タイマ割り込みについて記載する。
割り込みの種類
ATmega328の割り込みの種類には、以下のようなものがある。
ATmega328の割り込みの種類 | ||
---|---|---|
シンボル | 名前 | 説明 |
INT0_vect | 外部割り込みピン INT0 | 外部ピンの変化で割り込み |
INT1_vect | 外部割り込みピン INT1 | 外部ピンの変化で割り込み |
PCINT0_vect | 外部割り込みピン INT0 | ピンの論理変化割り込みのみサポート PCINT0〜23まである |
TIMER0_COMPA_vect | タイマ0 コンペアマッチA |
タイマ0でコンペアマッチAのとき割り込み |
TIMER0_COMPB_vect | タイマ0 コンペアマッチB |
タイマ0でコンペアマッチBのとき割り込み |
TIMER0_OVF_vect | タイマ0 オーバーフロー |
タイマ0でカウンタ最大値を超えたとき割り込み |
TIMER1_COMPA_vect | タイマ1 コンペアマッチA |
タイマ1でコンペアマッチAのとき割り込み |
TIMER1_COMPB_vect | タイマ1 コンペアマッチB |
タイマ1でコンペアマッチBのとき割り込み |
TIMER1_CAPT_vect | タイマ1 捕獲イベント |
タイマ1でICR1に達したときに割り込み |
TIMER1_OVF_vect | タイマ1 オーバーフロー |
タイマ1でカウンタ最大値を超えたとき割り込み |
TIMER2_COMPA_vect | タイマ2 コンペアマッチA |
タイマ2でコンペアマッチAのとき割り込み |
TIMER2_COMPB_vect | タイマ2 コンペアマッチB |
タイマ2でコンペアマッチBのとき割り込み |
TIMER2_OVF_vect | タイマ2 オーバーフロー |
タイマ2でカウンタ最大値を超えたとき割り込み |
SPI_STC_vect | SPIシリアル転送完了 | SPIシリアル転送完了のとき割り込み |
USART_RX_vect | USART受信完了 | USART(シリアル通信)受信完了のとき割り込み |
USART_UDRE_vect | USART送信可能 | USART(シリアル通信)送信可能のとき割り込み |
USART_TX_vect | USART送信完了 | USART(シリアル通信)送信完了のとき割り込み |
割り込みのタイミングは、ピン入力の変化やタイマで指定した時間の経過、シリアル通信イベント等がある。
(上表に記載のない割り込みもある)
使用したい割り込みのシンボルは、ISR()関数の引数に指定して使用する。
割り込み処理の基本
割り込みを許可する命令は、sei命令である。
割り込み関数(ISR)からmain関数へ戻る命令は、ret命令である。
main関数から、割り込み関数(ISR)に処理が移る時、一旦、割り込みが禁止される。
割り込み処理が終わると、割り込みをまた許可しないといけないため、ret命令とsei命令を組み合わせた、reti命令がある。
reti命令で割り込み処理が終わる。
また、割り込みを禁止にするには、cil命令を使用する。
以下に割り込み処理のサンプルコードを記述する。
#include <avr/io.h>
#include <avr/interrupt.h> // 割り込み処理
// ISR関数とmain関数で使用する変数(コンパイラはこの変数を最適化しない)
volatile unsigned char count;
// 割り込み関数
ISR(TIMER0_OVF_vect) // タイマ0でオーバーフローが起きた時
{
count++;
}
int main()
{
// 割り込み処理を行うためレジスタの設定を行う
//cil(); // 割り込み禁止
sei(); //割り込み許可
while(1)
{
// メイン処理
}
return 0;
}
タイマ割り込みの使用方法
タイマの割り込みを使用するためのレジスタ設定およびプログラムを記述する。
タイマに関しての記事は、ATmega328でのタイマとPWMの使用方法を参照すること。
タイマ0の割り込み
タイマ0割り込みレジスタ TIMSK0 | ||||||||
---|---|---|---|---|---|---|---|---|
ビット | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
レジスタ名 | - | - | - | - | - | OCIE0B | OCIE0A | TOIE0 |
- OCIE0B : タイマ0のコンペアマッチBの割り込み(比較一致Bの割り込み)
- OCIE0A : タイマ0のコンペアマッチAの割り込み(比較一致Aの割り込み)
- TOIE0 : タイマ0のオーバーフロー割り込み
以下に、タイマ0でコンペアマッチAで割り込み処理を行うサンプルコードを記述する。
#include <avr/io.h>
#include <avr/interrupt.h> // 割り込み処理を行うため
ISR(TIMER0_COMPA_vect) // タイマ0 コンペアマッチAの割り込み関数
{
// ..略
}
int main()
{
// タイマ0 制御レジスタA
TCCR0A = 0b10000010; // 10 : コンペアマッチAでLOW、10 : CTCモード
// タイマ0 制御レジスタB
TCCR0B = 0b00000001; // 分周なし
// タイマ0 割り込み設定
TIMSK0 = 0b00000010; // コンペアマッチAの割り込みを設定
// コンペアマッチするタイミング
OCR0A = 32499; // 32.5[ms]でコンペアマッチ@1[MHz]
// ポートの設定
// ..略
sei(); // 割り込み許可
while(1)
{
// メイン処理
}
return 0;
}
タイマ1の割り込み
タイマ2の割り込み