ArduinoUNOのCPU ATmega328Pの内部・外部割込み

UNO-ATmega328

ATmega328P内部割込みについて

ATmega328Pマイクロコントローラには、複数の内部割り込みがあります。これらは、特定の内部イベントや条件が満たされたときに発生します。内部割り込みを使用することで、タイマーのオーバーフロー、シリアル通信の完了、アナログ-デジタル変換の完了など、さまざまな内部プロセスの完了や特定の状態の変化をプログラムで捉えて処理することができます。以下に、ATmega328Pで利用可能な主要な内部割り込みの例をいくつか挙げます。

タイマー/カウンター割り込み

タイマーオーバーフロー割り込み: タイマー/カウンターが最大値に達してオーバーフローしたときに発生します。これを利用して、一定間隔で特定のタスクを実行することができます。
タイマー比較マッチ割り込み: タイマーの値が事前に設定した比較マッチレジスタの値と一致したときに発生します。PWM信号の生成や、より精密なタイミング制御に利用されます。

ADC(アナログ-デジタルコンバータ)割り込み

ADC変換完了割り込み: アナログ値のデジタルへの変換が完了したときに発生します。これにより、変換結果を即座に読み取り、処理することが可能になります。

USART(シリアル通信)割り込み

USART受信完了割り込み: シリアル通信経由でデータが受信され、受信バッファに格納されたときに発生します。
USART送信完了割り込み: 送信バッファが空になり、新たなデータの送信が可能になったときに発生します。

外部割り込み

これは内部割り込みではありませんが、外部からのイベントに反応するために重要です。INT0やINT1などのピンの状態変化を検出するために使用されます。

ウォッチドッグタイマー割り込み

ウォッチドッグタイマー満了割り込み: システムが予期せずハングアップした場合に、ウォッチドッグタイマーが満了するとシステムをリセットする前に割り込みが発生します。これにより、エラーの記録や回復処理を実行することができます。

ATmega328Pの外部割り込みについて

ATmega328Pマイクロコントローラは、外部割り込みを扱うための特定の機能を備えています。外部割り込みを使用すると、特定のイベントが発生したとき(例えば、ピンの状態の変化など)に、マイクロコントローラが現在実行中のタスクを一時中断し、特定の割り込み処理ルーチン(ISR: Interrupt Service Routine)を実行することができます。これにより、リアルタイムでの反応や、特定のイベントの高速な検出と処理が可能になります。

ATmega328Pの外部割り込みの種類

ATmega328Pは、以下の外部割り込みソースをサポートしています

INT0とINT1: これらは、それぞれデジタルピンD2(PD2)とD3(PD3)にマップされる2つの専用外部割り込みです。これらの割り込みは、ピンの状態の変化(立ち上がりエッジ、立ち下がりエッジ、両エッジ、または低レベル)を検出するように設定することができます。

PCINT0からPCINT23: これらはピン変更割り込みと呼ばれ、ATmega328P上のほぼすべてのピンで変化を検出することが可能です。これらは3つのグループ(PCINT0-7、PCINT8-14、PCINT16-23)に分けられ、各グループは特定の割り込みベクターにマッピングされます。ピン変更割り込みは、ピンの状態が変わった時にのみトリガーされ、どのピンが変わったかはソフトウェアで判定する必要があります。

複数の内部割込み

ATmega328Pマイクロコントローラには、複数の内部割り込みがあります。これらは、特定の内部イベントや条件が満たされたときに発生します。内部割り込みを使用することで、タイマーのオーバーフロー、シリアル通信の完了、アナログ-デジタル変換の完了など、さまざまな内部プロセスの完了や特定の状態の変化をプログラムで捉えて処理することができます。以下に、ATmega328Pで利用可能な主要な内部割り込みの例をいくつか挙げます。

外部割り込みの設定方法

外部割り込みを設定するには、以下のステップに従います:

割り込みマスクレジスタ(EIMSK)を使用して、特定の外部割り込み(INT0、INT1)を有効または無効にします。

割り込みセンスコントロール(ISC)ビットを外部割り込み制御レジスタ(EICRA)で設定し、割り込みをトリガーするイベントのタイプ(立ち上がりエッジ、立ち下がりエッジなど)を指定します。

ピン変更割り込みの場合、ピン変更割り込みマスクレジスタ(PCMSK0、PCMSK1、PCMSK2)を使用して、どのピンが割り込みをトリガーするかを指定します。

割り込みサービスルーチン(ISR)**を定義して、割り込みが発生したときに実行される処理を記述します。


以下は、INT0を立ち上がりエッジでトリガーする外部割り込みを設定し、割り込みが発生したときに実行される簡単なISRの例です:

#include <avr/io.h>
#include <avr/interrupt.h>
ISR(INT0_vect) {
// 割り込みがトリガーされたときに実行される処理
// 例えば、LEDのON/OFFを切り替えるなど
int main(void) {
// LEDを接続したピンを出力として設定
DDRB |= (1 << PB0); // PB0ピンを出力に設定
// 外部割り込みINT0を立ち上がりエッジでトリガーするように設定
EICRA |= (1 << ISC01) | (1 << ISC00); // INT0のトリガー条件を立ち上がりエッジに設定 EIMSK |= (1 << INT0); // INT0割り込みを有効化
// グローバル割り込みを有効化
sei();
while (1) {
// メインループ内では特に処理を行わない
}

 

 

コメント

タイトルとURLをコピーしました