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ループでまわしています。割込が入らないときはスリープにすることでマイコンの消費電流を抑止することができます。