| INT0、INT1 | PCINT0~PCINT23 | |
|---|---|---|
| 割込要因 | 上昇端、下降端、両端 ローレベル |
ピン変化 |
| クロックとの関係 | 上昇端、下降端、両端 → クロックに同期 | 非同期 |
| ローレベル → 非同期 | ||
| スリープモードとの関係 | 上昇端、下降端、両端 → アイドルまでOK | アイドルを含む休止までOK |
| ローレベル → アイドルを含む休止までOK |
| - | - | - | - | - | PCIE2 | PCIE1 | PCIE0 |
|---|
| PCIE2 | PCINT16~PCINT23 |
| PCIE1 | PCINT8~PCINT14 |
| PCIE0 | PCINT0~PCINT7 |
| PCINT23 | PCINT22 | PCINT21 | PCINT20 | PCINT19 | PCINT18 | PCINT17 | PCINT16 |
|---|
| - | PCINT14 | PCINT13 | PCINT12 | PCINT11 | PCINT10 | PCINT9 | PCINT8 |
|---|
| PCINT7 | PCINT6 | PCINT5 | PCINT4 | PCINT3 | PCINT2 | PCINT1 | PCINT0 |
|---|
/*
* avr007_PortInterrupt.c
* スイッチ入力をする。
* 外部割込を使って行います。
*スイッチONでLED点灯
*スイッチOFFでLED消灯
*/
#define F_CPU 1000000UL // 1MHz
#include <util/delay.h> // _delay_msを使用するためにインクルードします。
#include <avr/io.h>
#include <avr/interrupt.h> // 割込を行うためにインクルードします。
void InitHard( void); // ポートの初期化及び割込設定
int main(void)
{
InitHard(); // ポートの初期化及び割込設定
sei(); // 全体の割込を許可
while(1)
{
//TODO:: Please write your application code
}
}
void InitHard( void) // ポートの初期化
{
// ポートB初期設定
DDRB = 0xff; // PB7~PB0を出力に設定します。
PORTB = 0; // PB7~PB0に'L'を出力します。
// ポートC初期設定
DDRC = 0x3f; // PC7,PC6は初期(入力)、PC5~PC0を出力に設定します。
PORTC = 0; // PC7~PC0に'L'を出力します。
// ポートD初期設定
DDRD = 0xf0; // PD7~PD4は出力、PD3~PD0は入力に設定します。
PORTD = 0; // PD7~PD0に'L'を出力します。
// PD0=PCINT16 ピン変化割込設定
PCMSK2 |= 1 << PCINT16; // ピン変化マスクレジスタにPCINT16を許可
PCICR |= 1 << PCIE2; // ピン変化レジスタにPCINT16~PCINT23を許可
}
SIGNAL( PCINT2_vect) // ピン変化割込処理
{
_delay_ms(10); // チャタリング10ms待ち
if ( PIND & (1 << PIND0)) // スイッチSW0がOFFならば
{
PORTD &= ~( 1 << PORTD4); // LED4を消灯
}
else // スイッチSW0がON
{
PORTD |= 1 << PORTD4; // LED4を点灯
}
}
これでスイッチ入力は終了です。このプログラムではメイン処理をwhileループでまわしています。割込が入らないときはスリープにすることでマイコンの消費電流を抑止することができます。